質問

私は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つのケースが表示されます。

  1. $ x $は$ n times 3 $マトリックスでもあります。その後、寸法の削減は実行されず、$ x_ {new} = x $が必要です(少なくとも理論的には、実際には非常に小さいかもしれません数値近似誤差ですが、基本的には同じです)
  2. $ 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などの他の方法が興味深い理由です。

要約すると、質問に対する答えはノーです。毎回使用することは良い選択ではありません。問題に依存します。

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top