파이썬에서 scree plot을 그리는 방법은 무엇입니까? [닫은]


11

행렬에서 특이 벡터 분해를 사용하고 U, S 및 Vt 행렬을 얻고 있습니다. 이 시점에서 유지할 차원 수에 대한 임계 값을 선택하려고합니다. 나는 scree plot을 보라고 제안했지만 numpy로 플롯하는 방법에 대해 궁금합니다. 현재 파이썬에서 numpy 및 scipy 라이브러리를 사용하여 다음을 수행하고 있습니다.

U, S, Vt = svd(A)

어떤 제안?


1
대각선 S이 아닌 경우 대각선을 취하고 , 정사각형으로, 내림차순으로 정렬하고, 누적 합계를 취하고, 마지막 값으로 나눈 다음 플로팅합니다.
shabbychef

@ shabbychef : 당신은 누적 합계를 취하고 모든 값의 합계로 나눕니다.
Legend

예. matlab에서,[U,S,V] = svd(X);S = cumsum(sort(diag(S).^2,1,'descend'));S = S ./ S(end);plot(S);
shabbychef

답변:


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 시간 내 주셔서 감사합니다! 오랜 시간이 걸렸지 만 그럼에도 불구하고 이것이 정말 좋습니다 :)
Legend

무엇 num_vars입니까? 스크립트에 정의되지 않은 것 같습니다.
TheChymera

@TheChymera-이것을 잡아 주셔서 감사합니다, 나는 내 응답을 업데이트했습니다.
Josh Hemann

@Josh Hemann 그래, 나는 또한 이것을 평균 시간에 알아 냈지만-A의 모양에서 계산하는 것이 더 좋을 것이라고 생각합니다.
TheChymera

1
@JoshHemann 당신은 이것을 설명 할 수 있습니다 : eigvals = S ** 2 / np.cumsum (S) [-1] ?? 나는 몇 가지 논문 eigvals = S ** 2 / (n-1)을 기반으로 보았습니다. 여기서 n은 기능의 수입니다.
seralouk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.