日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习SVD【一】

發布時間:2025/3/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习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
  • #?-*-?coding:?utf-8?-*-??
  • """?
  • arr?=??
  • ????[[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?=?7?*?7?
  • ?
  • sigma?=?7?*?5,?只返回了對角元素,?其余0元素被省略?
  • ?
  • V?=?5?*?5?
  • """??
  • ??
  • 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]])??
  • ??
  • #?1.?分解??
  • u,?sigma,?v?=?np.linalg.svd(arr)??
  • ??
  • #?2.?重構??
  • 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
  • #?-*-?coding:?utf-8?-*-??
  • """?svd應用2?-?降維?"""??
  • ??
  • import?numpy?as?np??
  • import?matplotlib.pyplot?as?plt??
  • ??
  • ??
  • class?PCA:??
  • ????"""?通過SVD分解來實現PCA??
  • ????1.?訓練數據train_x必須一行代表一個樣本,?一列代表一個特征?
  • ????2.?能夠同時壓縮train_x的行和列?
  • ????3.?可以選擇在壓縮前,?是否對數據進行中心化?
  • ????"""??
  • ????def?__init__(self,?dimension,?centered=True,?compression="cols"):??
  • ????????"""?
  • ????????dimension:??????降維后的維度?
  • ????????centered:???????是否事先對數據進行中心化?
  • ????????compression:????壓縮行,?還是壓縮列?
  • ????????"""??
  • ????????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):??
  • ????????"""?數據轉化(降維)??
  • ????????train_x:????????訓練數據,?一行代表一個樣本?
  • ????????u,?sigma,?v:????奇異值分解結果?
  • ????????result:?????????降維后的數據?
  • ????????"""??
  • ????????#?1.?數據中心化??
  • ????????if?self.centered?==?True:??
  • ????????????train_x?=?self._centered(train_x)??
  • ??????????
  • ????????#?2.?奇異值分解??
  • ????????u,?sigma,?v?=?self._svd(train_x)??
  • ????????v?=?v.T??
  • ??????????
  • ????????#?3.?降維??
  • ????????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):??
  • ????"""?
  • ????new_trainX:?????降維后的數據?
  • ????iris:???????????原數據?
  • ????"""??
  • ????plt.figure()??
  • ????#?Iris-setosa??
  • ????setosa?=?new_trainX[iris[:,?4]?==?0]??
  • ????plt.scatter(setosa[:,?0],?setosa[:,?1],?color="red",?label="Iris-setosa")??
  • ??????
  • ????#?Iris-versicolor??
  • ????versicolor?=?new_trainX[iris[:,?4]?==?1]??
  • ????plt.scatter(versicolor[:,?0],?versicolor[:,?1],?color="orange",?label="Iris-versicolor")??
  • ??????
  • ????#?Iris-virginica??
  • ????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對日式雞排,壽司的打分:


    鰻魚飯日式炸雞排壽司烤牛肉手撕豬肉
    Jim20044
    John55533
    sally24212
    Tom11155
    可以直接計算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【一】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。