วันพุธที่ 9 มีนาคม พ.ศ. 2554

การหา eigenvector และ eigenvalue ของ AA' โดยใช้ SVD หรือ การหา u, s, v ของ SVD โดยใช้ AA'

นี่คือ ความสัมพันธ์ระหว่างการหา eigenvector, eigenvalue ของ AAT กับ SVD ของ A

เราจะสามารถหา 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

ยกตัวอย่างให้เหมือน tutorial ของ MIT ซะเลย
from numpy import *

x = array([[2, 4],
[1, 3],
[0, 0],
[0, 0]])
ถ้าเราทำตรงๆ คือ หา eigenvector, eigenvalue ของ AAT สามารถทำได้ดังนี้

x_x_T = dot(x, x.T)
(eigvals, eigvecs) = linalg.eig(x_x_T)
print eigvals
print eigvecs
ก็จะได้ eigenvector, eigenvalue มาเรียบร้อยแล้ว
ในที่นี้ เราได้
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]
eigenvector = [[ 0.81741556 -0.57604844 0. 0. ]
[ 0.57604844 0.81741556 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 1. ]]
นอกจากนี้เรายังประยุกต์กับ ATA ได้ด้วยนะ อันนี้คือหาตรงๆ
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]
eigenvector = [[ 0.40455358 -0.9145143 ]
[-0.9145143 -0.40455358]]
แต่ถ้าเราใช้ SVD หา จะได้ดังนี้
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

มันจึงกลับไปกลับมาได้ด้วยประการฉะนี้ ...

ไม่มีความคิดเห็น:

LinkWithin

Related Posts Plugin for WordPress, Blogger...