質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1147閲覧

pythonで主成分分析した際の固有値に負の値がある

reonald

総合スコア32

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/09/03 04:18

上記のコードで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]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/09/03 08:37 編集

「e-17」と、とても小さいので、数値計算上の誤差では?? (実質0として扱う)
jbpb0

2021/09/03 06:55

あと、「np.corrcoef()」じゃなくて「np.cov()」では? そうしないと、下記の結果と合わないような from sklearn.decomposition import PCA pca = PCA() pca.fit(img0) print(pca.explained_variance_) 参考 https://qiita.com/koshian2/items/2e69cb4981ae8fbd3bda
reonald

2021/09/03 11:18

返信が遅れてしまって申し訳ございません。 計算上の誤差ということも考えたのですが,それであれば32個目の固有値ももっと小さくなるのではという疑問も生じております。 固有値を求める際に,分散共分散行列を用いるか,相関行列を用いるかは,標準偏差で正規化するかどうかなので,固有値の正負には関わってこないのであまり深く考えていませんでした。
jbpb0

2021/09/05 03:06

> 32個目の固有値ももっと小さくなるのでは correlation_matrix = np.corrcoef(img0.transpose()) a_eig2 = np.linalg.svd(correlation_matrix) print(a_eig2[1]) なら、大→小の順番に並んで、ほぼ0が最後に来るのではないですかね
guest

回答2

0

ベストアンサー

1.01877492e-02 2.29411964e-03 -9.17382865e-17 7.57632935e-04]

「e-17」と、とても小さいので、数値計算上の誤差ではないですかね
(実質0として扱える)

 
下記のようにすれば、そのとても小さな数値の順番は最後になると思います

python

1a_eig = np.linalg.eig(correlation_matrix) 2print(a_eig[0])

↓ 変更

python

1a_eig = np.linalg.svd(correlation_matrix) 2print(a_eig[1])

投稿2021/09/15 01:30

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

負の値が出るということは、逆向きに影響するということです。

不思議でも何でもありません。

投稿2021/09/03 04:52

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2021/09/03 05:26 編集

> 固有値は言い換えるならば分散だと考えているので とのことなので、 「主成分分析においてある主成分の分散がそのままその主成分に対する固有値になり、 分散が非負であるので、主成分が負数になるのはおかしいのでは?」 という質問かと思います
reonald

2021/09/03 11:19

返信が遅れてしまって申し訳ございません。 自分の説明不足でした。 ozwkさんの理解で合っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問