เหตุใดฉันจึงไม่สามารถรับ 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)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=DS2=D
D

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

AA=(UDV)(UDV)=UDVVDU=UD2U
V
AA=VD2V.
DD2UV

ทางออก

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

UAV=U(UDV)V=(UU)D(VV)=D

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

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 ที่เป็นไปได้ (แต่ไม่เหมือนเดิม!)AA=(4)U=(1)D=(4)=(2)AA=(4)V=(1)

UDV=(1)(2)(1)=(2)A.
D=UAV=(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 ได้ ตัวอย่างเช่นหากคุณใช้เมทริกซ์มุมฉากแบบไม่ใช่เส้นทแยงมุมใด ๆ (เช่น )ผม ท่ามกลางทางเลือกที่เป็นไปได้ทั้งหมดสำหรับเมทริกซ์วิคเตอร์ของ , จะกลับจึงในกรณีนี้ไม่ได้เป็นเส้นทแยงมุมAAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

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

หากค่าเอกพจน์ทั้งหมดของแตกต่างกัน eigendecomposition จะไม่ซ้ำกัน (สูงถึงการปรับขนาด / สัญญาณ) และวิธีการทำงาน หมายเหตุ: มันเป็นยังไม่ได้เป็นความคิดที่ดีที่จะใช้มันในรหัสการผลิตบนคอมพิวเตอร์ที่มีลอยคำนวณจุดเพราะเมื่อคุณในรูปแบบผลิตภัณฑ์และผลการคำนวณอาจจะตกอกตกใจตามปริมาณของการสั่งซื้อของที่โดยที่คือความแม่นยำของเครื่อง หากขนาดของค่าเอกฐานแตกต่างกันอย่างมาก (มากกว่าโดยประมาณ) นี่จะเป็นอันตรายต่อความแม่นยำเชิงตัวเลขของค่าที่เล็กที่สุดAAAAAA2uu2×1016108

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


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

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