Pythonで画面プロットを描画する方法は?[閉まっている]


11

行列で特異ベクトル分解を使用して、U、S、およびVt行列を取得しています。この時点で、保持する次元数のしきい値を選択しようとしています。スクリープロットを見るよう提案されましたが、それを乱暴にプロットする方法について疑問に思っています。現在、私はpythonでnumpyおよびscipyライブラリを使用して以下を実行しています。

U, S, Vt = svd(A)

助言がありますか?


1
の対角を取り、Sそれがまだ対角でない場合は、それを2乗し、降順で並べ替え、累積合計を取り、最後の値で除算してからプロットします。
シャビーシェフ、2011

@shabbychef:つまり、累積合計を取り、すべての値の合計で割ります。
レジェンド

はい。matlabでは、それは[U,S,V] = svd(X);S = cumsum(sort(diag(S).^2,1,'descend'));S = S ./ S(end);plot(S);
shabbychef '10 / 07/11

回答:


13

以下は、IPythonプロンプトに貼り付けて、以下のような画像を生成する例です(ランダムデータを使用しています)。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

#Make a random array and then make it positive-definite
num_vars = 6
num_obs = 9
A = np.random.randn(num_obs, num_vars)
A = np.asmatrix(A.T) * np.asmatrix(A)
U, S, V = np.linalg.svd(A) 
eigvals = S**2 / np.sum(S**2)  # NOTE (@amoeba): These are not PCA eigenvalues. 
                               # This question is about SVD.

fig = plt.figure(figsize=(8,5))
sing_vals = np.arange(num_vars) + 1
plt.plot(sing_vals, eigvals, 'ro-', linewidth=2)
plt.title('Scree Plot')
plt.xlabel('Principal Component')
plt.ylabel('Eigenvalue')
#I don't like the default legend so I typically make mine like below, e.g.
#with smaller fonts and a bit transparent so I do not cover up data, and make
#it moveable by the viewer in case upper-right is a bad place for it 
leg = plt.legend(['Eigenvalues from SVD'], loc='best', borderpad=0.3, 
                 shadow=False, prop=matplotlib.font_manager.FontProperties(size='small'),
                 markerscale=0.4)
leg.get_frame().set_alpha(0.4)
leg.draggable(state=True)
plt.show()

ここに画像の説明を入力してください


ヘルマン:+1お時間をいただき、ありがとうございます!久しぶりのことですが、これは本当に良いことです:)
レジェンド

なにnum_vars?スクリプトで定義されていないようです。
TheChymera 14

@TheChymera-これをキャッチしてくれてありがとう、私は私の応答を更新しました。
Josh Hemann 2014

@ジョシュ・ヘマンええ、私はこの間にもこれを理解しました-しかし、私はAの形から計算する方が良いかもしれないと思います
TheChymera

1
@JoshHemannはこれを説明できます:eigvals = S ** 2 / np.cumsum(S)[-1] ?? 私はいくつかの論文eigvals = S ** 2 /(n-1)に基づいて見てきました。ここで、nは特徴の数です
makis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.