PCAアルゴリズムの問題-Python
-
16-10-2019 - |
質問
私はPCAアルゴリズムを実装しており、それを非常によく理解しましたが、それでもいくつかの質問があります。私のコードは以下にあり、非常に簡単な実装です。
import numpy as np
x = np.loadtxt('CCPP', delimiter=',')
row, column = x.shape
# Mean normalization
for i in range(column):
x[:,i] = (x[:,i] - x[:,i].mean()) / (x[:,i].max() - x[:,i].min())
sigma = x.transpose().dot(x) / row
u, s, v = np.linalg.svd(sigma, 0)
z = x.dot(u[:,:3]) ## new features
new_x = z.dot(u[:,:3].transpose()) ##reconstruction
最初の質問
上にわかるように、私のSigma変数はそうです
x.Transpose()。dot(x) / row
それは私にNXNマトリックスを与えています(nは機能の数です)。しかし、sigmaの式は$$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{(i)}}^t $$です。
フォーミュラに合計記号があるのはなぜですか?つまり、このシグマ定式化を使用すると、シグマはマトリックスではなく数になります。 NXNマトリックスを取得する必要がありますよね?それで、私のシグマの実装は正しいですか?それとも、式について何かが足りませんか?
2番目の質問
xを再構築するとき(コードの下部にある)、new_xは私の最初のxに等しくなければなりませんか?つまり、データセットの次元を減らした後、再構築しました。元のデータセットと再構築されたデータセットは同じでなければなりませんよね?これは私の2番目の質問です。
3番目の質問
これは簡単です。 1000、100000以上の機能を備えたデータセットのそれぞれにデータ圧縮を使用する必要がありますか?つまり、私はいつもそれを使うことができますか?毎回使用するのは良い選択ですか?
解決
最初の質問について.
上記の式では、私が間違っていない場合、xは要素のマトリックスです。したがって、フォーミュラがあなたに望んでいるのは、すべてのラインのすべてのドット製品を転置することです。これにより、スカラーが得られます。
x = np.array([1, 2, 3, 4])
res = x.dot(x.transpose())
# res = 30
したがって、私のSuestionは、そのコードの行を次のように変更することです。
for i in range(row):
sigma += x[i].transpose().dot(x[i])
sigma = sigma/row
2番目の質問
次元を減らしたため、X_Newマトリックスは同じではありません。
3番目の質問
PCAを使用するときは、ドメインの問題です。次元削減のポイントは、新しいデータセットを取得することです。あなたがあなたの「結果」/「処理する時間」が良いなら、私はあなたがそれを使うべきではないと思います。
他のヒント
最初の質問:$ sigma $を計算します
実際、同じ計算を実行しますが、スカラー操作の代わりにマトリックス操作を使用します。 $$ x =(x_j^{(i)}})_ {i、j} = big(x^{((x^{())$ x $を記述する機能マトリックス$ x $の表記によって誤解を招く可能性があります。 1)} ... x^{(i)} ... x^{(n)} big)^t $$ということです。 ^{(i)} $ $ i $ -thサンプル。
したがって、経験的共分散マトリックス$ sigma $(実際には$ n times n $ matrix)を計算する場合、$$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{(i)}}^t = frac {1} {n} x^tx $$これがまったく同じ計算であることを確認できます。
コードでは、実際にマトリックス操作(すなわち$ sigma = frac {1} {n} x^tx $)を使用して直接$ sigma $を計算しています。これにより、$ n times n $ matrixが得られます。したがって、実装と式の両方が正しいです。
2番目の質問:$ x $の再構築
新機能マトリックス$ z $は、コードに応じて$ n times 3 $マトリックスです。実際、コードには機能空間の元のサイズが表示されないため、ここに2つのケースが表示されます。
- $ x $は$ n times 3 $マトリックスでもあります。その後、寸法の削減は実行されず、$ x_ {new} = x $が必要です(少なくとも理論的には、実際には非常に小さいかもしれません数値近似誤差ですが、基本的には同じです)
- $ x $は$ n times d $ matrix $ d> 3 $で、次元削減を実行します。この場合、元のデータ、この場合は$ x_ {new}に含まれる情報を取り除きます。 neq x $
あなたの場合、私はあなたが$ d> 3 $を持っているので、あなたは2番目の状況にあると思います。
3番目の質問:PCAを適用するタイミング
まあそれは実際に依存します...
まず、PCAはSVDを実行します。これは、多くの機能があれば非常に高価になる可能性があります。実際、PCAを計算するいくつかの方法があります。あなたの方法は数学理論に近いですが、実際には$ x $で直接SVDを計算することで、$ x^tx $を計算しないようにします。これは高価で同じスペースを取得できます。しかし、いずれにせよ、ある状況では、それは高価で時間がかかるため、実用的ではありません。
PCAが固有値の値に応じて新機能空間を並べ替えると、つまり新しい方向の分散の場合、最後の方向を削除すると、場合によっては役立つノイズが除去される場合があります。ただし、同時に、貴重な差別情報を捨てることができます。これが、LDAなどの他の方法が興味深い理由です。
要約すると、質問に対する答えはノーです。毎回使用することは良い選択ではありません。問題に依存します。