Я генерирую простую линейную модель, в которой переменные 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])
При нормализации = True, я получаю первые 10 коэффициентов где-то 20% (т.е. 1 / (1 + 4)) отистинное значение 1. Когда normalize = False, я получаю первые 10 коэффициентов равными 1, что является теми же результатами, что и простая модель линейной регрессии.Более того, поскольку я генерирую данные со средним значением = 0 и стандартным значением = 1, normalize = True не должен ничего делать, поскольку данные уже «нормализованы».Может кто-нибудь объяснить мне, что здесь происходит?Спасибо!