2015-07-12 2 views
1

Я следую пример СВД, но я до сих пор не знаю, как уменьшить размер конечной матрицы:R- уменьшить размерность LSA

a <- round(runif(10)*100) 
dat <- as.matrix(iris[a,-5]) 
rownames(dat) <- c(1:10) 

s <- svd(dat) 

pc.use <- 1 
recon <- s$u[,pc.use] %*% diag(s$d[pc.use], length(pc.use), length(pc.use)) %*% t(s$v[,pc.use]) 

Но recon все еще имеют одинаковую размерность. Мне нужно использовать это для семантического анализа.

ответ

1

Предоставленный вами код не уменьшает размерность. Вместо этого он берет первый основной компонент из ваших данных, удаляет остальные основные компоненты и затем восстанавливает данные только с одного ПК.

Вы можете проверить, что это происходит путем проверки ранг конечной матрицы:

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. 
+0

но как насчет оригинального класса? Мне нужно сохранить матрицу с исходными классами, чтобы классифицировать набор данных, используя, например, knn. – GabyLP

+0

, поэтому я просто вставляю те же классы? – GabyLP

+1

Какие классы? Я действительно не видел никаких ярлыков классов в вашем опубликованном коде. Но давайте продолжим - в данных есть 10 образцов и 4 функции. После PCA и, выбрав первые 2 ПК, у вас будет 2 функции и 10 образцов. Таким образом, все образцы одинаковы, и их порядок одинаковый. Вы можете использовать те же метки классов, если они у вас есть. Просто имейте в виду, что в моих примерах кода находятся столбцы и функции в строках. –

Смежные вопросы