あなたが提供したコードは次元を減らしません。代わりに、データから最初の主成分を取得し、残りの主成分を削除してから、1 台の PC だけでデータを再構築します。
最終行列のランクを検査することで、これが起こっていることを確認できます。
library(Matrix)
rankMatrix(dat)
as.numeric(rankMatrix(dat))
[1] 4
as.numeric(rankMatrix(recon))
[1] 1
次元数 (行数) を減らしたい場合は、いくつかの主主成分を選択し、代わりにそれらの成分でデータのスコアを計算できます。
しかし、最初にデータについていくつか明確にしましょう。4 つの特徴 (列) を持つ 10 個のサンプル (行) があるようです。次元削減により、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
これで、svd を繰り返すことができます。この手順の前にデータを中央に配置することをお勧めします。
s <- svd(dat - rowMeans(dat))
主成分は、データを PC に投影することで取得できます。
PCs <- t(s$u) %*% dat
分散の低い PC を排除して次元を減らしたい場合は、次のように実行できます。
dat2 <- PCs[1:2,] # would select first two PCs.