нормализация гребня питона - PullRequest
0 голосов
/ 07 июня 2018

Я генерирую простую линейную модель, в которой переменные 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 не должен ничего делать, поскольку данные уже «нормализованы».Может кто-нибудь объяснить мне, что здесь происходит?Спасибо!

1 Ответ

0 голосов
/ 07 июня 2018

Важно понимать, что нормализация и стандартизация не одинаковы и оба не могут быть выполнены одновременно.Вы можете либо нормализовать, либо стандартизировать.

Часто Стандартизация относится к преобразованию данных так, чтобы они имели среднее значение 0 и единицу (1) дисперсию.Например, это может быть достигнуто путем удаления среднего и деления на стандартное отклонение.В этом случае это будет функция (столбец).

Обычно Нормализация относится к преобразованию значений данных в диапазон от 0 до 1. Например, это может быть достигнуто путем деления на длину вектора.Но это не значит, что среднее будет 0, а дисперсия 1.

После генерации trainx, trainy они еще не нормализованы.Может быть, распечатать его, чтобы увидеть ваши результаты.

  • Итак, когда normalize=True, trainx будет нормализовано путем вычитания среднего значения и деления на l2-норму (согласно склеарну).
  • Когда normalize=False, trainx останется как есть.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...