tf 如何進行svd 聊聊SVD(奇異值分解)降維

2021-10-14 14:37:04 字數 1870 閱讀 7919

svd(singular value decomposition,奇異值分解)是機器學習領域中很常用的演算法;比如在文字分類場景中,在求解完語料的tfidf後,緊跟著會進行svd降維,然後建模。另外在推薦系統、自然語言處理等領域中均有應用;今天主要聊一聊svd的降維。

下圖展示了乙個利用svd對壓縮降噪的例子;在取不同比例奇異值時,資訊的損失變化情況不同。在取80%奇異值時,原整體表現清晰,輪廓明顯;60%奇異值時,資訊損失較大,人臉已不太清楚,但人物整體輪廓依舊明顯;通過降維使得保留了主要資訊而剔除掉了很多不重要的資料。

那麼究竟什麼是svd?

svd是對矩陣進行分解,假如待分解的矩陣a是乙個

其中u是乙個

那麼如何求解奇異值?

此處不再對原理做過多闡述,主要從python實現上結合例子給大家展示。

如何快速上手?

基於開頭處理的例子,我們可以利用pil.image和numpy.linalg.svd來實現操作,具體是

from pil import image

import numpy as np

import matplotlib.pyplot as plt

def rebuild_img(u, sigma, v, p):

"""u:矩陣u

sigma:矩陣sigma

v:矩陣v

p:奇異值的百分比

"""a = np.zeros((len(u), len(v))) # a是sigma矩陣的空殼

count = (int)(sum(sigma)) # 統計所有奇異值之和,方便後續按其計算百分比

m,k = 0,0

while m <= count * p:

a[k,k] = sigma[k]

m += sigma[k]

k += 1

a = np.dot(np.dot(u,a),v) # 矩陣計算

a = np.clip(a,0,255)

return np.rint(a).astype("uint8")

b = np.array(image.open('/.../dota2/火女.jpg', 'r'))

for p in np.arange(0.0, 1.2, 0.2):

u, sigma, v = np.linalg.svd(b[:, :, 0])

r = rebuild_img(u, sigma, v, p)

u, sigma, v = np.linalg.svd(b[:, :, 1])

g = rebuild_img(u, sigma, v, p)

u, sigma, v = np.linalg.svd(b[:, :, 2])

b = rebuild_img(u, sigma, v, p)

i = np.stack((r, g, b), 2)

plt.figure("beauty")

plt.imshow(i)

plt.axis('off')

plt.show() # 繪圖輸出

從公式或者**示例中都可以看出,svd在計算過程中原矩陣的維度其實是不變的 ,但是在取n%的奇異值時,重新計算回去的原矩陣中元素值顯著降低,秩也降低,整體來看資料得到了壓縮和衰減;或許這一稱之為一種降維吧。

奇異值分解 SVD

最近不小心接觸到了svd,然後認真看下去之後發現這東西真的挺強大的,把乙個推薦問題轉化為純數學矩陣問題,看了一些部落格,把乙個寫個比較具體的博文引入進來,給自己看的,所以把覺得沒必要的就去掉了,博文下面附原始部落格位址。一 基礎知識 1.矩陣的秩 矩陣的秩是矩陣中線性無關的行或列的個數 2.對角矩陣...

SVD奇異值分解

原文出處 今天我們來講講奇異值分解和它的一些有意思的應用。奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其...

奇異值分解(SVD)

svd是singular value decomposition的縮寫,是去除冗餘 資訊提取和資料約簡的強大工具。若a為p q實數矩陣,則存在p階正交矩陣u和q階正交矩陣v,使得 a u v 上式就是奇異值分解,其中p q矩陣 中,i,i 元素 i 0,i 1,2,3,min p,q 其他元素均為0...