SVT矩陣補全演算法的實現及應用

2021-10-25 09:40:09 字數 2307 閱讀 4213

前言

最近在學習矩陣補全的方法主要是用來做藥物重定位。入門矩陣補全方法後才發現這個坑有點大,需要太多的數學基礎了。對於數學知識嚴重不足的我欲哭無淚,搞了兩周之後對這個方法的現實意義跟數學背景有了一定的了解。在這裡做個總結並用經典的svt矩陣補全演算法(《a singular value thresholding algorithm for matrix completion》)作為乙個demo(python實現),解釋一下矩陣補全的具體做法,感受一下矩陣補全到底是幹啥的。

低秩矩陣補全的現實意義

這一部分內容參考我之前的部落格

時間倉促沒大塊時間,碼字先把**貼出來,以後慢慢補解釋。

""

@date :

2020/11

/1519:

54@source 《a singular value thresholding algorithm for mc&rw》

"""import numpy as np

# creating data

svt_data = np.array([[

0,3,

0,4]

,[3,

0,4,

0],[

0,0,

2,0]

,[5,

0,3,

4],[

0,0,

4,0]

,[0,

3,3,

0]])

# changing data type into float

svt_data = svt_data.astype(

float

)# print(svt_data)

# generating omega :0 denotes none 1 denotes true

shape = svt_data.shape

omega = np.zeros(shape)

for i in

range(0

, shape[0]

):for j in

range(0

, shape[1]

):if svt_data[i, j]

>0:

omega[i, j]=1

# print(omega)

defsvt_solve

(a, omega, tau=

none

, delta=

none

, epslion=1e-

2, max_iterations=

1000):

# 矩陣初始化,生成乙個和矩陣a形狀一樣的0矩陣

y = np.zeros_like(a)

ifnot tau:

tau =

5* np.

sum(a.shape)/2

ifnot delta:

# 確定步長初始值

delta =

1.2* np.prod(a.shape)

/ np.

sum(omega)

for _ in

range

(max_iterations)

:# 對矩陣y進行奇異值分解

u, s, v = np.linalg.svd(y, full_matrices=

false

)# soft-thresholding operator

print

(type

(s))

print

(type

(tau)

)print

(tau)

s = np.maximum(s - tau,0)

# singular value shrinkage

x = np.linalg.multi_dot(

[u, np.diag(s)

, v]

)# y的迭代

y += delta * omega *

(a-x)

# 誤差計算

rel_recon_error = np.linalg.norm(omega *

(x-a)

)/ np.linalg.norm(omega*a)

if rel_recon_error < epslion:

break

return x

result = svt_data_hat = svt_solve(svt_data, omega)

print

(result)

矩陣填充的SVT演算法

本文是對svt的一篇文章的理解,即奇異值閾值演算法的理解。1 演算法解決的問題如下 其中最小化的是核範數 表示矩陣奇異值之和 是rank x 的最優凸近似。具體研究解決的是矩陣填充問題,如何在不完備的資料下把缺少的資料給補充完整。前提是填充的矩陣是要求低秩的。首先給出軟閾值運算元 如果 那麼在軟閾值...

棧的演算法實現及應用

1.棧的順序儲存結構 1 編寫程式,用不同的儲存方法,實現棧的基本操作。2 判斷乙個表示式中的括號 僅有一種括號,小 中或大括號 是否配對。編寫並實現它的演算法。3 若表示式中既有小括號,又有大括號 或中括號 且允許互相巢狀,但不能交叉,寫出判斷這樣的表示式是否合法的演算法。如 2 3 4 3 為合...

Mac mac git 的安裝 及實現自動補全

1.檢查是否裝了brew brew list 如果沒有,拷貝以下命令到終端 回車.可以安裝好brew ruby e curl fssl 2.檢視你是否已經安裝了 bash completion 如果沒有,繼續往下看 brew install bash completion 安裝完成之後 3.檢查ma...