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

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

ただいまの
回答率

87.61%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 81

score 27

上記のコードで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]
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jbpb0

    2021/09/03 15:30 編集

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

    キャンセル

  • jbpb0

    2021/09/03 15: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 20:18

    返信が遅れてしまって申し訳ございません。
    計算上の誤差ということも考えたのですが,それであれば32個目の固有値ももっと小さくなるのではという疑問も生じております。

    固有値を求める際に,分散共分散行列を用いるか,相関行列を用いるかは,標準偏差で正規化するかどうかなので,固有値の正負には関わってこないのであまり深く考えていませんでした。

    キャンセル

  • jbpb0

    2021/09/05 12:06

    > 32個目の固有値ももっと小さくなるのでは

    correlation_matrix = np.corrcoef(img0.transpose())
    a_eig2 = np.linalg.svd(correlation_matrix)
    print(a_eig2[1])

    なら、大→小の順番に並んで、ほぼ0が最後に来るのではないですかね

    キャンセル

回答 2

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/09/03 14:19 編集

    > 固有値は言い換えるならば分散だと考えているので

    とのことなので、

    「主成分分析においてある主成分の分散がそのままその主成分に対する固有値になり、
    分散が非負であるので、主成分が負数になるのはおかしいのでは?」

    という質問かと思います

    キャンセル

  • 2021/09/03 20:19

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

    キャンセル

0

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

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

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

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


↓ 変更

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る