Предоставленный вами код не уменьшает размерность. Вместо этого он берет первый основной компонент из ваших данных, удаляет остальные основные компоненты и затем восстанавливает данные только с одного ПК.
Вы можете проверить, что это происходит путем проверки ранг конечной матрицы:
library(Matrix)
rankMatrix(dat)
as.numeric(rankMatrix(dat))
[1] 4
as.numeric(rankMatrix(recon))
[1] 1
Если вы хотите уменьшить размерность (число строк) - вы можете выбрать некоторые основные основные компоненты и вычислить оценки ваших данных по этим компонентам.
Но сначала давайте сделаем некоторые вещи о ваших данных - кажется, у вас есть 10 образцов (строк) с 4 функциями (столбцами). Уменьшение размерности уменьшит 4 функции до меньшего набора функций.
Таким образом, вы можете начать с перестановкой вашу матрицу для svd()
:
dat <- t(dat)
dat
1 2 3 4 5 6 7 8 9 10
Sepal.Length 6.7 6.1 5.8 5.1 6.1 5.1 4.8 5.2 6.1 5.7
Sepal.Width 3.1 2.8 4.0 3.8 3.0 3.7 3.0 4.1 2.8 3.8
Petal.Length 4.4 4.0 1.2 1.5 4.6 1.5 1.4 1.5 4.7 1.7
Petal.Width 1.4 1.3 0.2 0.3 1.4 0.4 0.1 0.1 1.2 0.3
Теперь вы можете повторить СВД. Центрирование данных до этой процедуры рекомендуется:
s <- svd(dat - rowMeans(dat))
Основные компоненты могут быть получены путем проецирования данных на ПК.
PCs <- t(s$u) %*% dat
Теперь, если вы хотите уменьшить размерность, устраняя ПК с низкой дисперсией можно сделать так:
dat2 <- PCs[1:2,] # would select first two PCs.
но как насчет оригинального класса? Мне нужно сохранить матрицу с исходными классами, чтобы классифицировать набор данных, используя, например, knn. – GabyLP
, поэтому я просто вставляю те же классы? – GabyLP
Какие классы? Я действительно не видел никаких ярлыков классов в вашем опубликованном коде. Но давайте продолжим - в данных есть 10 образцов и 4 функции. После PCA и, выбрав первые 2 ПК, у вас будет 2 функции и 10 образцов. Таким образом, все образцы одинаковы, и их порядок одинаковый. Вы можете использовать те же метки классов, если они у вас есть. Просто имейте в виду, что в моих примерах кода находятся столбцы и функции в строках. –