Что означают различия между собственными векторами pyspark SVD и собственными векторами PCA? - PullRequest
1 голос
/ 06 мая 2019

Я использую функции SVD и PCA в (pyspark) mllib (Spark 2.2.0), как описано в этой ссылке: https://spark.apache.org/docs/2.2.0/mllib-dimensionality-reduction.html

Предположим, нам даны следующие объекты данных:

[(2, 2), (3, 1), (2, 2), (1, 3), (1.0, 1.0), (3.0, 3.0)]

Применение функции computeSVD() дает:

для U: [DenseVector([-0.3922, -0.0]), DenseVector([-0.3922, -0.7071]), DenseVector([-0.3922, -0.0]), DenseVector([-0.3922, 0.7071]), DenseVector([-0.1961, -0.0]), DenseVector([-0.5883, -0.0])]

и локальная плотная матрица V:

[[-0.70710678 -0.70710678]
 [-0.70710678  0.70710678]]

Вопрос на данный момент: что на самом деле являются собственными векторами в искре? Они в U или в V?

А теперь контраст с применением computePrincipalComponents(): это дает:

DenseMatrix([[1., 0.],
            [0., 1.]])

В соответствии с документацией об искрах указано, что «Основные компоненты хранятся в локальной плотной матрице». Таким образом, результат PCA должен дать собственные векторы, но почему они отличаются от собственных векторов локальной плотной матрицы V SVD? Они в конечном итоге нормированы?

Заранее благодарю за любые уточнения по этому вопросу.

1 Ответ

1 голос
/ 07 мая 2019

Собственный вектор (плотная матрица V) в результате выполнения computeSVD() для вашего набора данных обозначает вектор [матрица 2x2], который является скалярным кратным линейного разложения вашего набора данных.

SVD находит тождественный вектор , который максимизирует дисперсию, объясняемую вашими данными, тогда как PCA стремится найти набор ортогональных векторов, которые действуют как оси (через произвольное N количество объектов ) которые позволяют моделировать ваши данные в двух измерениях (определяется набором осей, что приводит к максимальному отклонению, которое объясняется SVD).

Вот почему ваш SVD выводит вектор идентичности:

[[-0.70710678 -0.70710678]
 [-0.70710678  0.70710678]]

И computePrincipalComponents() приводит к следующим векторам [1,0] и [0,1], которые совпадают с естественными осями X и Y.

Существует много литературы о взаимосвязи между SVD и ее отношением к PCA и о том, почему SVD является более стабильным решением для сохранения целостности данных из-за неточностей округления в результате вычисления продукта вашего набора данных по его транспонированной матрице (X * X⊤), но вам будет лучше обслужить множество постов с высоким рейтингом {math|stats}.stackexchange, перечисленных ниже.

Полезные вопросы по теме:

...