Basic Linear Algebra : Singular Value Decomposition (SVD)

Singular Value Vecomposition (SVD) ขยายความจากวิธี eigendecomposition [1] ซึ่งใช้ได้กับ orthogonal matrix [3] เท่านั้น ให้สามารถ decompose matrix ที่มีขนาด m×n ได้ด้วยสมการ

(1)M=UΣAT

เมื่อ

M คือ matrix ขนาด n×d

U คือ orthogonal matrix ขนาด n×d

Σ คือ diagonal matrix ขนาด d×d

A คือ orthogonal matrix ขนาด d×d


รูปที่ 1

รูปที่ 1 แสดงให้แนวคิดของ SVD จะเห็นว่า matrix M สามารถถูกแยก (decomposition) ออกเป็น 3 matrix ย่อย คือ U,Sigma และ A อาจมองได้ว่า element ของ M คือ span ของ dot product ระหว่าง column mantrix กับ row matrix ก็ได้
M=i=1dσiuiaiT

ยกต้วอย่าง ถ้ามี M = [110211122011] จะแยก M ออกเป็น M=[0.540.710.450.540.710.450.640.000.77][3.570.000.000.002.000.000.000.001.12][0.660.300.480.480.000.000.710.710.000.810.130.13] ลองคำนวณแยกกัน C1=3.57[0.540.540.64][0.660.300.480.48]=[1.280.590.940.941.280.590.940.941.520.71.111.11]C2=2.00[0.450.450.77][0.000.000.710.71]=[0.0.1.1.0.0.1.1.0.0.0.0.]C3=1.12[0.710.710.00][0.560.810.130.13]=[0.280.410.060.060.280.410.060.060.480.70.110.11]C1+C2+C3=M

ก่อนที่จะเข้าเนื้อหาของที่มาของสมการ (1) มาทำความรู้จักกับ singular values กันก่อน

ถ้า M เป็น matrix ขนาด n×d และกำหนดให้ λ1,λ2,λ3,...,λd เป็น Eigen values ของ MTM โดย λ1λ2λ3...λd0 และ σ1=λ1,σ2=λ2,σ3=λ3,...,σd=λd เรียก σ1,σ2,σ3,...,σd ว่า "singular values" ของ A


การคำนวณ SVD
เพื่อให้เข้าใจที่มาของสมการ (1) จะเริ่มด้วยทบทวนการ decompose vector ในระบบ R2 ก่อน
รูปที่ 2

ในรูปที่ 2 v ถูกแยก (decomposed) ออกเป็น vx และ vy ซึ่งเป็น projection บนแกน x,y ตามลำดับ v=vx+vy และกำหนดให้

ax=[10] และ ay=[01] เป็น unit vector บนแกน x และ y (basis) ตามลำดับ

θ คือมุมระหว่าง v กับแกน x γ คือมุมระหว่าง v กับแกน y

จะได้ว่า vax=vaxcosθ=vvxv(2)vax=vx=Sx ทำนองเดียวกัน vay=vaycosγ=vvyv(3)vay=vy=Sy หมายเหตุ ax=1,ay=1

หากกรณีที่มี vector จำนวนมาก และอยู่ในระบบที่มี basis เป็น [a1xa2x] และ [a1ya2y] (ดูเรื่อง การย้าย basis of vector ใน [6] ประกอบ)  แสดงในรูปที่ 3(a)-(b)

รูปที่ 3

อ้างอิงจากสมการ (2),(3) พิจารณาที่ v1 v1ax=S1xv1ay=S1y(4)[v1xv1y][a1xa2x]=S1x(5)[v1xv1y][a1ya2y]=S1y
สมการ (4),(5) สามารถถูกรวมเข้าด้วยกัน แล้วเขียนในรูปแบบของ matrix - vector multiplication ได้ (6)[v1xv1y][a1xa2xa1ya2y]=[S1xS1y]

ถ้า v2=[v2xv2y] ถูกเพิ่มเข้าไปในระบบ สมการที่ (6) จะเปลี่ยนเป็น (7)[v1xv1yv2xv2y][a1xa2xa1ya2y]=[S1xS1yS2xS2y]
พิจารณาสมการ (6)และ (7) ถ้ามีการเพิ่ม vector เข้าไปเรื่อย ๆ รูปแบบทั่วไปของสมการที่ (7) จะกลายเป็น (8)[v1xv1yv2xv2y][a1xa2xa1ya2y]=[S1xS1yS2xS2y]

เขียนสมการ (8) ในรูปแบบอย่างง่ายคือ (9)VA=S ถ้าให้ d = จำนวน dimension (axis) ข้อมูล และ n = จำนวน data points หรือ จำนวน vectors จะได้ขนาดของ matrix ในสมการ (9) ดังนี้

V เป็น rectangle matrix ขนาด n×d

A เป็น square matrix ขนาด d×d

S เป็น rectangle matrix ขนาด n×d


พิจารณา matrix A ในสมการ (9) จะเห็นว่า row vector คือ unit vector ที่อยู่บน axis แต่ละ axis ซึ่งจะตั้งฉากต่อกันทุก axis นั่นคือ matrix A เป็น orthogonal matrix [7] นั่นคือ A1=AT อาศัยคุณสมบัตินี้ จะเขียนสมการ (9) ใหม่ได้เป็น VA=SVAA1=SAT(10)V=SAT

มาถึงขั้นตอนนี้ จะเริ่มเห็นได้ว่าสมการ (10) มีลักษณะคล้ายกับสมการ (1) แต่ยังไม่เหมือนทีเดียว ตัวที่ขาดไปคือ U และ Σ
มาพิจารณาดู S , elements ในแต่ละ column vectors ของ S คือค่าของ norm ของ projected vectors บนแต่ละ axis [S1xS1yS2xS2y] หากต้องการทำให้แต่ละ column vector อยู่ในรูปของ unit vector ก็เพียงแต่หารแต่ละ column vector ด้วย norm ของแต่ละ column vector เอง [S1xσ1S1yσ2S2xσ1S2yσ2]

เมื่อ σn คือ norm ของ column vector ที่ n นั่นคือ S จะถูกแยกออก

[S1xS1yS2xS2y]=[S1xσ1S1yσ2S2xσ1S2yσ2][σ100σ2σn]
หมายเหตุ σ ไม่จำเป็นต้องใช้ norm ของ column vector การใช้ค่าคงที่อื่นจะได้ผลเช่นเดียวกัน ค่าที่นิยมใช้คือ Eigen value (λ )โดย σ2=λ

เขียนให้อยู่ในรูปแบบอย่างง่ายเป็น S=UΣ เมื่อ U เป็น orthogonal matrix (column vectors ตั้งฉากต่อกัน) ขนาด n×d และ Σ เป็น diagonal matrix ขนาด d×d นำเอา U,Σ ไปแทน S ใน (10) จะได้

(11)V=UΣAT

เนื่องจาก A เป็น orthogonal matrix เราจึงอาจได้เห็นการเขียนสมการที่ (11) ในอีกรูปแบบคือ

(12)V=UΣA1


การคำนวณหา A ในสมการ (11),(12) จาก V=UΣAT dot product ด้วย VT VTV=VT(UΣAT)VTV=(UΣAT)T(UΣAT)VTV=(AT)TΣTUTUΣATVTV=AΣΣATVTV=AΣ2AT dot product ด้วย A VTVA=AΣ2ATA(13)VTVA=AΣ2
พิจารณาสมการ (13) จะเห็นว่ามีรูปแบบเดียวกับการหา Eigen value / Eigen vector เทียบเคียงดังนี้
1. VTV เป็น square matrix
2. A คือ matrix ที่มี column vectors คือ Eigen vectors ของ VTV
3. Σ2 เป็น diagonal matrix ที่สร้างจาก Eigen values ของ VTV Σ2=[σ12000σ22000σ32σn2]=[λ1000λ2000λ3λn] โดย λi=σi2 เมื่อกลับไปพิจารณานิยามของ singular values ที่กล่าวไว้แล้วข้างต้น Sigma คือ matrix ของ singular values ของ V นั่นเอง

กล่าวโดยสรุปคือ
1) A หาได้จาก Eigen vector ของ VTV
2) Σ สร้างจาก Eigen values ของ VTV

การหา U ในสมการ (11),(12)
จาก V=UΣAT dot product ด้วย A ทั้งสองข้าง VA=(UΣAT)A=UΣ dot product ด้วย Σ1ทั้งสองข้าง VAΣ1=UΣΣ1(14)U=VAΣ1

A และ Σ หาได้จากวิธีการที่กล่าวมาแล้วในสมการ (13) และเนื่องจาก Σ เป็น orthogonal matrix ดังนั้น Σ1=[1σ100...01σ20...001σ3...1σn]

SVD นับว่าเป็นพื้นฐานสำคัญอันหนึ่งของ linear algebra ถูกนำไปใช้งานหลายด้านโดยเฉพาะ unsupervised machine learning ตัวอย่างที่มักถูกอ้างถึงบ่อยคือ Principle Componenet Analysis (PCA), ลดขนาดของภาพ, ระบบแนะนำสินค้าสมาชิก ฯลฯ ตัวอย่างการประยุกต์จะของกล่าวถึงในตอนต่อไป แต่ในตอนนี้ขอจบด้วย python code ที่เป็นการสรุปเนื้อหาที่กล่าวถึงในตอนนี้ดังนี้
    
import numpy as np
    
def SS_SVD(M):
    # construct square matrix (covariance matrix of itself)
    v_val,v_vec = np.linalg.eig(M.T @ M)
    
    # to store right singular matrix indecies
    i = []

    temp1 = v_val.copy()
    temp2 = v_val.copy()
    
    # singular values need to be sorted.
    temp1.sort()
    temp1 = temp1[::-1]
    
    for s in temp1 :
    	# to include only more than zero elements
        if np.round(s,4) > 0 :
            i.append(np.where(temp2==s)[0])
    
    # construct right singular matrix
    VV = v_vec[:,i]
    VV = VV.reshape((VV.shape[0],VV.shape[1]))
    
    # construct left singular matrix
    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]))
    
    # construct sigular matrix 
    singular_mat = np.diag(np.sqrt(temp1[:VV.shape[1]]))
    
    return UU.T,singular_mat,VV.T 
    
  


เอกสารอ้างอิง

[1] https://smarter-machine.blogspot.com/2021/03/basic-linear-algebra-eigendecomposition.html

[2] https://en.wikipedia.org/wiki/Singular_value_decomposition

[3] https://smarter-machine.blogspot.com/2021/03/basic-linear-algebra-orthogonal-matrix.html

[4] https://smarter-machine.blogspot.com/2021/02/basic-linear-algebra-vector-part.html#dot_pro

[5] https://smarter-machine.blogspot.com/2021/03/basic-linear-algebra-eigendecomposition.html

[6] https://smarter-machine.blogspot.com/2021/03/basic-linear-algebra-basis-of-vector.html

[7] https://smarter-machine.blogspot.com/2021/03/basic-linear-algebra-orthogonal-matrix.html

[8] https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Dimensionality_Reduction/Singular_Value_Decomposition

[9] https://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Dimensionality_Reduction/Singular_Value_Decomposition

ความคิดเห็น