生活随笔
收集整理的這篇文章主要介紹了
机器学习SVD【一】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. SVD
1.1 分解
如下圖,一個矩陣可以分解為兩個方陣和一個對角矩陣的乘積:
C = m * n;u = m * m;sigma = m * n;v' = n * n
1.2 奇異值
sigma是一個對角矩陣,但通常不是方陣。sigma的對角元素被稱為奇異值,與特征值類似。因此與PCA類似,我們可以取sigma中最大的k個,來簡化數據:
u' = m * k;sigma' = k * k;v'' = k * v
1.3 重構C矩陣
利用新的三個矩陣u',sigma',v''相乘仍然得到一個m * n的矩陣。如果你選擇的k個奇異值所占的所有奇異值比例足夠大,那么新得到的m * n的矩陣將與C非常接近。
2. SVD實踐 - 矩陣壓縮
[python]?view plaincopy
?????????????????????import?numpy?as?np????arr?=?np.array([[0,?0,?0,?2,?2],?[0,?0,?0,?3,?3],?[0,?0,?0,?1,?1],??????????????????[1,?1,?1,?0,?0],?[2,?2,?2,?0,?0],?[5,?5,?5,?0,?0],?[1,?1,?1,?0,?0]])??????u,?sigma,?v?=?np.linalg.svd(arr)??????new_arr?=?np.mat(u[:,?0:2])?*?np.mat(np.diag(sigma[0:2]))?*?np.mat(v[0:2,?:])??
new_arr與arr非常接近,幾乎相等。這其實是類似于圖像壓縮,只保留圖像分解后的兩個方陣和一個對角陣的對角元素,就可以恢復原圖像。
3. SVD實踐 - 數據降維
之所以能進行數據降維,原理與PCA一樣,SVD計算出的三個矩陣對應的是:
u:CC'的特征向量矩陣; sigma:奇異值矩陣,其中每個元素為特征值開方; v':C'C的特征向量矩陣。
如這篇文章所述主成分分析,你會發現sigma與C'C恰好是主成分分析所需要的兩個量。因此SVD降維與PCA是一致的,尤其是事先對數據進行了中心化,再奇異值分解,則PCA降維和SVD降維完全一樣。
利用SVD來實現PCA的代碼:
[python]?view plaincopy
??????import?numpy?as?np??import?matplotlib.pyplot?as?plt??????class?PCA:????????????????def?__init__(self,?dimension,?centered=True,?compression="cols"):????????????????????????self.dimension?=?dimension??????????self.centered?=?centered??????????self.compression?=?compression????????????????def?_centered(self,?train_x):????????????????????return?train_x?-?np.mean(train_x,?axis=0)????????????def?_svd(self,?train_x):????????????????????return?np.linalg.svd(train_x)????????????def?transform(self,?train_x):??????????????????????????????????if?self.centered?==?True:??????????????train_x?=?self._centered(train_x)??????????????????????????????u,?sigma,?v?=?self._svd(train_x)??????????v?=?v.T??????????????????????????????if?self.compression?==?"cols":??????????????result?=?np.dot(train_x,?v[:,?0:self.dimension])??????????elif?self.compression?==?"rows":??????????????result?=?np.dot(u[:,?0:self.dimension],?train_x[0:self.dimension,?:])??????????else:??????????????raise(Exception("parameter?error."))??????????return?result??
3.1 壓縮行 - 壓縮記錄
SVD分解得到的三個矩陣分別稱為:左奇異向量,奇異值矩陣,右奇異向量。左奇異向量用于壓縮行,右奇異向量壓縮列。壓縮方法均是取奇異值較大的左奇異向量或者右奇異向量與原數據C相乘。
3.2 壓縮列 - 壓縮特征
[python]?view plaincopy
def?load_data():??????with?open("../SVD/data/Iris.txt",?"r")?as?f:??????????iris?=?[]??????????for?line?in?f.readlines():??????????????temp?=?line.strip().split(",")??????????????if?temp[4]?==?"Iris-setosa":??????????????????temp[4]?=?0??????????????elif?temp[4]?==?"Iris-versicolor":??????????????????temp[4]?=?1??????????????elif?temp[4]?==?"Iris-virginica":??????????????????temp[4]?=?2??????????????else:??????????????????raise(Exception("data?error."))??????????????iris.append(temp)??????iris?=?np.array(iris,?np.float)??????return?iris????????def?draw_result(new_trainX,?iris):???????????????plt.figure()????????????setosa?=?new_trainX[iris[:,?4]?==?0]??????plt.scatter(setosa[:,?0],?setosa[:,?1],?color="red",?label="Iris-setosa")??????????????????versicolor?=?new_trainX[iris[:,?4]?==?1]??????plt.scatter(versicolor[:,?0],?versicolor[:,?1],?color="orange",?label="Iris-versicolor")??????????????????virginica?=?new_trainX[iris[:,?4]?==?2]??????plt.scatter(virginica[:,?0],?virginica[:,?1],?color="blue",?label="Iris-virginica")??????plt.legend()??????plt.show()????????def?main(dimension,?centered,?compression):????????????iris?=?load_data()??????????????????clf?=?PCA(2,?centered,?compression)??????new_iris?=?clf.transform(iris[:,?0:4])??????????????????draw_result(new_iris,?iris)??
數據進行中心化后降維的結果,與PCA一文結果一致:
數據不進行中心化的結果為:
4. SVD實踐 - 協同過濾
協同過濾包含基于用戶的協同過濾,基于物品的協同過濾。這兩種方式本身是不需要SVD就可以進行的;但是加入了SVD之后,可以減少計算量同時還能提高推薦效果。
4.1 基于用戶的協同過濾
比如補充下表當中Jim對日式雞排,壽司的打分:
| 鰻魚飯 | 日式炸雞排 | 壽司 | 烤牛肉 | 手撕豬肉 |
| Jim | 2 | 0 | 0 | 4 | 4 |
| John | 5 | 5 | 5 | 3 | 3 |
| sally | 2 | 4 | 2 | 1 | 2 |
| Tom | 1 | 1 | 1 | 5 | 5 |
可以直接計算Jim與其余三個用戶的相似度,然后選最相似的樣本來為Jim的兩個空位打分。但是這樣,如果一旦樣本、特征過多,計算量就猛增。而事實上,我們不一定需要那么多特征,因此可以使用SVD分解把樣本映射到低維空間。(事實上,容易能從數據中看出來映射2維空間,左邊三個和右邊兩個明顯不一樣)
[python]?view plaincopy
food?=?np.mat([[2,?0,?0,?4,?4],?[5,?5,?5,?3,?3],?[2,?4,?2,?1,?2],?[1,?1,?1,?5,?4]])??u,?sigma,?v?=?np.linalg.svd(food)????simple_food?=?np.mat(u[:,?0:2])?*?np.mat(np.diag(sigma[0:2]))?*?np.mat(v[0:2,?:])??
5. SVD計算過程
假設原數據為X,一行代表一個樣本,列代表特征。
1)計算X'X,XX';
2)對XX'進行特征值分解,得到的特征向量組成u,lambda_u;
3)對X'X進行特征值分解,得到的特征向量組成v,lambda_v;
4)lambda_u,lambda_v的重復元素開方組成對角矩陣sigma主對角線上的元素;
一個詳細的例子在這里:http://download.csdn.net/download/zk_j1994/9927957
參考文獻
http://www.cnblogs.com/pinard/p/6251584.html
總結
以上是生活随笔為你收集整理的机器学习SVD【一】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。