ทำไม Andrew Ng จึงต้องการใช้ SVD และไม่ใช่ EIG ของความแปรปรวนร่วมเพื่อทำ PCA


29

ฉันกำลังศึกษา PCA จากหลักสูตร Coursera ของ Andrew Ng และสื่ออื่น ๆ ในการมอบหมายครั้งแรกของ Stanford NLP แน่นอน cs224n และในวิดีโอการบรรยายจาก Andrew Ngพวกเขาทำการสลายตัวของค่าเอกพจน์แทนการสลายตัว eigenvector ของเมทริกซ์ความแปรปรวนร่วมและ Ng บอกว่า SVD มีความเสถียรเชิงตัวเลขมากกว่า eigendecomposition

จากความเข้าใจของฉันสำหรับ PCA เราควรทำ SVD ของเมทริกซ์ข้อมูล(m,n)ขนาดไม่ใช่เมทริกซ์ความแปรปรวนร่วมของ(n,n)ขนาด และการสลายตัวของไอเก็นเวกเตอร์ของเมทริกซ์ความแปรปรวนร่วม

ทำไมพวกเขาถึงทำ SVD ของเมทริกซ์ความแปรปรวนร่วมไม่ใช่เมทริกซ์ข้อมูล?


8
สำหรับเมทริกซ์ semidefinite บวกสมมาตรแบบจตุรัส (เช่นเมทริกซ์ความแปรปรวนร่วม), ค่า eigenvalue และค่าเอกพจน์จะเหมือนกันทุกประการ
อะมีบาพูดว่า Reinstate Monica

5
ฉันหมายถึงพวกมันเหมือนกันทางคณิตศาสตร์ ตัวเลขพวกเขาอาจใช้อัลกอริทึมที่แตกต่างกันและหนึ่งอาจมีเสถียรภาพมากกว่าอีก (ตามที่ Ng พูด) สิ่งนี้น่าสนใจที่จะทราบเพิ่มเติมเกี่ยวกับ +1
อะมีบาพูดว่า Reinstate Monica

4
ข้อมูลบางอย่างเกี่ยวกับเรื่องนี้ที่นี่: de.mathworks.com/matlabcentral/newsreader/view_thread/21268 แต่โปรดทราบว่าคำอธิบายใด ๆ เกี่ยวกับสาเหตุที่อัลกอริธึมหนึ่งจะเสถียรกว่าอีกอันหนึ่งนั้นจะเป็นเทคนิคมาก
อะมีบาพูดว่า Reinstate Monica

2
ใน Matlab x=randn(10000); x=x'*x; tic; eig(x); toc; tic; svd(x); toc;บนเครื่องของฉันแสดงผล 12 วินาทีสำหรับ eig () และ 26s สำหรับ svd () ถ้ามันช้ากว่านี้อย่างน้อยก็จะต้องมีเสถียรภาพมากขึ้น! :-)
อะมีบาพูดว่า Reinstate Monica

4
นั่นอาจเป็นไปตามความเข้าใจที่ไม่ถูกต้อง: การทำ SVD ของเมทริกซ์ข้อมูลนั้นเสถียรกว่าการใช้eigหรือsvdเมทริกซ์ความแปรปรวนร่วม แต่เท่าที่ฉันรู้ว่าไม่มีความแตกต่างอย่างมากระหว่างการใช้eigหรือsvdเมทริกซ์ความแปรปรวนร่วม --- ทั้งอัลกอริทึมเสถียรย้อนหลัง ถ้ามีอะไรฉันจะเอาเงินไปทำ eig ให้มีความเสถียรมากกว่าเพราะมันจะคำนวณน้อยลง
Federico Poloni

คำตอบ:


17

อะมีบาให้คำตอบที่ดีในความคิดเห็น แต่ถ้าคุณต้องการโต้แย้งอย่างเป็นทางการที่นี่มันไป

การสลายตัวตามตัวอักษรเอกพจน์ของเมทริกซ์คือโดยที่คอลัมน์ของคือ eigenvectors ของและรายการในแนวทแยงของเป็นรากที่สองของค่าลักษณะเฉพาะของมันนั่นคือTA)}= U Σ V T V T Σ σ ฉันฉัน = AA=UΣVTVATAΣσii=λi(ATA)

ที่คุณรู้ว่าส่วนประกอบหลักคือประมาณการมุมฉากของตัวแปรของคุณไปยังพื้นที่ของ eigenvectors ของเชิงประจักษ์แปรปรวนเมทริกซ์\ความแปรปรวนขององค์ประกอบที่จะได้รับจากค่าลักษณะเฉพาะของตนTA)λi(11n1ATAλi(1n1ATA)

พิจารณาใด ๆ ตารางเมทริกซ์ ,และเวกเตอร์ดังกล่าวว่าแลมบ์ดาวี แล้วก็อัลฟ่าR V B V = λ วีBαRvBv=λv

  1. Bkv=λkv
  2. λ(αB)=αλ(B)

ให้เรากำหนดSSVD ของจะคำนวณ eigendecomposition ของเพื่อให้ได้ผลลัพธ์SSTS=1S=1n1ATASSTS=1(n1)2ATAATA

  1. eigenvectors ของซึ่งโดยคุณสมบัติ 1 เป็นของA T A(ATA)TATA=ATAATAATA
  2. แควร์รูตของค่าลักษณะเฉพาะของซึ่งตามคุณสมบัติ 2 จากนั้น 1, 1 จากนั้น 2 อีกครั้งคือTA)1(n1)2ATAATA1(n1)2λi(ATAATA)=1(n1)2λi2(ATA)=1n1λi(ATA)=λi(1n1ATA)

Voila!

เกี่ยวกับความเสถียรเชิงตัวเลขเราจะต้องหาว่า alogrithms ที่ใช้คืออะไร หากคุณทำตามฉันเชื่อว่านี่เป็นกิจวัตร LAPACK ที่ใช้โดย numpy

อัปเดต: เกี่ยวกับความเสถียรการใช้งาน SVD ดูเหมือนว่าจะใช้วิธีการแบ่งและพิชิตในขณะที่ eigendecomposition ใช้อัลกอริทึม QR ธรรมดา ฉันไม่สามารถเข้าถึงเอกสาร SIAM ที่เกี่ยวข้องจากสถาบันของฉัน (ตำหนิการตัดทอนการวิจัย) แต่ฉันพบบางสิ่งที่อาจสนับสนุนการประเมินว่ารูทีน SVD มีเสถียรภาพมากขึ้น

ใน

Nakatsukasa, Yuji และ Nicholas J. Higham "การแยกสเปกตรัมและพิชิตอัลกอริธึมที่เสถียรและมีประสิทธิภาพสำหรับการสลายตัวของไอเกนค่าแบบสมมาตรและ SVD" วารสารสยามเกี่ยวกับการคำนวณทางวิทยาศาสตร์ 35.3 (2013): A1325-A1349

พวกเขาเปรียบเทียบความเสถียรของอัลกอริทึม eigenvalue ที่หลากหลายและดูเหมือนว่าวิธีการหารและพิชิต (พวกเขาใช้วิธีเดียวกับ numpy ในการทดลอง!) มีเสถียรภาพมากกว่าอัลกอริธึม QR สิ่งนี้พร้อมกับการอ้างสิทธิ์ในที่อื่น ๆ ว่าวิธีการของ D&C นั้นมีความเสถียรมากกว่าเดิมและรองรับการเลือกของ Ng


ค่าลักษณะเฉพาะที่ฉันได้รับจาก svd ในความแปรปรวนร่วมและ svd กับข้อมูลที่มีค่าเฉลี่ยอยู่ในศูนย์ไม่เหมือนกัน
theGD

อย่างไรก็ตามคะแนนนั่นคือ X * V (โดยที่ V ได้มาจาก [U, S, V] = svd (x) หรือ svd (covx)) เหมือนกัน
theGD

1
@theGD ค่าลักษณะเฉพาะของ COV (X) และค่านิยมของเอกพจน์ (X) จะไม่เหมือนกันดูstats.stackexchange.com/questions/134282
อะมีบาพูดว่า Reinstate Monica

ไม่จำเป็นต้องสิ้นหวัง wrt ขาดการเข้าถึงวารสารสยาม: กระดาษที่คุณอ้างถึงอยู่ที่นี่: opt.mist.iu-tokyo.ac.jp/~nakatsukasa/publishedpdf/pub13.pdf
Dima Pasechnik

2
@broncoAbierto เทคโนโลยี รายงานอยู่ที่นี่: cpsc.yale.edu/sites/default/files/f9/32.pdf (หนึ่งอาจไม่สามารถหาได้ง่ายเนื่องจากพิมพ์ "Symetric" ในชื่อเรื่องในcpsc.yale.edu/research/technical-reports / 1992-technical-reports :-))
Dima Pasechnik

12

@amoeba มีคำตอบที่ยอดเยี่ยมสำหรับคำถาม PCA รวมถึงเรื่องนี้เกี่ยวกับ SVD ถึง PCA ตอบคำถามของคุณแน่นอนฉันจะให้สามคะแนน:

  • ในทางคณิตศาสตร์ไม่มีความแตกต่างไม่ว่าคุณจะคำนวณ PCA บนเมทริกซ์ข้อมูลโดยตรงหรือบนเมทริกซ์ความแปรปรวนร่วม
  • ความแตกต่างนั้นเกิดจากความแม่นยำและความซับซ้อนของตัวเลข การใช้การใช้ SVD โดยตรงกับเมทริกซ์ข้อมูลนั้นมีเสถียรภาพมากกว่าตัวเลขกับเมทริกซ์ความแปรปรวนร่วม
  • SVD สามารถนำไปใช้กับเมทริกซ์ความแปรปรวนร่วมเพื่อทำการ PCA หรือรับค่าไอเก็นอันที่จริงแล้วมันเป็นวิธีที่ฉันโปรดปรานในการแก้ปัญหาไอเก็น

ปรากฎว่า SVD นั้นมีความเสถียรมากกว่าขั้นตอนการสลายตัวของไอคิกแวลูแบบทั่วไป ในการเรียนรู้ของเครื่องมันเป็นเรื่องง่ายที่จะจบลงด้วย regressors collinear สูง SVD ทำงานได้ดีขึ้นในกรณีเหล่านี้

นี่คือรหัสไพ ธ อนเพื่อสาธิตจุด ฉันสร้างเมทริกซ์ข้อมูล collinear สูงรับเมทริกซ์ความแปรปรวนร่วมและพยายามหาค่าลักษณะเฉพาะของหลัง SVD ยังคงใช้งานได้ในขณะที่การสลายตัวของไอจีนธรรมดาล้มเหลวในกรณีนี้

import numpy as np
import math
from numpy import linalg as LA

np.random.seed(1)

# create the highly collinear series
T = 1000
X = np.random.rand(T,2)
eps = 1e-11
X[:,1] = X[:,0] + eps*X[:,1]

C = np.cov(np.transpose(X))
print('Cov: ',C)

U, s, V = LA.svd(C)
print('SVDs: ',s)

w, v = LA.eig(C)
print('eigen vals: ',w)

เอาท์พุท:

Cov:  [[ 0.08311516  0.08311516]
 [ 0.08311516  0.08311516]]
SVDs:  [  1.66230312e-01   5.66687522e-18]
eigen vals:  [ 0.          0.16623031]

ปรับปรุง

ตอบรับความคิดเห็นของ Federico Poloni นี่คือรหัสที่มีการทดสอบความเสถียรของ SVD กับ Eig ในตัวอย่างสุ่ม 1,000 ตัวอย่างของเมทริกซ์เดียวกันข้างต้น ในหลายกรณี Eig แสดง 0 ค่าไอเกนขนาดเล็กซึ่งจะนำไปสู่ภาวะเอกฐานของเมทริกซ์และ SVD ไม่ได้ทำที่นี่ SVD มีความแม่นยำมากขึ้นเกี่ยวกับการกำหนดค่าไอเก็ตขนาดเล็กเป็นสองเท่าซึ่งอาจมีหรือไม่มีความสำคัญขึ้นอยู่กับปัญหาของคุณ

import numpy as np
import math
from scipy.linalg import toeplitz
from numpy import linalg as LA

np.random.seed(1)

# create the highly collinear series
T = 100
p = 2
eps = 1e-8

m = 1000 # simulations
err = np.ones((m,2)) # accuracy of small eig value
for j in range(m):
    u = np.random.rand(T,p)
    X = np.ones(u.shape)
    X[:,0] = u[:,0]
    for i in range(1,p):
        X[:,i] = eps*u[:,i]+u[:,0]

    C = np.cov(np.transpose(X))

    U, s, V = LA.svd(C)

    w, v = LA.eig(C)

    # true eigen values
    te = eps**2/2 * np.var(u[:,1])*(1-np.corrcoef(u,rowvar=False)[0,1]**2)
    err[j,0] = s[p-1] - te
    err[j,1] = np.amin(w) - te


print('Cov: ',C)
print('SVDs: ',s)
print('eigen vals: ',w)
print('true small eigenvals: ',te)

acc = np.mean(np.abs(err),axis=0)    
print("small eigenval, accuracy SVD, Eig: ",acc[0]/te,acc[1]/te)

เอาท์พุท:

Cov:  [[ 0.09189421  0.09189421]
 [ 0.09189421  0.09189421]]
SVDs:  [ 0.18378843  0.        ]
eigen vals:  [  1.38777878e-17   1.83788428e-01]
true small eigenvals:  4.02633695086e-18
small eigenval, accuracy SVD, Eig:  2.43114702041 3.31970128319

รหัสที่นี่รหัสทำงาน แทนที่จะสร้างเมทริกซ์ความแปรปรวนร่วมแบบสุ่มเพื่อทดสอบรูทีนฉันกำลังสร้างเมทริกซ์ข้อมูลแบบสุ่มด้วยตัวแปรสองตัว: โดยที่ - ตัวแปรสุ่มแบบอิสระที่เป็นอิสระ ดังนั้นเมทริกซ์ความแปรปรวนร่วมคือ ที่ - ความหลากหลายของเครื่องแบบและความสัมพันธ์ระหว่างค่าสัมประสิทธิ์ พวกเขา

x1=ux2=u+εv
u,v
(σ12σ12+ερσ1σ2σ12+ερσ1σ2σ12+2ερσ1σ2+ε2σ22σ2)
σ12,σ22,ρ

ค่าลักษณะเฉพาะที่เล็กที่สุด: ค่าลักษณะเฉพาะขนาดเล็กไม่สามารถคำนวณได้โดยเพียงเสียบเข้ากับสูตรเนื่องจากความแม่นยำที่ จำกัด ดังนั้นคุณต้องขยาย Taylor:

λ=12(σ22ε2σ24ε4+4σ23ρσ1ε3+8σ22ρ2σ12ε2+8σ2ρσ13ε+4σ14+2σ2ρσ1ε+2σ12)
ε
λσ22ε2(1ρ2)/2

ผมทำงานจำลองของความเข้าใจของเมทริกซ์ข้อมูลในการคำนวณค่าลักษณะเฉพาะของการจำลองความแปรปรวนเมทริกซ์และได้รับข้อผิดพลาดe_jλJ = λ - λเจj=1,,mλ^jej=λλ^j


4
ใช่ แต่นี่ OP ถูกถามเกี่ยวกับ SVD VS EIG ใช้ทั้งเมทริกซ์ความแปรปรวนร่วม
อะมีบาพูดว่า Reinstate Monica

1
@ amoeba ฉันอธิบายความสัมพันธ์ของ SVD และ PCA
Aksakal

นี่เป็นคำตอบที่ดี ฉันหวังว่าจะพูดถึงอย่างไร svd ที่ไม่สามารถตรวจจับค่าลักษณะเชิงลบเมื่อมีและคุณต้องการที่จะเห็นพวกเขา (ถ้าเมทริกซ์ความแปรปรวนร่วมไม่ได้ต้นฉบับ แต่เป็นพูดเรียบหรือประมาณอย่างใดอย่างหนึ่งหรืออนุมานหรือออกมา ของค่าที่หายไป) ยิ่งไปกว่านั้น eig บน cov matrix ยังเร็วกว่า svd เล็กน้อย
ttnphns

@ttnphns ไม่ใช่เมทริกซ์แน่นอนที่เป็นบวกแน่นอน
Aksakal

1
@FedericoPoloni บน FP ทางคณิตศาสตร์และไม่ทราบคำตอบที่แน่นอนฉันไม่เห็นด้วย ในกรณีนี้ฉันรู้คำตอบอย่างแม่นยำเพียงพอสำหรับงานนี้ ใน 2x2 คุณมีจุดพอใช้ ฉันจะคิดถึงบางสิ่ง
Aksakal

6

สำหรับผู้ใช้ Python ฉันต้องการชี้ให้เห็นว่าสำหรับเมทริกซ์สมมาตร (เช่นเมทริกซ์ความแปรปรวนร่วม) มันจะดีกว่าที่จะใช้numpy.linalg.eighฟังก์ชั่นแทนnumpy.linalg.eigฟังก์ชั่นทั่วไป

eighเร็วกว่าeigคอมพิวเตอร์ของฉัน9-10 เท่า(โดยไม่คำนึงถึงขนาดเมทริกซ์) และมีความแม่นยำที่ดีกว่า (จากการทดสอบความแม่นยำของ @ Aksakal)

ฉันไม่มั่นใจในการสาธิตประโยชน์ความถูกต้องของ SVD ที่มีค่าลักษณะเฉพาะขนาดเล็ก การทดสอบ @ Aksakal มีขนาด 1-2 คำสั่งที่มีความไวต่อสถานะการสุ่มมากกว่าอัลกอริธึม หมายความว่าข้อผิดพลาดเล็ก ๆ ในเมทริกซ์ความแปรปรวนร่วมจะมีผลต่อความแม่นยำมากกว่าทางเลือกของอัลกอริทึม eigendecomposition นอกจากนี้สิ่งนี้ไม่เกี่ยวข้องกับคำถามหลักซึ่งเกี่ยวกับ PCA ส่วนประกอบที่เล็กที่สุดจะถูกละเว้นใน PCA

อาร์กิวเมนต์ที่คล้ายกันสามารถทำเกี่ยวกับเสถียรภาพเชิงตัวเลข ถ้าผมต้องใช้วิธีการแปรปรวนเมทริกซ์สำหรับ PCA ผมจะย่อยสลายด้วยแทนeigh svdหากล้มเหลว (ซึ่งยังไม่ได้แสดงที่นี่) อาจเป็นเพราะคุณคิดใหม่ถึงปัญหาที่คุณพยายามแก้ไขก่อนเริ่มมองหาอัลกอริทึมที่ดีกว่า


+1 ข้อมูลบางอย่างเกี่ยวeighกับ vs eig: mail.scipy.org/pipermail/numpy-discussion/2006-March/ …
อะมีบาพูดว่า Reinstate Monica

2

mnmn

การคำนวณเมทริกซ์ความแปรปรวนร่วมจากนั้นทำการคำนวณ SVD บนนั้นจะเร็วกว่าการคำนวณ SVD บนเมทริกซ์ข้อมูลแบบเต็มภายใต้เงื่อนไขเหล่านี้เพื่อผลลัพธ์เดียวกัน

แม้ค่าขนาดค่อนข้างเล็ก แต่ประสิทธิภาพที่เพิ่มขึ้นนั้นเป็นปัจจัยหลักพัน (มิลลิวินาทีเทียบกับวินาที) ฉันทำการทดสอบสองสามครั้งบนเครื่องของฉันเพื่อเปรียบเทียบโดยใช้ Matlab: ป้อนคำอธิบายรูปภาพที่นี่

นั่นเป็นเพียงเวลาของ CPU แต่ความต้องการในการจัดเก็บข้อมูลมีความสำคัญเช่นกัน ถ้าคุณลอง SVD เป็นล้านโดยเมทริกซ์หนึ่งพันใน Matlab มันจะผิดพลาดโดยปริยายเพราะมันต้องการขนาดอาเรย์ทำงานที่ 7.4TB


นี้ไม่ได้ตอบคำถามที่เป็นเรื่องเกี่ยวกับ EIG ของ SVD COV เมทริกซ์กับของเมทริกซ์ความแปรปรวนร่วม
อะมีบาพูดว่า Reinstate Monica

1
คำถามของเขาในตอนท้ายเน้นด้วยตัวหนารัฐ "ทำไมพวกเขาจึงทำ SVD ของเมทริกซ์ความแปรปรวนร่วมไม่ใช่เมทริกซ์ข้อมูล" ซึ่งฉันตอบ
Gruff

ฉันจะแก้ไขประโยคเปิดเพื่อให้ชัดเจนฉันตอบคำถามในส่วนของ OP ฉันเห็นว่ามันอาจทำให้สับสน ขอบคุณ
ห้าว

หากคุณลอง SVD เป็นล้านโดยพันเมทริกซ์ใน Matlab มันจะผิดพลาดโดยค่าเริ่มต้นการปฏิบัติที่เป็นตัวเลขที่ดีคือการใช้ SVD แบบบางในกรณีนี้ สิ่งนี้จะปรับปรุงขนาดและประสิทธิภาพของพื้นที่เก็บข้อมูลอย่างมากมาย
Federico Poloni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.