我有一个相当独特的问题。我有一个多元线性回归问题,我的目标是找到这个回归的截距,同时确保系数的总和小于等于1,并且每个系数都不为负。我花了很多时间在网上搜索,并且在这里找到了一个很棒的答案:
下面的代码展示了我是如何使用上面答案中共享的代码输出覆盖回归系数的。此时我的问题/问题是:给定自定义系数,如何计算新的截距值?
from sklearn.datasets import load_bostonX, Y = load_boston(return_X_y=True)from scipy.optimize import minimizeY = y# 定义模型model = lambda b, X: b[0] * X[:,0] + b[1] * X[:,1] + b[2] * X[:,2]# 要最小化的目标函数(最小二乘回归)obj = lambda b, Y, X: np.sum(np.abs(Y-model(b, X))**2)# 边界:b[0], b[1], b[2] >= 0bnds = [(0, None), (0, None), (0, None)]# 约束:b[0] + b[1] + b[2] - 1 = 0cons = [{"type": "eq", "fun": lambda b: b[0]+b[1]+b[2] - 1}]# b[1], b[2], b[3]的初始猜测值:xinit = np.array([0, 0, 1])res = minimize(obj, args=(Y, X), x0=xinit, bounds=bnds, constraints=cons)print(f"b1={res.x[0]}, b2={res.x[1]}, b3={res.x[2]}")# 保存系数以便进一步分析拟合优度beta1 = res.x[0]beta2 = res.x[1]beta3 = res.x[2] from sklearn.linear_model import LinearRegressionmodel2 = LinearRegression(nonnegative=False)model2.fit(X, Y)print("回归截距 = {}".format(model2.intercept_))print("回归系数 -> \n{}".format(model2.coef_))r_sq_model2 = model2.score(X, y)print("回归R平方值 = {}".format(r_sq_model2))model2.coef_ = np.array([ beta1, beta2, beta3 ])print("\n* 覆盖后的回归系数 -> \n{}".format(model2.coef_)) r_sq_model2 = model2.score(X, y)print("使用调整后系数的回归R平方值 = {}".format(r_sq_model2)) # 如何找到新的截距?
谢谢你的帮助
回答:
在你的模型定义中添加你的截距,像这样
model = lambda b, X: b[3] + b[0] * X[:,0] + b[1] * X[:,1] + b[2] * X[:,2]
现在可以直接使用你的 b[3]
作为你的截距。你可以使用以下方式设置模型的截距:
model2.intercept_ = b[3]