scikit-learn - sklearn.linear_model.LinearRegression 如何在数据不足的情况下工作?
问题描述
要求解一个 5 参数模型,我需要至少 5 个数据点才能获得唯一的解决方案。对于下面的 x 和 y 数据:
import numpy as np
x = np.array([[-0.24155831, 0.37083184, -1.69002708, 1.4578805 , 0.91790011,
0.31648635, -0.15957368],
[-0.37541846, -0.14572825, -2.19695883, 1.01136142, 0.57288752,
0.32080956, -0.82986857],
[ 0.33815532, 3.1123936 , -0.29317028, 3.01493602, 1.64978158,
0.56301755, 1.3958912 ],
[ 0.84486735, 4.74567324, 0.7982888 , 3.56604097, 1.47633894,
1.38743513, 3.0679506 ],
[-0.2752026 , 2.9110031 , 0.19218081, 2.0691105 , 0.49240373,
1.63213241, 2.4235483 ],
[ 0.89942508, 5.09052174, 1.26048572, 3.73477373, 1.4302902 ,
1.91907482, 3.70126468]])
y = np.array([-0.81388378, -1.59719762, -0.08256274, 0.61297275, 0.99359647,
1.11315445])
我只使用 6 个数据来拟合 8 个参数模型(7 个斜率和 1 个截距)。
lr = LinearRegression().fit(x, y)
print(lr.coef_)
array([-0.83916772, -0.57249998, 0.73025938, -0.02065629, 0.47637768,
-0.36962192, 0.99128474])
print(lr.intercept_)
0.2978781587718828
显然,它使用某种分配来降低自由度。我试图查看源代码,但找不到任何相关信息。他们使用什么方法来查找指定模型下的参数?
解决方案
您不需要降低自由度,它只是找到最小二乘问题的解决方案min sum_i (dot(beta,x_i)+beta_0-y_i)**2.
例如,在非稀疏情况下,它使用来自 scipy 的linalg.lstsq模块。此优化问题的默认求解器是gelsd
LAPACK 驱动程序。如果
A= np.concatenate((ones_v, X), axis=1)
是以 1 作为第一列的扩充数组,那么您的解决方案由下式给出
x=numpy.linalg.pinv(A.T*A)*A.T*y
我们使用伪逆正是因为矩阵可能不是满秩的。当然,求解器实际上并没有使用这个公式,而是使用奇异值分解A
来简化这个公式。
推荐阅读
- javascript - 如何使用一个类扩展多个类(不是多重继承)?
- google-drive-api - Google Drive API v3,只在第一次工作
- php - Laravel Socialite 中的 Google 登录是否包含用户的电话号码?
- apache-spark - 生产 Spark 代码开始在 count() 上生成空指针
- php - 执行“git reset --hard”后,找不到类“Magento\Setup\Application”
- javascript - mapkitJS 和 ArcGIS esri-loader 的 dojo multipleDefine 错误
- typescript - 如何在角度 6 的 highcharts 中使用 highstocks 渲染图表?
- javascript - Redux-Toolkit createAsyncThunk Dispatch 显示为未定义
- python-3.x - 无法使用注册表中的主机密钥使用 pySFTP 连接到 EFT 服务器
- google-bigquery - BigQuery 表分区