SVD的一些理解


PCA一章結束后,書中介紹了SVD,中文名為奇異值分解,全稱singular value decomposition,是一種針對矩陣分解的方法。

按照我個人的理解,SVD可以消除多余的信息,保留最主要的信息。

“we can see it as a method for transforming correlated variables into a set of uncorrelated ones that better expose the various relationships among the original data items. At the same time, SVD is a method for identifying and ordering the dimensions along which data points exhibit the most variation. This ties in to the third way of viewing SVD, which is that once we have identi ed where the most variation is, it's possible to nd the best approximation of the original data points using fewer dimensions. Hence, SVD can be seen as a method for data reduction”

優點:簡化數據,減少噪音,可能提高其他算法效果

缺點:數據集在經過處理后不容易理解。

SVD的應用場景有很多,這里不具體的去展開,這里以圖片中的應用來直觀的解釋SVD。

https://rorasa.wordpress.com/2012/05/13/l0-norm-l1-norm-l2-norm-l-infinity-norm/


一個m x n 的矩陣Data可以被分解為以上這樣的形式,其中,sigma是一個對角矩陣,對角元素都被稱為奇異值(singular values),這個有點類似PCA中的特征值,表明特征的重要性。這些奇異值是特征值的平方根,U的列向量則是的特征向量(eigenvectors)而則是的特征向量。

現在那一張圖片來稍微直觀的做下演示:

圖片是從網上找到的,現在是自己PC的桌面。


為了方便處理,將其轉化灰度圖片,然后對其使用SVD,看看效果。

當sigma取第一個最大的奇異值。

得到的圖片是這樣的:


基本上看不出有啥。

選取前倆個奇異值:


仍然看不出跟原圖片有多大關聯,分別選取前5、10個奇異值:



可以明顯看到,遠距離看5D的,能夠看到一個模糊的輪廓,10D的就已經比較清晰了,接着看20D和50D的。



隨着奇異值的個數越多,效果越明顯。


但是很明顯,比如70D以后的,每增加一個奇異值所帶來的變化或者影響越來越小,也就是后面的的奇異值對整體圖片的貢獻遠遠沒有前面貢獻大。

PS:python代碼片段:

from PIL import Image
import numpy as np
op=Image.open('./a.jpg').convert('L')
img=np.array(op)
img=img[:-30,:660]
s,sigm,v=np.linalg.svd(img)
print s.shape,sigm.shape,v.shape
Dem=[1,2,5,10,20,50,70,100,200,500,600,660]
for D in Dem:
dlg=np.diag(sigm[0:D]) #選取D個奇異值
pic_data=np.dot(s[:,0:D],dlg) #重新構造矩陣
pic_data=np.dot(pic_data,v[0:D,:])
#print type(pic_data[1][1])
im=Image.fromarray(pic_data.astype(np.uint8)) #將數據保存到圖片
filename='%s-D.jpg'%(D)
im.save(filename)

以上應該比較直觀的了解SVD到底干了什么。

下一篇文章准備寫寫,SVD在推薦系統中的應用。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com