เหตุใดฉันจึงไม่สามารถรับ SVD ที่ถูกต้องของ X ผ่านการสลายตัว eigenvalue ของ XX 'และ X'X


9

ฉันพยายามทำ SVD ด้วยมือ:

m<-matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U=eigen(m%*%t(m))$vector
V=eigen(t(m)%*%m)$vector
D=sqrt(diag(eigen(m%*%t(m))$values))

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d)

U1%*%D1%*%t(V1)
U%*%D%*%t(V)

แต่บรรทัดสุดท้ายไม่กลับmมา ทำไม? ดูเหมือนว่าจะมีบางอย่างที่เกี่ยวข้องกับสัญญาณของ eigenvector ...


ดูstats.stackexchange.com/search?q=svd+sign
— whuber

ฉันบอกซ้ำแล้วซ้ำอีกว่าสัญญาณไม่สำคัญใน
— SVD

@ Amoeba ขอบคุณสำหรับการชี้แจงว่า ฉันเน้นคำถามภาษาอังกฤษมากกว่ารหัส Failedstatistician: ดูว่าอะไรD=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))และจำไว้ว่าสแควร์รูท (เช่นเดียวกับไอแกนิคเวกเตอร์ปกติ) ถูกกำหนดขึ้นเพื่อลงชื่อเท่านั้น สำหรับข้อมูลเชิงลึกมากขึ้นการเปลี่ยนแปลงmไปm <- matrix(-2,1,1)และรวมถึงในตอนท้ายของแต่ละสายไปยัง,1,1) diagนี่คือตัวอย่างที่สร้างปัญหาเดียวกัน - แต่มันง่ายมากลักษณะของปัญหาจะชัดเจนโดยสิ้นเชิง 1×1
— whuber

1
เข้าใจแล้ว ขอบคุณ! คุณมีกฎทั่วไปในการพิจารณาเวกเตอร์ c (-1, 1, 1) หรือไม่? หรือว่าสัญญาณของการสลายตัวทั้งสองนั้นควรเชื่อมโยงกันอย่างไร?
— ล้มเหลวนักสถิติ

1
โปรดทราบว่าเคล็ดลับของ @ whuber กับการc(-1,1,1)ทำงาน แต่Dกำหนดเช่นนั้นจะไม่ให้คุณค่าเอกพจน์ ค่าเอกพจน์ทั้งหมดต้องเป็นค่าบวกตามคำจำกัดความ คำถามของการเชื่อมโยงสัญญาณของUและVเป็นสิ่งที่ดีและฉันไม่มีคำตอบ ทำไมคุณไม่ทำ SVD :-)
— อะมีบา

คำตอบ:


13

การวิเคราะห์ปัญหา

SVD ของเมทริกซ์นั้นไม่ซ้ำใคร ปล่อยให้เมทริกซ์มีมิติและปล่อยให้ SVD เป็นAn×k

A=UDV′

สำหรับเมทริกซ์มีคอลัมน์ orthonormal เป็นเส้นทแยงมุมเมทริกซ์กับรายการที่ไม่เป็นลบและเมทริกซ์กับคอลัมน์ orthonormaln×pUp×pDk×pV

ตอนนี้เลือกโดยพลการใด ๆ ในแนวทแยงเมทริกซ์มี s ในแนวทแยงเพื่อให้เป็นตัวตนI_pแล้วก็p×pS±1S2=Ip×pIp

A=UDV′=UIDIV′=U(S2)D(S2)V′=(US)(SDS)(VS)′

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

(US)′(US)=S′U′US=S′IpS=S′S=S2=Ip
USVSSD
SDS=DS2=D
D

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

AA′=(UDV′)(UDV′)′=UDV′VD′U′=UD2U′
V
A′A=VD2V′.
DD2UV

ทางออก

แต่หลังจากค้นหาและดังกล่าวแล้วให้ใช้เพื่อคำนวณUV

U′AV=U′(UDV′)V=(U′U)D(V′V)=D

โดยตรงและมีประสิทธิภาพ ค่าในแนวทแยงของนี้ไม่จำเป็นต้องเป็นค่าบวก D (นั่นเป็นเพราะไม่มีอะไรเกี่ยวกับกระบวนการ diagonalizingหรือที่จะรับประกันได้ว่าเนื่องจากกระบวนการทั้งสองได้ดำเนินการแยกต่างหาก) ทำให้พวกเขาเป็นบวกโดยเลือกรายการตามแนวทแยงมุมของเพื่อให้เท่ากับสัญญาณของรายการเพื่อให้มีค่าบวกทั้งหมด ชดเชยสิ่งนี้โดยการคูณด้วย :A′AAA′SDSDUS

A=UDV′=(US)(SD)V′.

นั่นคือแผนกบริการ

ตัวอย่าง

ให้กับ2) SVD คือn=p=k=1A=(−2)

(−2)=(1)(2)(−1)

กับ ,และ1)U=(1)D=(2)V=(−1)

หากคุณ diagonalizeที่คุณจะเลือกธรรมชาติและ(2) ในทำนองเดียวกันถ้าคุณ diagonalizeคุณจะเลือก(1) น่าเสียดายแทนให้คำนวณ เพราะนี่เป็นลบชุด1) ปรับนี้ไปและเพื่อ(2) คุณได้รับซึ่งเป็นหนึ่งในสอง SVD ที่เป็นไปได้ (แต่ไม่เหมือนเดิม!)A′A=(4)U=(1)D=(4)=(2)AA′=(4)V=(1)

UDV′=(1)(2)(1)=(2)≠A.
D=U′AV=(1)′(−2)(1)=(−2).
S=(−1)UUS=(1)(−1)=(−1)DSD=(−1)(−2)=(2)
A=(−1)(2)(1),

รหัส

นี่คือรหัสแก้ไข เอาท์พุทมันยืนยัน

  1. วิธีการสร้างใหม่mอย่างถูกต้อง
  2. UและยังคงมีความเหมือนจริงV
  3. แต่ผลที่ได้คือไม่ได้ SVD svdเดียวกันกลับโดย (ทั้งคู่มีความถูกต้องเท่ากัน)
m <- matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U <- eigen(tcrossprod(m))$vector
V <- eigen(crossprod(m))$vector
D <- diag(zapsmall(diag(t(U) %*% m %*% V)))
s <- diag(sign(diag(D)))  # Find the signs of the eigenvalues
U <- U %*% s              # Adjust the columns of U
D <- s %*% D              # Fix up D.  (D <- abs(D) would be more efficient.)

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d,n,n)

zapsmall(U1 %*% D1 %*% t(V1)) # SVD
zapsmall(U %*% D %*% t(V))    # Hand-rolled SVD
zapsmall(crossprod(U))        # Check that U is orthonormal
zapsmall(tcrossprod(V))       # Check that V' is orthonormal

1
+1 ชัดเจนมาก ฉันเพียงจะเพิ่มว่าในทางปฏิบัติมันพอที่จะคำนวณอย่างใดอย่างหนึ่งUหรือแล้วที่จะได้รับเมทริกซ์อื่นผ่านคูณด้วยV Aวิธีนี้ดำเนินการเพียงหนึ่ง (แทนที่จะเป็นสอง) eigendecompositions และสัญญาณจะออกมาทางขวา
— อะมีบา

2
@ Amoeba ถูกต้อง: ด้วยจิตวิญญาณของการใช้คอมพิวเตอร์ SVD ซึ่งเห็นได้ชัดว่าเป็นการออกกำลังกายเพื่อการศึกษาไม่มีความสนใจเลยที่นี่เพื่อประสิทธิภาพ
— whuber

2
ขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันคิดว่าฉันเข้าใจปัญหานี้ (ในที่สุด)
— Failstatistician

3
@Federico ขอบคุณสำหรับการเตือนว่า คุณค่อนข้างถูกต้อง - ฉันได้สันนิษฐานว่าค่าลักษณะเฉพาะทั้งหมดนั้นแตกต่างกันอย่างชัดเจนเพราะที่จริงแล้วเกือบจะเป็นกรณีในแอปพลิเคชั่นทางสถิติ
— whuber

3
คุณถูกต้องนี่เป็นเพียงกรณีขอบเท่านั้น ในความรู้สึกบางอย่างก็คือการประกาศของปัญหาเดียวกันอื่นที่คุณร่างในคำตอบของคุณว่าวิธีนี้ไม่แน่ใจว่ามีการ "จับคู่" ระหว่างคอลัมน์ของและVการคำนวณ SVD จาก eigendecompositions ยังคงเป็นตัวอย่างการเรียนรู้ที่ยอดเยี่ยม UV
— Federico Poloni

5

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

ปัญหาคืออาจมีค่าลักษณะเฉพาะซ้ำ ๆ กันและในกรณีนี้ eigendecomposition ของและไม่ซ้ำกันและไม่สามารถใช้ตัวเลือกทั้งหมดของและเพื่อดึงค่าปัจจัยทแยงมุมของ SVD ได้ ตัวอย่างเช่นหากคุณใช้เมทริกซ์มุมฉากแบบไม่ใช่เส้นทแยงมุมใด ๆ (เช่น )ผม ท่ามกลางทางเลือกที่เป็นไปได้ทั้งหมดสำหรับเมทริกซ์วิคเตอร์ของ , จะกลับจึงในกรณีนี้ไม่ได้เป็นเส้นทแยงมุมA′AAA′UVA=[3/54/5−4/53/5]AA′=A′A=IIeigenU=V=IU′AV=A

โดยสังหรณ์ใจนี่เป็นอีกอาการหนึ่งของปัญหาเดียวกันที่ @whuber สรุปว่าจะต้องมี "การจับคู่" ระหว่างคอลัมน์ของและและการคำนวณ eigendecompositions สองรายการแยกกันไม่แน่ใจUV

หากค่าเอกพจน์ทั้งหมดของแตกต่างกัน eigendecomposition จะไม่ซ้ำกัน (สูงถึงการปรับขนาด / สัญญาณ) และวิธีการทำงาน หมายเหตุ: มันเป็นยังไม่ได้เป็นความคิดที่ดีที่จะใช้มันในรหัสการผลิตบนคอมพิวเตอร์ที่มีลอยคำนวณจุดเพราะเมื่อคุณในรูปแบบผลิตภัณฑ์และผลการคำนวณอาจจะตกอกตกใจตามปริมาณของการสั่งซื้อของที่โดยที่คือความแม่นยำของเครื่อง หากขนาดของค่าเอกฐานแตกต่างกันอย่างมาก (มากกว่าโดยประมาณ) นี่จะเป็นอันตรายต่อความแม่นยำเชิงตัวเลขของค่าที่เล็กที่สุดAA′AAA′‖A‖2uu≈2×10−1610−8

การคำนวณ SVD จาก eigendecompositions ทั้งสองเป็นตัวอย่างการเรียนรู้ที่ยอดเยี่ยม แต่ในการใช้งานในชีวิตจริงมักใช้svdฟังก์ชั่นของ R เพื่อคำนวณการสลายตัวของค่าเอกพจน์


1
ความคิดเห็นนี้เป็นคำแนะนำที่ดี โปรดทราบว่าหัวข้อนี้ไม่เกี่ยวข้องกับวิธีการคำนวณ SVD ที่เหมาะสม (และฉันเชื่อว่าไม่มีใครโต้แย้งข้อเสนอแนะของคุณ) OP ยอมรับโดยปริยายว่าsvdใช้ได้ผล แท้จริงแล้วพวกเขาใช้มันเป็นมาตรฐานเปรียบเทียบกับการคำนวณด้วยมือซึ่งมีวัตถุประสงค์เพื่อตรวจสอบความเข้าใจไม่ใช่เพื่อแทนที่svdด้วยวิธีใด ๆ
— whuber

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