Singular Value Vecomposition (SVD) ขยายความจากวิธี eigendecomposition [1] ซึ่งใช้ได้กับ orthogonal matrix [3] เท่านั้น ให้สามารถ decompose matrix ที่มีขนาด ได้ด้วยสมการ
เมื่อ
M คือ matrix ขนาด
U คือ orthogonal matrix ขนาด
คือ diagonal matrix ขนาด
A คือ orthogonal matrix ขนาด
 |
รูปที่ 1 |
รูปที่ 1 แสดงให้แนวคิดของ SVD จะเห็นว่า matrix M สามารถถูกแยก (decomposition) ออกเป็น 3 matrix ย่อย คือ U,Sigma และ A อาจมองได้ว่า element ของ M คือ span ของ dot product ระหว่าง column mantrix กับ row matrix ก็ได้
ยกต้วอย่าง ถ้ามี M = จะแยก M ออกเป็น
ลองคำนวณแยกกัน
ก่อนที่จะเข้าเนื้อหาของที่มาของสมการ (1) มาทำความรู้จักกับ singular values กันก่อน
ถ้า M เป็น matrix ขนาด และกำหนดให้ เป็น Eigen values ของ โดย และ เรียก ว่า "singular values" ของ A
การคำนวณ SVD
เพื่อให้เข้าใจที่มาของสมการ (1) จะเริ่มด้วยทบทวนการ decompose vector ในระบบ ก่อน
 |
รูปที่ 2 |
ในรูปที่ 2 ถูกแยก (decomposed) ออกเป็น และ ซึ่งเป็น projection บนแกน x,y ตามลำดับ
และกำหนดให้
และ เป็น unit vector บนแกน x และ y (basis) ตามลำดับ
คือมุมระหว่าง กับแกน x คือมุมระหว่าง กับแกน y
จะได้ว่า
ทำนองเดียวกัน
หมายเหตุ
หากกรณีที่มี vector จำนวนมาก และอยู่ในระบบที่มี basis เป็น และ (ดูเรื่อง การย้าย basis of vector ใน [6] ประกอบ) แสดงในรูปที่ 3(a)-(b)
 |
รูปที่ 3 |
อ้างอิงจากสมการ (2),(3) พิจารณาที่
สมการ (4),(5) สามารถถูกรวมเข้าด้วยกัน แล้วเขียนในรูปแบบของ matrix - vector multiplication ได้
ถ้า ถูกเพิ่มเข้าไปในระบบ สมการที่ (6) จะเปลี่ยนเป็น
พิจารณาสมการ (6)และ (7) ถ้ามีการเพิ่ม vector เข้าไปเรื่อย ๆ รูปแบบทั่วไปของสมการที่ (7) จะกลายเป็น
เขียนสมการ (8) ในรูปแบบอย่างง่ายคือ
ถ้าให้ d = จำนวน dimension (axis) ข้อมูล และ n = จำนวน data points หรือ จำนวน vectors จะได้ขนาดของ matrix ในสมการ (9) ดังนี้
V เป็น rectangle matrix ขนาด
A เป็น square matrix ขนาด
S เป็น rectangle matrix ขนาด
พิจารณา matrix A ในสมการ (9) จะเห็นว่า row vector คือ unit vector ที่อยู่บน axis แต่ละ axis ซึ่งจะตั้งฉากต่อกันทุก axis นั่นคือ matrix A เป็น orthogonal matrix [7] นั่นคือ อาศัยคุณสมบัตินี้ จะเขียนสมการ (9) ใหม่ได้เป็น
มาถึงขั้นตอนนี้ จะเริ่มเห็นได้ว่าสมการ (10) มีลักษณะคล้ายกับสมการ (1) แต่ยังไม่เหมือนทีเดียว ตัวที่ขาดไปคือ U และ
มาพิจารณาดู S , elements ในแต่ละ column vectors ของ S คือค่าของ norm ของ projected vectors บนแต่ละ axis
หากต้องการทำให้แต่ละ column vector อยู่ในรูปของ unit vector ก็เพียงแต่หารแต่ละ column vector ด้วย norm ของแต่ละ column vector เอง
เมื่อ คือ norm ของ column vector ที่ n นั่นคือ S จะถูกแยกออก
หมายเหตุ ไม่จำเป็นต้องใช้ norm ของ column vector การใช้ค่าคงที่อื่นจะได้ผลเช่นเดียวกัน ค่าที่นิยมใช้คือ Eigen value ( )โดย
เขียนให้อยู่ในรูปแบบอย่างง่ายเป็น
เมื่อ U เป็น orthogonal matrix (column vectors ตั้งฉากต่อกัน) ขนาด และ เป็น diagonal matrix ขนาด นำเอา ไปแทน S ใน (10) จะได้
เนื่องจาก A เป็น orthogonal matrix เราจึงอาจได้เห็นการเขียนสมการที่ (11) ในอีกรูปแบบคือ
การคำนวณหา A ในสมการ (11),(12) จาก
dot product ด้วย
dot product ด้วย A
พิจารณาสมการ (13) จะเห็นว่ามีรูปแบบเดียวกับการหา Eigen value / Eigen vector เทียบเคียงดังนี้
1. เป็น square matrix
2. A คือ matrix ที่มี column vectors คือ Eigen vectors ของ
3. เป็น diagonal matrix ที่สร้างจาก Eigen values ของ
โดย เมื่อกลับไปพิจารณานิยามของ singular values ที่กล่าวไว้แล้วข้างต้น คือ matrix ของ singular values ของ นั่นเอง
กล่าวโดยสรุปคือ
1) A หาได้จาก Eigen vector ของ
2) สร้างจาก Eigen values ของ
การหา U ในสมการ (11),(12)
จาก
dot product ด้วย A ทั้งสองข้าง
dot product ด้วย ทั้งสองข้าง
A และ หาได้จากวิธีการที่กล่าวมาแล้วในสมการ (13) และเนื่องจาก เป็น orthogonal matrix ดังนั้น
SVD นับว่าเป็นพื้นฐานสำคัญอันหนึ่งของ linear algebra ถูกนำไปใช้งานหลายด้านโดยเฉพาะ unsupervised machine learning ตัวอย่างที่มักถูกอ้างถึงบ่อยคือ Principle Componenet Analysis (PCA), ลดขนาดของภาพ, ระบบแนะนำสินค้าสมาชิก ฯลฯ ตัวอย่างการประยุกต์จะของกล่าวถึงในตอนต่อไป แต่ในตอนนี้ขอจบด้วย python code ที่เป็นการสรุปเนื้อหาที่กล่าวถึงในตอนนี้ดังนี้
import numpy as np
def SS_SVD(M):
v_val,v_vec = np.linalg.eig(M.T @ M)
i = []
temp1 = v_val.copy()
temp2 = v_val.copy()
temp1.sort()
temp1 = temp1[::-1]
for s in temp1 :
if np.round(s,4) > 0 :
i.append(np.where(temp2==s)[0])
VV = v_vec[:,i]
VV = VV.reshape((VV.shape[0],VV.shape[1]))
UU = []
for j in range(VV.shape[1]):
ui = (M @ VV[:,j])/np.sqrt(temp1[j])
UU.append(ui)
UU = np.array(UU)
UU = UU.reshape((UU.shape[0],UU.shape[1]))
singular_mat = np.diag(np.sqrt(temp1[:VV.shape[1]]))
return UU.T,singular_mat,VV.T
ความคิดเห็น
แสดงความคิดเห็น