我生成了一个简单的线性模型,其中X(维度D)的变量来自于协方差为0的多元正态分布。只有前10个变量的真实系数为1,其余的系数为0。因此,理论上,岭回归的结果应该是真实系数除以(1+C),其中C是惩罚常数。
import numpy as npfrom sklearn import linear_modeldef 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 = 200x,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,这与简单线性回归模型的结果相同。此外,由于我生成的数据均值为0且标准差为1,normalize = True不应该对数据产生任何影响,因为数据已经是“标准化”的。能有人解释一下这是怎么回事吗?谢谢!
回答:
重要的是要理解标准化和规范化是不一样的,并且不能同时进行。你可以选择标准化或者规范化其中一个。
通常标准化指的是将数据转换为均值为0且方差为1的形式。例如,可以通过减去均值并除以标准差来实现。在这种情况下,这是按特征(列)进行的。
通常规范化指的是将数据值转换到0到1之间的范围。例如,可以通过除以向量的长度来实现。但这并不意味着均值将为0,方差将为1。
在生成trainx, trainy
之后,它们尚未被规范化。也许可以打印出来看看你的结果。
- 所以,当
normalize=True
时,trainx
将通过减去均值并除以l2范数(根据sklearn)进行规范化。 - 当
normalize=False
时,trainx
将保持原样。