นี่คือ ความสัมพันธ์ระหว่างการหา eigenvector, eigenvalue ของ AAT กับ SVD ของ A
ในที่นี้ เราได้
ทำไมเป็นอย่างนั้น
ข้างล่างนี่คือ พิสูจน์ จากเวป MIT นะจ๊ะ
เราจะสามารถหา eigenvector, eigenvalue ของ AAT โดยใช้ SVD ของ A ได้
และในขณะเดียวกัน
เราก็สามารถ หา U, S, V ซึ่งเป็น component ที่ได้จาก SVD ของ A โดยใช้ eigenvector, eigenvalue ของ AAT ได้เหมือนกัน
ในที่นี้ เราจะลองหา eigenvector, eigenvalue ของ AAT โดยใช้ SVD ของ A โดยใช้ python code ในการ present นะจ้ะ ถ้ารู้เรื่องแล้วจะทำกลับกันก็ไม่ยากแล้วล่ะ
เนื่องจากมันไม่ใช่หา eigenvector, eigenvalue ของ A แต่เป็น eigenvector, eigenvalue ของ AAT เชียวนะ
มันจะมีที่บังเอิญให้ใช้หรอไอ้ AAT เนี่ย
ไม่ต้อง งง ว่า ชาตินี้ เราจะได้ใช้เร๊อะ มันมีที่ให้ใช้ละกัน ที่ให้ใช้จะเล่าให้ฟัง ใน บล็อก โพส ต่อๆ ไปน้ะจ้ะ
ย้อนนิดหนึ่งสำหรับ SVD decomposition
Anxp= Unxn Snxp VTpxp
เมื่อ U, V เป็น Orthogonal Matrix
Anxp= Unxn Snxp VTpxp
เมื่อ U, V เป็น Orthogonal Matrix
ยกตัวอย่างให้เหมือน tutorial ของ MIT ซะเลย
from numpy import *ถ้าเราทำตรงๆ คือ หา eigenvector, eigenvalue ของ AAT สามารถทำได้ดังนี้
x = array([[2, 4],
[1, 3],
[0, 0],
[0, 0]])
x_x_T = dot(x, x.T)ก็จะได้ eigenvector, eigenvalue มาเรียบร้อยแล้ว
(eigvals, eigvecs) = linalg.eig(x_x_T)
print eigvals
print eigvecs
ในที่นี้ เราได้
eigenvalue = [ 29.86606875 0.13393125 0. 0. ]
eigenvector = [[ 0.81741556 -0.57604844 0. 0. ]
[ 0.57604844 0.81741556 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 1. ]]
แต่ถ้าเราโดดไปใช้ SVD
eigenvector จะเป็น U
eigenvalue คือ S ยกกำลัง 2
จะเขียนโค้ดได้เป็น
eigvecs, s, v = linalg.svd(x)ซึ่งได้คำตอบเดียวกันน้ะจ้ะ
print s**2
print eigvecs
eigenvalue = [ 29.86606875 0.13393125]นอกจากนี้เรายังประยุกต์กับ ATA ได้ด้วยนะ อันนี้คือหาตรงๆ
eigenvector = [[ 0.81741556 -0.57604844 0. 0. ]
[ 0.57604844 0.81741556 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 1. ]]
x_T_x = dot(x.T, x)ได้ผลตามนี้
(eigvals, eigvecs) = linalg.eig(x_T_x)
eigvals = eigvals[::-1] # rearrange, since linalg.eig() always order the result from min->max
eigvecs = eigvecs[::-1] # rearrange, since linalg.eig() always order the result from min->max
print eigvals
print eigvecs
eigenvalue = [ 29.86606875 0.13393125]แต่ถ้าเราใช้ SVD หา จะได้ดังนี้
eigenvector = [[ 0.40455358 -0.9145143 ]
[-0.9145143 -0.40455358]]
eigenvalue คือ S ยกกำลัง 2 เหมือนเดิม ค่าเดิมเลย
แต่ eigenvector จะเป็น V แทนนะ
u, s, eigvecs = linalg.svd(x)ได้ผลตามนี้
print s**2
print eigvecs
eigenvalue = [ 29.86606875 0.13393125]
eigenvector = [[ 0.40455358 0.9145143 ]
[-0.9145143 0.40455358]]
ทำไมเป็นอย่างนั้น
ข้างล่างนี่คือ พิสูจน์ จากเวป MIT นะจ๊ะ
จะพิสูจน์ให้ดูกรณี ATA เท่านั้น
A=USVT และ AT=VSUT
ATA = VSUTUSVT
ATA = VS2VT
ATAV = VS2
เนื่องจาก การหา eigenvector x และ eigenvalue λ ของเมทริกซ์ W หาได้จาก
Wx = λx then (W- λI)x = 0
A=USVT และ AT=VSUT
ATA = VSUTUSVT
ATA = VS2VT
ATAV = VS2
เนื่องจาก การหา eigenvector x และ eigenvalue λ ของเมทริกซ์ W หาได้จาก
Wx = λx then (W- λI)x = 0
มันจึงกลับไปกลับมาได้ด้วยประการฉะนี้ ...
ความคิดเห็น