gpt4 book ai didi

scikit-learn - 当 p > n 时 sklearn 如何进行线性回归?

转载 作者:行者123 更新时间:2023-12-04 04:42:15 25 4
gpt4 key购买 nike

众所周知,当变量数 (p) 大于样本数 (n) 时,未定义最小二乘估计量。

在 sklearn 我收到这个值:

In [30]: lm = LinearRegression().fit(xx,y_train)

In [31]: lm.coef_
Out[31]:
array([[ 0.20092363, -0.14378298, -0.33504391, ..., -0.40695124,
0.08619906, -0.08108713]])

In [32]: xx.shape
Out[32]: (1097, 3419)

调用 [30] 应返回错误。在这种情况下,当 p>n 时 sklearn 是如何工作的?

编辑:
似乎矩阵填充了一些值
if n > m:
# need to extend b matrix as it will be filled with
# a larger solution matrix
if len(b1.shape) == 2:
b2 = np.zeros((n, nrhs), dtype=gelss.dtype)
b2[:m,:] = b1
else:
b2 = np.zeros(n, dtype=gelss.dtype)
b2[:m] = b1
b1 = b2

最佳答案

当线性系统欠定时,则 sklearn.linear_model.LinearRegression 找到最小 L2 范数解,即

argmin_w l2_norm(w) subject to Xw = y

这总是可以通过将 X 的伪逆应用于 y 来定义和获得的,即
w = np.linalg.pinv(X).dot(y)
scipy.linalg.lstsq 使用的 LinearRegression 的具体实现使用了 get_lapack_funcs(('gelss',), ...,它正是通过奇异值分解(LAPACK 提供)找到最小范数解的求解器。

看看这个例子
import numpy as np
rng = np.random.RandomState(42)
X = rng.randn(5, 10)
y = rng.randn(5)

from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercept=False)
coef1 = lr.fit(X, y).coef_
coef2 = np.linalg.pinv(X).dot(y)

print(coef1)
print(coef2)

你会看到 coef1 == coef2 。 (注意在sklearn estimator的构造函数中指定了 fit_intercept=False,否则会在拟合模型之前减去每个特征的均值,得到不同的系数)

关于scikit-learn - 当 p > n 时 sklearn 如何进行线性回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com