2017-02-03 19 views
0

Мне нужно использовать SVD в Matlab для получения уменьшенной версии моих данных. Я читал, что функция svds(X,k) выполняет SVD и возвращает первые k собственных значений и собственных векторов. В документации не упоминается, должны ли данные быть нормализованы. С нормировкой я имею в виду как вычитание среднего значения, так и деление на стандартное отклонение.Должен ли я выполнять центрирование данных перед применением SVD?

Когда я реализовал PCA, я привык нормализовать таким образом. Но я знаю, что он не нужен при использовании функции matlab pca(), потому что он вычисляет матрицу ковариации с помощью cov(), которая неявно выполняет нормализацию.

Итак, вопрос есть. Мне нужна проекционная матрица, полезная для уменьшения моих n-мерных данных до k-мерных SVD. Должен ли я выполнять нормализацию данных поезда (и, следовательно, такую ​​же нормировку для дальнейших прогнозируемых новых данных) или нет? Thanks

ответ

1

Это действительно зависит от того, что вы хотите делать с вашими данными. Центрирование и масштабирование могут быть полезны для получения принципиальных компонентов, которые являются репрезентативными для формы вариаций данных, независимо от масштабирования. Я бы сказал, что это в основном необходимо, если вы хотите продолжать использовать сами главные компоненты, в частности, если вы хотите визуализировать их. Это также может помочь во время классификации, так как ваши оценки будут затем нормализованы, что может помочь вашему классификатору. Однако это зависит от приложения, поскольку в некоторых приложениях энергия также несет полезную информацию, которую нельзя отбрасывать - нет общего ответа!

Теперь вы пишете, что все, что вам нужно, это «матрица проекции, полезная для уменьшения моих n-мерных данных до k-мерных SVD». В этом случае не нужно ничего централизовать или масштабировать:

[U,~] = svd(TrainingData); 
RecudedData = U(:,k)'*TestData; 

будет выполнять эту работу. svds может стоить рассмотреть, когда ваши TrainingData огромны (в обоих измерениях), так что svd слишком медленный (если он огромный в одном измерении, просто примените svd к грамматической матрице).

+0

В основном у меня разреженные векторы. Я хочу «изучить» некоторую матрицу прогноза из набора тренировок, который будет использоваться для уменьшения как данных поезда, так и тестовых данных. Эти прогнозируемые векторы должны быть поданы в классификатор SVM (для обучения и тестирования, конечно). Итак, согласно сказанному, мне не нужно вычитать из поезда, а тест устанавливает среднее значение векторов поезда. я? – user2614596

+0

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

+0

Используя svds(), размерность U приводит меня к числу данных обучения k! что-то не так, потому что оно не преобразует тестовые данные из 1-на-n векторов в 1-на-k. – user2614596

1

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

Предположим, что у нас есть две особенности х и у, как с дисперсией 1, но где х имеет среднее значение 1 и у имеет среднее значение 1000. Тогда матрица образцов будет выглядеть

n = 500; % samples 
x = 1 + randn(n,1); 
y = 1000 + randn(n,1); 
svd([x,y]) 

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

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

z = 1e6 + sin(t) 

Теперь, если кто-то просто дал вам эти цифры, вы можете посмотреть на последовательность

z = 1000001.54, 1000001.2, 1000001.4,... 

и просто думать, «что сигнал скучно, в основном это всего лишь 1е6 плюс некоторые округлые сроки ... ».Но как только мы удаляем среднее, мы видим сигнал для того, что на самом деле является ... очень интересным и конкретным. Короче говоря, вы всегда должны удалять средства и масштаб.