いくつかの 3D スキャンの主成分分析を実行しようとしていますが、固有値と固有ベクトルを計算して操作するときにスタックします。
スキャンは .obj ファイル形式です。
x y z
v 0.001888 -0.058120 -0.069146
v 0.007348 -0.066757 -0.062134
... ...
f 6436 6439 6445
f 6446 6445 6430
6449 個のベクトル、12894 個の顔、および 115 個のスキャンがあります。私の理解では、データは 3D であるため、組み込みprincomp
関数を使用できません。さらに、データ量が原因でラップトップでメモリの問題が発生する可能性があり、最終的に PCA を手動で実行する方法を学びたいと考えています。
これを実行するには5つの段階があると思います
- 平均 3D スキャンを計算します。バーX
- 各スキャンから平均を引きます。Xa - BarX = バー Xa
- Bar Xa * Bar Xa = Ma の行列を作成します。
- Ma の固有値と固有ベクトルを計算します。パ
- 平均形状 BarX を Pa に追加して、固有値と固有ベクトルに従って形状が変形するのを確認します。
これを単純化しすぎていないことを願っていますが、私は数学者/統計学者ではないため、これが私の現在の理解です.
ステージ 1 と 2 は単純なので実行しましたが、混乱しているのは次のステージです。
メモリの問題が発生するのではないかと心配しているので、x、y、z のマトリックスを個別に作成します。したがって、x * x の 6449x6449 の対角行列を作成しています。これは、最初のスキャンの x の行列を作成するために使用したコードです。
text <- readLines("R/location/scan1.obj", encoding="UTF-8")
xmat <- matrix(1:6449, ncol=1)
mat <- diag(6449)
for(i in 1:6449){
xyzLine <- sub("v ", "", text[i])
xyzList <- unlist(strsplit(xyzLine, " "))
xmat[i, 1] = as.numeric(xyzList[1])
}
for(i in 1:6449){
for(j in 1:6449){
mat[i, j] <- xmat[i, 1] * xmat[j, 1]
}
}
これを x、y、z に対して行います。次に、次を使用して固有値と固有ベクトルを計算します。
eigenx <- eigen(x)
eigeny <- eigen(y)
eigenz <- eigen(z)
この段階では、私が行ったことが正しいかどうか確信が持てませんか? しかし、ここから、固有ベクトルと固有値を組み合わせて BarX に追加して形状の変形を確認する方法がわかりませんか?
誰かがアドバイスやガイダンスを持っていれば、それは本当にありがたいです.
前もって感謝します。