01204472/การทดลองเกี่ยวกับ SVD
ในการทดลองวันนี้เราจะ plot กราฟเป็นจำนวนมาก โดยปกติเมื่อเราสั่ง plot กราฟที่ได้จะทับกับรูปเดิม ถ้าเราต้องการสร้าง figure ใหม่ (เพื่อเก็บรูปเดิมไว้) ให้สั่ง
figure()
เนื้อหา
ทดลองเกี่ยวกับ eigenvectors
ก่อนอื่นเราจะสร้างรายการของจุดบนวงกลมรัศมี 1 หน่วย
ang = arange(0,2.*pi,pi/10.) x = [cos(a) for a in ang] y = [sin(a) for a in ang]
plot(x,y,'o')
สร้างรายการของเวกเตอร์จากลิสต์ x และ y
vs = [matrix([[xx],[yy]]) for xx,yy in zip(x,y)]
จากนั้นให้สร้างเมตริกซ์ M ขนาด 2x2 ขึ้นมา สำหรับเวกเตอร์ v แต่ละเวกเตอร์ใน vs ให้หา Mv และรวมเป็นรายการ mvs
ให้นำจุดเหล่านั้นในลิสต์ mvs มา plot ที่เดียวกับจุดจากรายการ vs ที่เรา plot ตอนแรก ดังตัวอย่างด้านล่าง (รูปอาจจะไม่เหมือน ขึ้นกับเมตริกซ์ M)
ให้หา eigenvector ของ M ด้วยฟังก์ชัน eig เวกเตอร์ดังกล่าวอธิบายอะไรเกี่ยวกับรูปด้านบน
ให้ลองคูณ M เข้ากับ eigenvector ที่ได้ทั้งสอง
ให้ plot eigenvector ทั้งสองลงบนกราฟ (สังเกตว่าเวกเตอร์ไม่จำเป็นต้องตั้งฉากกัน)
เมตริกซ์ที่มี Low rank
เราจะทดลองสร้างเมตริกซ์ที่มี rank ต่ำ
สร้างเวกเตอร์ X
X = matrix([ [sin(a) for a in arange(0,4*pi,pi/50)] ]).T
และเวกเตอร์ Y
Y = matrix([ [cos(a) for a in arange(0,4*pi,pi/50)] ]).T
สร้างเมตริกซ์ M โดยให้เท่ากับ X YT
M = X * Y.T
จากให้แสดงเมตริกซ์ดังกล่าวด้วยคำสั่ง
imshow(M)
Rank ของเมตริกซ์ M มีค่าเท่ากับเท่าใด?
ทดลองคำนวณ rank ของ M ด้วยคำสั่ง matrix_rank(M) (อย่าสับสนกับฟังก์ชัน rank) ทำไมผลลัพธ์ที่ได้ไม่ตรงกับที่เราคาดการณ์ไว้?
ให้คำนวณหา singular value decomposition ของ M โดยสั่ง
u,s,v = svd(M)
ให้พิจารณาค่าใน s ค่าดังกล่าวเกี่ยวข้องอะไรกับ rank ของ M?
พิจารณาเมตริกซ์ u, ทดลองสั่ง plot คอลัมน์แรกของ u
plot(u[:,0])
พิจารณาเมตริกซ์ v, ทดลองสั่ง plot แถวแรกของ v
plot(v[0,:].T)
การประมาณเมตริกซ์ ด้วย Low rank เมตริกซ์
เราจะสร้างเมตริกซ์ N ที่เป็น noise ขนาด 0.01
N = matrix([[uniform()/100. for i in range(200)] for j in range(200)])
จากเมตริกซ์ M ในตัวอย่างที่แล้ว ให้สร้าง
MM = M + N
ทดลอง plot
imshow(MM)
สังเกตว่า MM มีลักษณะใกล้เคียงกับ M มาก ทดลองหา rank โดยสั่ง
matrix_rank(MM)
ค่าดังกล่าวบอกอะไรกับเรา? เมตริกซ์ M กับ MM ต่างกันอย่างไร?
decompose MM ด้วย SVD
a,b,c = svd(MM)
พิจารณาเวกเตอร์ b, คอลัมน์แรกของ a, แถวแรกของ c (ทดลอง plot ค่าดู)
เราจะสร้างเมตริกซ์ MMM ที่ approximate MM ที่มี rank = 1 ได้อย่างไร?
ทดลองสร้าง MMM แล้ว plot ผลลัพธ์ด้วย imshow
ทดลองโดยการเพิ่ม noise
ทดลองซ้ำ โดยเพิ่ม noise ให้มากขึ้นเป็นระดับ 1 หน่วย โดยสั่ง
N = matrix([[uniform() for i in range(200)] for j in range(200)])
ให้
MM = M + N
จากนั้นคำนวณ
a,b,c = svd(MM)
พิจารณาค่าในเวกเตอร์ b เวกเตอร์ b ที่ได้ ต่างจากกรณีที่หาเมื่อระดับของ noise ต่ำ ๆ อย่างไร?
สร้างเมตริกซ์ที่ approximate MM ที่มี rank = 1 สังเกตผลโดยสั่ง imshow
ผลลัพธ์ที่ได้ใกล้เคียงกับ M หรือไม่ อย่างไร?
สร้างเมตริกซ์ที่ approximate MM ที่มี rank = 2 สังเกตผลโดยสั่ง imshow
สร้างเมตริกซ์ที่ approximate MM ที่มี rank = 3 สังเกตผลโดยสั่ง imshow
หมายเหตุ: การสร้าง matrix ที่ approximate MM ข้าง ต้นสามารถสั่งได้ด้วยคำสั่งเดียว