我有大量的特征和目标,但样本数量很少。事实证明,在这种情况下,使用
numpy.linalg.pinv
的简单线性回归比 sklearn.linear_model.LinearRegression
效果要好得多。
例如,
n_features=n_targets=30000
和n_samples=2
:
X = np.random.random((2, 30000))
Y = np.random.random((2, 30000))
x = np.random.random((1, 30000))
y = Y.T @ (np.linalg.pinv(X.T) @ x.T) # works fast and use a little memory
reg = LinearRegression(fit_intercept=False).fit(X,Y) # slow and uses a lot of memory
y2 = reg.predict(x)
np.linalg.norm(y2 - y) < 1e-12
问题是
reg.coef_.shape
是(30000, 30000)
。所以 LinearRegression
不要利用低阶回归。
有没有办法通过 sklearn 框架获得简单的
pinv
解决方案的模拟?
我尝试搜索,但没有找到任何有用的东西。
我使用带有
sklearn.kernel_ridge.KernelRidge
参数的 alpha=1e-15, kernel='rbf'
类解决了这个问题。对于我的任务,它显示了与基于 pinv
的解决方案相同的速度、内存要求和准确性。代码也很紧凑:
reg = KernelRidge(alpha=1e-15, kernel='rbf')
reg.fit(X, Y)
y3 = reg.predict(x)
我知道,它不是线性模型,但它也有效。也许有一些内核的工作方式与线性回归相同。我认为带有
polynomial
的 degree=1
内核应该可以这样工作,但我还没有尝试过。