日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

CUR分解算法及Python实现

發(fā)布時(shí)間:2025/4/16 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUR分解算法及Python实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CUR分解

要理解CUR分解,需要先看下SVD分解。SVD理論以及Python實(shí)現(xiàn)

算法流程

給定輸入的矩陣A。

A=C?U?RA = C* U *RA=C?U?R

  • 隨機(jī)選r個(gè)列構(gòu)成C和r個(gè)行構(gòu)成R(也可以使用,平方和加權(quán)過(guò)的行和列(常用))
  • 然后選取W矩陣(C和R的交集,也就是被選出來(lái)的部分,在C和R中同時(shí)出現(xiàn)的A矩陣中的位置。)
  • 對(duì)W做SVD分解,得到X∑YTX\sum Y^TXYT
  • 對(duì)∑\sum做廣義逆矩陣(∑)+(\sum)^+()+,也就是只有非0元的部分才變成原來(lái)的倒數(shù)。
  • U=Y?(∑)+?XTU = Y*(\sum)^+* X^TU=Y?()+?XT

Python實(shí)現(xiàn)

  • 導(dǎo)入包
import numpy as np
  • 數(shù)據(jù)
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)] # print(c_index, r_index)C = A[:, c_index]R = A[r_index, :]W = C[r_index] # print(C, R, W)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 # not diag and not sqrtreturn 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)
  • 調(diào)用
CUR(A, 3)

總結(jié)

以上是生活随笔為你收集整理的CUR分解算法及Python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。