要解决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
很显然,它正在使用某种分配来降低自由度。我试图查看源代码,但找不到任何相关信息。他们使用什么方法来查找指定模型下的参数?
答案 0 :(得分:0)
您无需降低自由度,只需找到最小二乘问题的解决方案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)
是第一列的扩展数组,那么您的解决方案由
x=numpy.linalg.pinv(A.T*A)*A.T*y
我们在这里精确地使用伪逆的原因是矩阵可能不是满秩的。当然,求解器实际上并不使用此公式,而是使用A
的奇异值分解来简化此公式。