SVD
將一個(gè)矩陣分解為U,V(U,V均為列正交矩陣,即列向量直接內(nèi)積為0),中間的矩陣為對(duì)角陣,元素為奇異值。
A [ m ? n ] = U [ m ? r ] ? ∑ [ r ? r ] ? ( V [ n ? r ] ) T A_{[m*n]} = U_{[m*r]} * \sum_{[r*r]} *(V_{[n*r]})^T A [ m ? n ] ? = U [ m ? r ] ? ? [ r ? r ] ∑ ? ? ( V [ n ? r ] ? ) T
SVD計(jì)算方式
A = U ? ∑ ? V T A T = V ? ∑ ? U T A A T = U ? ∑ ? V T ? V ? ∑ ? U T A = U * \sum * V^T \\ A^T = V * \sum * U ^T \\ AA^T = U * \sum * V^T * V * \sum * U^T A = U ? ∑ ? V T A T = V ? ∑ ? U T A A T = U ? ∑ ? V T ? V ? ∑ ? U T
- 由于其為列正交向量,所以矩陣在非對(duì)角位置都為0, 因此當(dāng)V的列向量是單位向量時(shí),對(duì)角位為1,則為單位陣。
A A T = U ∑ 2 U T A A T U = U ∑ 2 AA^T = U {\sum}^2U^T \\ AA^T U = U {\sum}^2
A
A
T
=
U
∑
2
U
T
A
A
T
U
=
U
∑
2
因此,U為
A A T AA^T
A
A
T
特征向量構(gòu)成的矩陣,然后
∑ 2 {\sum}^2
∑
2
的對(duì)角元為特征值。
同理,可知, A T A A^TA A T A 對(duì)應(yīng)于V的計(jì)算。
Python實(shí)現(xiàn)
- 導(dǎo)入包
import
numpy
as
np
- 創(chuàng)建數(shù)據(jù)
A
=
np
.
linspace
(
0
,
14
,
15
)
.
reshape
(
(
3
,
-
1
)
)
A
array
(
[
[
0
.
,
1
.
,
2
.
,
3
.
,
4
.
]
,
[
5
.
,
6
.
,
7
.
,
8
.
,
9
.
]
,
[
10
.
,
11
.
,
12
.
,
13
.
,
14
.
]
]
)
- 實(shí)現(xiàn)
def
SVD
(
A
,
n
)
:
M
=
np
.
dot
(
A
,
A
.
T
)
eigval
,
eigvec
=
np
.
linalg
.
eig
(
M
)
indexes
=
np
.
argsort
(
-
eigval
)
[
:
n
]
U
=
eigvec
[
:
,
indexes
]
sigma_sq
=
eigval
[
indexes
]
M
=
np
.
dot
(
A
.
T
,
A
)
eigval
,
eigvec
=
np
.
linalg
.
eig
(
M
)
indexes
=
np
.
argsort
(
-
eigval
)
[
:
n
]
V
=
eigvec
[
:
,
indexes
]
sigma
=
np
.
diag
(
np
.
sqrt
(
sigma_sq
)
)
# print(sigma)
return
np
.
dot
(
np
.
dot
(
U
,
sigma
)
,
V
.
T
)
- 調(diào)用
A_
=
SVD
(
A
,
2
)
A_
array
(
[
[
2.01625019e-16
,
1.00000000e+00
,
2.00000000e+00
,
3.00000000e+00
,
4.00000000e+00
]
,
[
5.00000000e+00
,
6.00000000e+00
,
7.00000000e+00
,
8.00000000e+00
,
9.00000000e+00
]
,
[
1.00000000e+01
,
1.10000000e+01
,
1.20000000e+01
,
1.30000000e+01
,
1.40000000e+01
]
]
)
非常近了,然后量化判斷下,用二范數(shù)來(lái)測(cè)量下:
np
.
linalg
.
norm
(
A_
-
A
)
-
總共的誤差:
1.8697717541841314e-14
- 非常的小了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
