วิธีการวาดพล็อตหินกรวดในงูหลาม? [ปิด]


11

ฉันกำลังใช้การแยกตัวของเวคเตอร์เอกพจน์บนเมทริกซ์และรับเมทริกซ์ U, S และ Vt ณ จุดนี้ฉันพยายามเลือกเกณฑ์สำหรับจำนวนมิติข้อมูลที่จะเก็บไว้ ฉันแนะนำให้ดูที่แปลงหินกรวด แต่ฉันสงสัยว่าจะไปเกี่ยวกับการวางแผนในจำนวนมาก ขณะนี้ฉันกำลังทำสิ่งต่อไปนี้โดยใช้ไลบรารี numpy และ scipy ใน python:

U, S, Vt = svd(A)

ข้อเสนอแนะใด ๆ


1
ใช้เส้นทแยงมุมของS, ถ้ามันไม่ได้เป็นแนวทแยง, กำลังสองมัน, เรียงมันตามลำดับที่ลดลง, หาผลรวมสะสม, หารด้วยค่าสุดท้าย, แล้วพล็อตมัน
shabbychef

@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 - ขอบคุณที่ติดตามฉันได้อัปเดตการตอบสนองของฉัน
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.