上記のコードでpythonにより32×32の画像に対して主成分分析を行っております。
4行目までが主成分分析を行うまでの前処理としてデータの標準化を行っております。
その後,相関行列→固有値という順番で主成分分析を行おうとしたのですが,
固有値を見てみると31番目のところで負の値が出てきております。
固有値は言い換えるならば分散だと考えているので負の値が出るのはおかしいと思うのですが,
なにかパッケージ上の特殊な処理なのでしょうか,,,
どなたか詳しい方教えて頂けると助かります。
img0 = Image.open("./M2/./pca/./cnn3/./kyousi/./kt/_2003.jpg") img0 = np.array(img0.convert("L")).flatten() img0 = scipy.stats.zscore(img0) img0=img0.reshape(32,32) correlation_matrix = np.corrcoef(img0.transpose()) a_eig = np.linalg.eig(correlation_matrix) print(a_eig[0])
[ 1.46452527e+01 1.92421625e+00 1.64754210e+00 1.52687264e+00 1.43094622e+00 1.28924078e+00 1.23500344e+00 1.13151162e+00 9.12331262e-01 8.77758676e-01 7.05440512e-01 6.27369098e-01 5.73941234e-01 5.47804975e-01 4.71558818e-01 4.28669708e-01 3.91138674e-01 3.23029240e-01 2.85841937e-01 2.45227921e-01 2.14686453e-01 1.65598319e-01 1.34719090e-01 8.93070343e-02 7.01055061e-02 4.12986136e-02 2.90283346e-02 2.13193245e-02 1.01877492e-02 2.29411964e-03 -9.17382865e-17 7.57632935e-04]
「e-17」と、とても小さいので、数値計算上の誤差では??
(実質0として扱う)
あと、「np.corrcoef()」じゃなくて「np.cov()」では?
そうしないと、下記の結果と合わないような
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(img0)
print(pca.explained_variance_)
参考
https://qiita.com/koshian2/items/2e69cb4981ae8fbd3bda
返信が遅れてしまって申し訳ございません。
計算上の誤差ということも考えたのですが,それであれば32個目の固有値ももっと小さくなるのではという疑問も生じております。
固有値を求める際に,分散共分散行列を用いるか,相関行列を用いるかは,標準偏差で正規化するかどうかなので,固有値の正負には関わってこないのであまり深く考えていませんでした。
> 32個目の固有値ももっと小さくなるのでは
correlation_matrix = np.corrcoef(img0.transpose())
a_eig2 = np.linalg.svd(correlation_matrix)
print(a_eig2[1])
なら、大→小の順番に並んで、ほぼ0が最後に来るのではないですかね

回答2件
あなたの回答
tips
プレビュー