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...