生活随笔
收集整理的这篇文章主要介绍了
CUR分解算法及Python实现
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
CUR分解
要理解CUR分解,需要先看下SVD分解。SVD理论以及Python实现
算法流程
给定输入的矩阵A。
A=C∗U∗RA = C* U *RA=C∗U∗R
- 随机选r个列构成C和r个行构成R(也可以使用,平方和加权过的行和列(常用))
- 然后选取W矩阵(C和R的交集,也就是被选出来的部分,在C和R中同时出现的A矩阵中的位置。)
- 对W做SVD分解,得到X∑YTX\sum Y^TX∑YT
- 对∑\sum∑做广义逆矩阵(∑)+(\sum)^+(∑)+,也就是只有非0元的部分才变成原来的倒数。
- U=Y∗(∑)+∗XTU = Y*(\sum)^+* X^TU=Y∗(∑)+∗XT
Python实现
import numpy
as np
A
= np
.linspace
(0, 14, 15).reshape
((3, -1))
def CUR(A
, n
): A_sq
= A
** 2sum_A_sq
= np
.sum(A_sq
)sum_A_sq_0
= np
.sum(A_sq
, axis
=0)sum_A_sq_1
= np
.sum(A_sq
, axis
=1)P_x_c
= sum_A_sq_0
/ sum_A_sqP_x_r
= sum_A_sq_1
/ sum_A_sqr
, c
= A
.shapec_index
= [np
.random
.choice
(np
.arange
(0, c
), p
=P_x_c
) for i
in range(n
)]r_index
= [np
.random
.choice
(np
.arange
(0, r
), p
=P_x_r
) for i
in range(n
)]
C
= A
[:, c_index
]R
= A
[r_index
, :]W
= C
[r_index
]
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
= sigma_sq
return U
, sigma
, VX
, sigma
, Y
= SVD
(W
, n
)for i
in range(len(sigma
)):if sigma
[i
] == 0:continueelse:sigma
[i
] = 1 / sigma
[i
]sigma
= np
.diag
(sigma
)U
= np
.dot
(np
.dot
(Y
, sigma
), X
.T
)return np
.dot
(np
.dot
(C
, U
), R
)
CUR
(A
, 3)
总结
以上是生活随笔为你收集整理的CUR分解算法及Python实现的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。