Является ли обычным, что стандартный скейлер Scikit learn вызывает необратимость?

Вопрос или проблема

Например, я пытаюсь выполнить линейную регрессию на следующем наборе данных

Примеры данных:
$X = [[1, 20], [3, 40], [5, 60]]$ (каждая строка — это пример, всего три примера, каждый с признаком размерности $2$, организованы в массив Numpy)

Цели:
$y = [1, 2, 3]$ (не влияет на наш результат, выбор на ваше усмотрение)

Подгонка стандартного масштабирования дает мне,

X = [[1, 20], [3, 40], [5, 60]]
scaler = StandardScaler()
scaler.fit(X)
Y = scaler.transform(X)

$Y = [[-1.22474487 -1.22474487]
[ 0. 0. ]
[ 1.22474487 1.22474487]]$

Теперь я хочу вычислить нормальное уравнение задачи линейной регрессии. Это включает вычисление следующей матрицы $Z = (Y^T Y)^{-1} Y^T$

Z = np.linalg.inv(np.dot(np.transpose(Y), Y))*np.transpose(Y)

Я получаю LinAlgError: Singular matrix

Обратите внимание, что это, похоже, не проблема с исходным набором данных $X$

Это нормальное поведение или я что-то сделал неправильно?

Я думаю, что основное замешательство связано с нюансами между линейными и аффинными отношениями, что редко становится проблемой в большинстве случаев в науке о данных (мы обычно допускаем аффинные отношения, даже если используем слово “линейный”).

Матрица $X$ имеет полную ранг: столбцы демонстрируют аффинное отношение ($x_2=10x_1+10$), но не линейное. Так что $X^T X$ (которая является $2\times2$) действительно обратима, и все идет нормально.

Если вы добавите столбец из единиц к $X$ (чтобы включить перехват в ОМП), вы поднимите аффинное отношение до линейного, и обнаружите, что $X^T X$ не имеет обратной матрицы.

StandardScaler (помимо масштабирования) центрирует признаки, что снова удаляет смещение сдвига, и превращает аффинное отношение в линейное (конечно, это тождественное отношение).

Линейное или аффинное (с фиксированным постоянным членом) преобразование, такое как масштабирование, не должно изменять ранг матрицы или ее обратимость. Это один момент. Однако, согласно документации StandardScaler, StandardScaler масштабирует каждый признак независимо (то есть больше не является равномерным линейным/аффинным преобразованием, множители постоянных членов различны), поэтому это может фактически изменить ранг и обратимость матрицы данных (например, используйте другой масштабировщик).

Дополнительно, формула для псевдо-обратной матрицы Мура-Пенроуза, которую вы используете, действительна только в определенных случаях (т.е. для линейно независимых столбцов), иначе должна быть использована более общая формула. Проверьте также это.

В вашем примере данных изначально есть проблема (не связанная с масштабированием). Он дает идеальную подгонку. Это также отразится на масштабированных данных. Вам также необходимо добавить постоянный член, чтобы решить $(X’X)^{-1} X’y = \hat{\beta}$.

Пример на R:

df = data.frame(y=c(1,2,3),x1=c(1,3,5),x2=c(20,40,60))
summary(lm(y~x1+x2,data=df))

Предупреждающее сообщение: В summary.lm(lm(y ~ x1 + x2, data = df)) :
фактически идеальная подгонка: сводка может быть ненадежной

x0 <- c(1,1,1) 
x1 <- c(1,3,5)
x2 <- c(20,40,60)
x <- as.matrix(cbind(x0,x1,x2))
y <- as.matrix(c(1,2,3))

# (X'X)^-1 X'y
beta1 = solve(t(x)%*%x) %*% t(x)%*%y 

Ошибка в solve.default(t(x) %*% x) : система
точно вырожденная: U[3,3] = 0

Ответ или решение

Вопрос о том, может ли StandardScaler из библиотеки Scikit-learn привести к неинвертируемости матрицы, заслуживает тщательного анализа. Исходя из представленного примера, проблема возникает при вычислении обратной матрицы после стандартизации данных. Давайте разберемся, что могло привести к этой ошибке.

Проблема некорректности обратной матрицы

Стандартное масштабирование данных, выполняемое с помощью StandardScaler, включает вычитание среднего значения и деление на стандартное отклонение для каждой особенности (признака) по отдельности. Это приводит к тому, что каждый признак имеет нулевое среднее и дисперсию, равную единице. В этом процессе выполняется центровка данных, что нарушает афинные связи, переводя их в линейную форму. Это может привести к проблемам с рангом матрицы, а именно к ее вырождению.

Почему возникает ошибка "Singular matrix"?

При вычислении матрицы ( Z = (Y^T Y)^{-1} Y^T ), вы сталкиваетесь с тем, что ( Y^T Y ) становится сингулярной матрицей. Это происходит из-за эквивалентности признаков в центреированном наборе данных. В представленных данных, после стандартизации, второй признак становится просто усиленной копией первого, что делает строки матрицы линейно зависимыми.

Решение проблемы

  1. Регуляризация: Используйте методы регрессии с регуляризацией, такие как Ridge или Lasso, чтобы решить проблему сингулярности.

  2. Псевдообратная матрица: Если необходимо, для решения линейной регрессии используйте псевдообратную матрицу Мура-Пенроуза, которая рассчитана на случаи, когда матрица не является полной ранговой.

  3. Добавление столбца из единиц: Это добавит константный терм и обеспечит учет смещения (интерсепта) в регрессии. Однако при стандартизации это не решит проблему линейной зависимости признаков, но может быть полезно в другом контексте.

Заключение

Отображенное поведение StandardScaler является нормальным и ожидаемым. Процесс стандартизации может привести к потере ранга матрицы в случае линейно зависимых признаков, что и наблюдается в представленной задаче. Важно знать нюансы работы с данными и методами машиностроения, чтобы применять правильные решения.

Оцените материал
Добавить комментарий

Капча загружается...