首页 > 解决方案 > 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

显然,它使用某种分配来降低自由度。我试图查看源代码,但找不到任何相关信息。他们使用什么方法来查找指定模型下的参数?

标签: scikit-learnlinear-regression

解决方案


您不需要降低自由度,它只是找到最小二乘问题的解决方案min sum_i (dot(beta,x_i)+beta_0-y_i)**2.例如,在非稀疏情况下,它使用来自 scipy 的linalg.lstsq模块。此优化问题的默认求解器是gelsdLAPACK 驱动程序。如果 A= np.concatenate((ones_v, X), axis=1) 是以 1 作为第一列的扩充数组,那么您的解决方案由下式给出

x=numpy.linalg.pinv(A.T*A)*A.T*y

我们使用伪逆正是因为矩阵可能不是满秩的。当然,求解器实际上并没有使用这个公式,而是使用奇异值分解A来简化这个公式。


推荐阅读