我生成一个简单的线性模型,其中X(维度D)变量来自具有0协方差的多正态。只有前10个变量的真系数为1,其余的系数为0.因此,理论上,岭回归结果应该是真系数除以(1 + C),其中C是惩罚常数。
import numpy as np
from sklearn import linear_model
def generate_data(n):
d = 100
w = np.zeros(d)
for i in range(0,10):
w[i] = 1.0
trainx = np.random.normal(size=(n,d))
e = np.random.normal(size=(n))
trainy = np.dot(trainx, w) + e
return trainx, trainy
然后我用:
n = 200
x,y = generate_data(n)
regr = linear_model.Ridge(alpha=4,normalize=True)
regr.fit(x, y)
print(regr.coef_[0:20])
在normalize = True下,我得到前10个系数为真值1的20%(即1 /(1 + 4))。当normalize = False时,我得到前10个系数1,与简单线性回归模型的结果相同。此外,由于我生成的数据是mean = 0和std = 1,normalize = True不应该做任何事情,因为数据已经“标准化”。有人可以向我解释这里发生了什么吗?谢谢!
答案 0 :(得分:1)
重要的是要理解规范化和标准化是不相同而两者都不能同时完成。您可以标准化或标准化。
标准化通常指的是转换数据,使其具有0均值和单位(1)方差。例如。可以通过去除平均值并除以标准偏差来实现。在这种情况下,这将是特征(列)明智。
通常规范化是指将数据值转换为0到1之间的范围。可以通过除以矢量的长度来实现。但这并不意味着均值将为0且方差为1.
生成trainx, trainy
后,它们尚未正常化。也许打印出来看看你的结果。
normalize=True
时,trainx
将通过减去均值并除以l2范数(根据sklearn)进行归一化。 normalize=False
时,trainx
将保持原样。 答案 1 :(得分:0)
如果你做 normalize=True,每一个特征列都除以它的 L2 范数,换句话说,每一个特征列的量级都减少了,这导致估计的系数更大(βX 应该或多或少是恒定的; X 越小,β 越大)。当系数较大时,施加较大的 L2 惩罚。因此,该函数更关注 L2 惩罚而不是线性部分 (Xβ)。因此,与纯线性回归相比,线性部分的系数估计不太准确。
相比之下,如果 normalize=False,则 X 较大,β 较小。给定相同的 alpha,L2 惩罚是微不足道的。更多地关注线性部分 - 结果接近于纯线性回归。