अजगर में एक डरावना साजिश कैसे आकर्षित करें? [बन्द है]


11

मैं एक मैट्रिक्स पर विलक्षण वेक्टर अपघटन का उपयोग कर रहा हूं और यू, एस और वीटी मैट्रिसेस प्राप्त कर रहा हूं। इस बिंदु पर, मैं बनाए रखने के लिए आयामों की संख्या के लिए एक सीमा चुनने की कोशिश कर रहा हूं। मुझे एक डरावनी साजिश को देखने का सुझाव दिया गया था लेकिन मैं सोच रहा था कि इसे सुन्न में कैसे साजिश रचूं। वर्तमान में, मैं अजगर में सुन्न और डरावना पुस्तकालयों का उपयोग कर रहा हूं:

U, S, Vt = svd(A)

कोई सुझाव?


1
के विकर्ण ले लो S, अगर यह पहले से ही एक विकर्ण नहीं है, तो इसे वर्ग करें, इसे घटते क्रम में क्रमबद्ध करें, संचयी राशि लें, अंतिम मान से विभाजित करें, फिर इसे प्लॉट करें।
shabbychef

@ शब्बीशेफ: आपका मतलब है, संचयी राशि लेना और सभी मूल्यों के योग द्वारा विभाजित करना सही है?
लीजेंड

हाँ। 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 आपके समय के लिए धन्यवाद! मुझे पता है कि यह एक लंबा समय रहा है, लेकिन फिर भी यह वास्तव में अच्छा है :)
किंवदंती

क्या है num_vars? यह आपकी स्क्रिप्ट में परिभाषित नहीं लगता है।
TheChymera

@ TheChymera - इसे पकड़ने के लिए धन्यवाद, मैंने अपनी प्रतिक्रिया अपडेट कर दी है।
जोश हेमन

@ जोश हेमन, हाँ, मैंने भी इस समय का पता लगा लिया है - लेकिन मुझे लगता है कि ए के आकार से इसकी गणना करना बेहतर हो सकता है
TheChymera

1
@ जोशमन्न आप इसे समझा सकते हैं: ईग्वल्स = एस ** 2 / np.cumsum (एस) [- 1] ?? मैंने कुछ कागज़ों के आधार पर देखा है eigvals = S ** 2 / (n-1) जहाँ n की विशेषता है
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.