You are on page 1of 2

Thuật toán SVD

Input: Ma trận A cỡ m x n

Output: 3 ma trận U, Σ, V sao cho A = UΣ VT , với U là ma trận trực giao cỡ m x m, V là ma trận trực
giao cỡ n x n, Σ là ma trận đường chéo

1. Gói SVD tìm 3 ma trận U, Σ, VT


Input: Ma trận A cỡ m x n
Output: 3 ma trận U, Σ, V
• Khởi tạo ma trận Sigma (ma trận đường chéo Σ)
• Gán ma trận Sigma bằng ma trận 0 cỡ m x n
• Khởi tạo biến r
• Gán r là hạng của ma trận A
• Trường hợp 1: m >= n
// Tìm ma trận U

o Tìm các giá trị riêng w i của A.A T

o Tìm các vector riêng tương ứng là ui

o Sắp xếp các giá trị riêng và các vector riêng tương ứng theo thứ tự giảm dần
từ trái qua phải

o Từ các vector riêng ui ta tìm được ma trận U = u1u2 ...um 

// Tìm ma trận V
o Trong trường hợp ma trận A không đủ hạng, tìm r vector đầu tiên ứng với V

A Tui
o Từ U tính ra V thông qua công thức: vi =
i
o Nếu ma trận A không đủ hạng => Tìm n – r các vector còn lại thông qua
ker(A)

o Gán V = V T

// Tìm ma trận Sigma

o Giá trị kì dị của A là i = i

o Gán các giá trị kì dị vào đường chéo của ma trận Sigma
• Trường hợp 2: m < n
// Tìm ma trận V
o Tìm các giá trị riêng w i của A T .A

o Tìm các vector riêng tương ứng là v i

o Sắp xếp các giá trị riêng và các vector riêng tương ứng theo thứ tự giảm dần
từ trái qua phải

o Từ các vector riêng v i ta tìm được ma trận V = v1v 2 ...v n 

// Tìm ma trận U
o Trong trường hợp ma trận A không đủ hạng, tìm r vector đầu tiên ứng với U
o Tương tự như TH1, đổi vai trò của U và V => Từ V tính ra U thông qua công
Av i
thức: ui =
i
o Nếu ma trận A không đủ hạng => Tìm m – r các vector còn lại thông qua

ker( A T )

o Gán U = UT

// Tìm ma trận Sigma

o Giá trị kì dị của A là i = i

o Gán các giá trị kì dị vào đường chéo của ma trận Sigma

// Tìm ma trận Sigma

o Giá trị kì dị của A là i = i

o Gán các giá trị kì dị vào đường chéo của ma trận Sigma

2. Chương trình chính


Input: Ma trận A cỡ m x n
Output: 3 ma trận U, Σ , V
• U, S (ma trận đường chéo Σ), V = SVD(A)

• Kiểm tra lại: Tính A − U.S.VT

• Kiểm tra ma trận trực giao: Tính U−1 − UT và V −1 − V T


• Kiểm tra lại bằng cách so sánh với hàm svd() trong thư viện NumPy của Python

You might also like