基于自定义系数的多元线性回归

我有一个相当独特的问题。我有一个多元线性回归问题,我的目标是找到这个回归的截距,同时确保系数的总和小于等于1,并且每个系数都不为负。我花了很多时间在网上搜索,并且在这里找到了一个很棒的答案:

https://datascience.stackexchange.com/questions/18258/how-to-force-weights-to-be-non-negative-in-linear-regression

下面的代码展示了我是如何使用上面答案中共享的代码输出覆盖回归系数的。此时我的问题/问题是:给定自定义系数,如何计算新的截距值?

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]

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注