Мой вопрос: в случае наличия матрицы, которую мы хотим использовать для PCA, где количество функций значительно превышает количество испытаний, почему prcomp не ведет себя так, как ожидалось (или я чего-то упускаю)?
Ниже приводится краткое изложение проблемы: полный код здесь, источник сжатых данных 7 МБ здесь (55 МБ без сжатия), целевое изображение здесь.
Моя точная ситуация заключается в том, что у меня есть матрица p на n, матрица X (p = функции, n = испытания), где испытания - это фотографии, сделанные с лицами, а функции - это пиксели на фотографиях (так что матрица 32256 на 148). Что я хочу сделать, так это найти векторы оценок основных компонентов этой матрицы. Поскольку найти ковариационную матрицу XX ^ T слишком дорого, простое решение - найти собственные векторы (v_i) X ^ TX и преобразовать их с помощью X (Xv_i) подробнее.
XTX <- t(X) %*% X # missing the 1 / n - 1 for cov matrix b/c we normalize later anyway
eigen <- eigen(XTX)
eigenvectors.XTX.col <- eigen$vectors
principal.component.scores <- apply(eigenvectors.XTX.col, 2, function(c) {
normalize.vector(X %*% matrix(c, ncol = 1))
})
В моем случае оценки основных компонентов являются собственными лицами, и их можно использовать для успешной реконструкции целевого лица, как показано здесь: http://cl.ly/image/260w0N0u0Z3y (см. мой полный код, чтобы узнать, как)
Передача X в prcomp должна сделать что-то эквивалентное, но имеет другой результат, чем вышеприведенный доморощенный способ:
pca <- prcomp(X)
pca$x # right size, but wrong pc scores
Результат использования pca$x
при восстановлении лица - не полная чушь, а намного хуже: http://cl.ly/image/2p19360u2P43
Я также проверил, что использование prcomp
на t(x)
дало другую матрицу вращения, поэтому prcomp
делает что-то необычное, но что-то загадочное под капотом. Я знаю из здесь что prcomp
использует SVD для вычисления векторов загрузки главных компонентов вместо собственного разложения, но это не должно приводить к каким-либо ошибкам здесь (или я так думаю ...).
Как правильно использовать встроенный метод prcomp, способ должен быть, верно?
princomp
, но, как я был удивлен, обнаружив в ответе ниже, это не тот случай, когда вам нужно больше наблюдений, чем переменных (это было бы невозможно в некоторых дисциплинах, таких как геномика, или даже здесь с распознавание лиц). Скорее проблема здесь в некоторых раздражающих значениях по умолчанию вprcomp
, а также в отсутствии нормализации. Извините за неубедительную проблему в моем вопросе! - person polpetti   schedule 24.08.2014