为什么岭回归在 Matlab 和 Python 中给出不同的结果?

机器算法验证 回归 matlab Python scikit-学习 岭回归
2022-03-27 16:09:20

为什么 Matlab 和 Python 的输出对于岭回归会有所不同?ridge在 Matlab 和scikit-learnPython 中使用该命令进行岭回归。

MATLAB

X = [1 1 2 ; 3 4 2 ; 6 5 2 ; 5 5 3];
Y = [1 0 0 1];
k = 10 % which is the ridge parameter

b = ridge(Y,X,k,0)

系数估计为

b =    0.3057    -0.0211    -0.0316    0.1741

Python

import numpy as np
X = np.array([[1, 1, 2] , [3, 4, 2] , [6, 5, 2] , [5, 5, 3]])
Y = np.r_[1,0,0,1].T

from sklearn import linear_model

clf = linear_model.Ridge(alpha=10)
clf.fit(X, Y)       

b = np.hstack((clf.intercept_, clf.coef_))

系数估计为

 b =  0.716   -0.037   -0.054    0.057

为什么会观察到这种差异?


编辑:对于那些认为居中和缩放是问题的人。输入数据没有缩放或居中,因为我使用缩放参数作为 0 从观察到

b = ridge(Y,X,k,0)

默认情况下,岭回归scikit-learn不进行归一化

>>clf
Ridge(alpha=10, copy_X=True, fit_intercept=True, max_iter=None,   normalize=False, solver='auto', tol=0.001)

这是标准化后的 Matlab 输出b = ridge(Y,X,k,1)

 b = -0.0467   -0.0597   0.0870
1个回答

MATLAB 始终使用居中和缩放的变量进行ridge. 它只是在返回它们之前对它们进行反向转换。由于您的矩阵非常小,这可能会产生明显的差异。您可以轻松地在 MATLAB 中重现 Python 结果:

X = [1 1 2 ; 3 4 2 ; 6 5 2 ; 5 5 3];
Y = [1 0 0 1];
k = 10; % which is the ridge parameter     
Xn = [ones(4,1), X];

(Xn'*Xn +  diag([0,k,k,k]))\ (Xn'*Y')  %Same as sklearn

ans =
    0.7165
   -0.0377
   -0.0544
    0.0572