机器学习实战(十四)利用SVD简化数据
- 第十四章 利用SVD簡化數(shù)據(jù)
- 14.1 SVD的應(yīng)用
- 14.1.1 隱形語義索引
- 14.1.2 推薦系統(tǒng)
- 14.2 矩陣分解(SVD矩陣分解)
- 14.3 利用python實(shí)現(xiàn)SVD
- 14.4 基于協(xié)同過濾(collaborative filtering)的推薦引擎
- 14.4.1 相似度計(jì)算
- 14.4.2 基于物品的相似度還是基于用戶的相似度?
- 14.4.3 推薦引擎的評價(jià)
- 14.5 示例:餐館菜肴推薦系統(tǒng)
- 14.5.1 推薦未嘗過的菜肴
- 14.5.2 利用SVD提高推薦效果
- 14.5.3 構(gòu)建推薦引擎面臨的挑戰(zhàn)
- 14.6 基于SVD的圖像壓縮
- 14.7 總結(jié)
- 第十四章 利用SVD簡化數(shù)據(jù)
第十四章 利用SVD簡化數(shù)據(jù)
14.1 SVD的應(yīng)用
餐館可以劃分為很多類別,比如中式、美式、快餐、素食等等,但是人們可以喜歡某些混合的類別,比如中式素食的子類別,我們可以對記錄用戶關(guān)于餐館觀點(diǎn)的數(shù)據(jù)進(jìn)行處理,并且從中提取背后的因素,這些因素可能與類別、配料或其他任意對象一致。
提取這些信息的方法稱為奇異值分解(Singular Value Decomposition,SVD)。
作用:能夠用小得多的數(shù)據(jù)集來表示原始數(shù)據(jù)集
原理:去除了噪聲和冗余信息,也就是從噪聲數(shù)據(jù)中抽取信息。
14.1.1 隱形語義索引
SVD最早的應(yīng)用之一就是信息檢索,稱為隱形語義索引(Latent Semantic Indexing,LSI)或隱形語義分析(Latent Semantic Analysis,LSA)。
LSI中,一個(gè)矩陣是由文檔和詞語組成的,當(dāng)在該矩陣上應(yīng)用SVD時(shí),就會(huì)構(gòu)建多個(gè)奇異值,這些奇異值代表了文檔中的概念或者主題,這一特點(diǎn)可以用于更高效的文檔搜索。
14.1.2 推薦系統(tǒng)
SVD的另一個(gè)應(yīng)用就是推薦系統(tǒng)。 先利用SVD從數(shù)據(jù)中構(gòu)建一個(gè)主題空間, 然后在該主題空間下計(jì)算相似度。
上述矩陣由餐館的菜和品菜師對這些菜的意見構(gòu)成的。品菜師采用1到5之間的任意一個(gè)整數(shù)來對菜評級(jí),如果品菜師沒有嘗過某道菜,則評級(jí)為0。對上述矩陣進(jìn)行SVD分解,會(huì)得到兩個(gè)奇異值(注意其特征值位2),也即仿佛有兩個(gè)概念或主題與此數(shù)據(jù)集相關(guān)聯(lián)。
SVD是矩陣分解的一種類型,而矩陣分解時(shí)將數(shù)據(jù)矩陣分解為多個(gè)獨(dú)立部分的過程,下面首先介紹矩陣分解。
14.2 矩陣分解(SVD矩陣分解)
在很多情況下,數(shù)據(jù)中的一小段攜帶了數(shù)據(jù)集中的大部分信息,其他信息則要么是噪聲,要么就是毫不相關(guān)的信息。在線性代數(shù)中還有很多矩陣分解技術(shù)。 矩陣分解可以將原始矩陣表示成新的易于處理的形式。
SVD將原始數(shù)據(jù)集矩陣Data?m?n??Datam?n分解為三個(gè)矩陣:
Data?m?n?=U?m?m?Σ?m?n?V?T?n?n??Datam?n=Um?mΣm?nVn?nT矩陣Σ?Σ:
1)只有對角元素(也稱奇異值),其他元素均為0
2)對角元素是從大到小排列的
3)奇異值就是矩陣Data?Data?T??Data?DataT特征值的平方根
在某個(gè)奇異值(r個(gè))之后, 其它的奇異值由于值太小,被忽略置為0, 這就意味著數(shù)據(jù)集中僅有r個(gè)重要特征,而其余特征都是噪聲或冗余特征。如下圖所示:
如何選擇數(shù)值r?
解答: 確定要保留的奇異值數(shù)目有很多啟發(fā)式的策略,其中一個(gè)典型的做法就是保留矩陣中90%的能量信息.為了計(jì)算能量信息,將所有的奇異值求其平方和,從大到小疊加奇異值,直到奇異值之和達(dá)到總值的90%為止;另一種方法是,當(dāng)矩陣有上萬個(gè)奇異值時(shí), 直接保留前2000或3000個(gè).,但是后一種方法不能保證前3000個(gè)奇異值能夠包含錢90%的能量信息,但是操作簡單.
SVD分解很耗時(shí),通過離線方式計(jì)算SVD分解和相似度計(jì)算,是一種減少冗余計(jì)算和推薦所需時(shí)間的辦法.
14.3 利用python實(shí)現(xiàn)SVD
Numpy的linalg的線性代數(shù)工具箱來實(shí)現(xiàn),其有包括處理求范式、逆、行列式、偽逆、秩、qr分解、svd分解等等函數(shù)。
from numpy import * from numpy import linalg as ladef loadExData():return [[1,1,1,0,0],[2,2,2,0,0],[5,5,5,0,0],[1,1,0,2,2],[0,0,0,3,3],[0,0,0,1,1]]Data=loadExData() U,Sigma,VT=la.svd(Data)#由于Sigma是以向量的形式存儲(chǔ),故需要將其轉(zhuǎn)為矩陣, sig3=mat([[Sigma[0],0,0],[0,Sigma[1],0],[0,0,Sigma[2]]]) # 也可以用下面的方法,將行向量轉(zhuǎn)化為矩陣,并且將值放在對角線上,取前面三行三列 # Sig3=diag(Sigma)[:3,:3] print(Sigma) #重構(gòu)原始矩陣 print(U[:,:3]*sig3*VT[:3,:])結(jié)果:
U: [[ -1.80802750e-01 -1.71990790e-02 1.86518261e-02 9.66314851e-011.32410225e-01 -1.23975026e-01][ -3.61605500e-01 -3.43981580e-02 3.73036522e-02 -2.19496756e-018.71711981e-01 -2.42086892e-01][ -9.04013750e-01 -8.59953949e-02 9.32591306e-02 -1.05464268e-01-3.75166837e-01 1.21629762e-01][ -1.36839850e-01 5.33014079e-01 -8.34967572e-01 -7.16304166e-16-3.46093235e-16 2.46957870e-16][ -2.29617316e-02 7.97696413e-01 5.12984591e-01 -2.63326233e-02-9.04630306e-02 -3.01865919e-01][ -7.65391052e-03 2.65898804e-01 1.70994864e-01 7.89978699e-022.71389092e-01 9.05597757e-01]]Sigma: [ 9.56627891e+00 5.29323150e+00 6.84111192e-01 3.10730143e-164.98171926e-32]VT: [[ -5.81304643e-01 -5.81304643e-01 -5.67000247e-01 -3.66097214e-02-3.66097214e-02][ 3.21952849e-03 3.21952849e-03 -9.74777636e-02 7.03731964e-017.03731964e-01][ -4.02584831e-01 -4.02584831e-01 8.17929585e-01 5.84897501e-025.84897501e-02][ 7.07106781e-01 -7.07106781e-01 5.19776737e-17 1.98940359e-171.98940359e-17][ -0.00000000e+00 1.80770896e-17 -1.42706714e-17 7.07106781e-01-7.07106781e-01]]sig3 : [[ 9.56627891 0. 0. ][ 0. 5.2932315 0. ][ 0. 0. 0.68411119]]重構(gòu)矩陣(和原始矩陣非常接近):[[ 1.00000000e+00 1.00000000e+00 1.00000000e+00 -9.14152286e-16-9.14152286e-16][ 2.00000000e+00 2.00000000e+00 2.00000000e+00 -3.49477979e-16-3.49477979e-16][ 5.00000000e+00 5.00000000e+00 5.00000000e+00 6.09916192e-166.09916192e-16][ 1.00000000e+00 1.00000000e+00 2.79971461e-16 2.00000000e+002.00000000e+00][ -6.37559172e-17 5.31300838e-17 2.94979631e-16 3.00000000e+003.00000000e+00][ -4.45609774e-17 -5.59897708e-18 1.68959598e-16 1.00000000e+001.00000000e+00]]重構(gòu)矩陣和原始矩陣非常接近,類似于壓縮圖像,只保留圖像分解后的兩個(gè)方陣和一個(gè)對角陣的對角元素,就可以恢復(fù)原始圖像。
觀察上述結(jié)果中的Sigma,可以發(fā)現(xiàn)前三個(gè)數(shù)值比后面兩個(gè)大了很多,于是可以將后面兩個(gè)值去掉。
原始數(shù)據(jù)集就和下面結(jié)果近似:
Data?m?n?=U?m?3?Σ?3?3?V?T?3?n??Datam?n=Um?3Σ3?3V3?nT14.4 基于協(xié)同過濾(collaborative filtering)的推薦引擎
近些年來,推薦引擎對因特網(wǎng)用戶而言已經(jīng)不是什么新鮮事物了,Amazon會(huì)根據(jù)顧客的購買歷史向他們推薦物品,新聞網(wǎng)站會(huì)對用戶推薦新聞報(bào)道等。
接下來我們介紹被稱為“協(xié)同過濾”的方法,來實(shí)現(xiàn)推薦功能。協(xié)同過濾是通過將用戶和其他用戶的數(shù)據(jù)進(jìn)行對比來實(shí)現(xiàn)推薦的。
數(shù)據(jù)組織成了類似圖14-2所給出的矩陣的形式,當(dāng)數(shù)據(jù)采用這種方式進(jìn)行組織時(shí),我們就可以比較用戶或物品之間的相似度了,當(dāng)知道相似度后,就可以利用已有的數(shù)據(jù)來預(yù)測未知用戶喜好。
例如: 試圖對某個(gè)用戶喜歡的電影進(jìn)行預(yù)測,搜索引擎會(huì)發(fā)現(xiàn)有一部電影該用戶還沒看過,然后它會(huì)計(jì)算該電影和用戶看過的電影之間的相似度, 如果相似度很高, 推薦算法就會(huì)認(rèn)為用戶喜歡這部電影.
缺點(diǎn): 在協(xié)同過濾情況下, 由于新物品到來時(shí)由于缺乏所有用戶對其的喜好信息,因此無法判斷每個(gè)用戶對其的喜好.而無法判斷某個(gè)用戶對其的喜好,也就無法利用該商品.
14.4.1 相似度計(jì)算
不利用專家給出的重要屬性來描述物品從而計(jì)算其相似度,而是利用用戶對他們的意見來計(jì)算相似度,這就是協(xié)同過濾使用的方法。并不關(guān)心物品的描述屬性,而是嚴(yán)格按照許多用戶的觀點(diǎn)來計(jì)算相似度。
一、歐氏距離
手撕豬肉和烤牛肉間的歐氏距離:
手撕豬肉和鰻魚飯的歐氏距離:
因此手撕豬肉和烤牛肉更為相似
相似性度量方式: 0~1之間的變化,可以使用相似度=11+距離??相似度=11+距離來度量,距離為0時(shí),相似度為1,距離很大時(shí),相似度趨于0。
二、皮爾遜相關(guān)系數(shù)(person correlation)
度量兩個(gè)向量之間的相似度,相對于歐式距離的優(yōu)勢在于對用戶評級(jí)的量級(jí)并不敏感。
Numpy中實(shí)現(xiàn):corrcoef()
取值范圍:[-1,1],通過0.5+0.5?corrcoef()?0.5+0.5?corrcoef()函數(shù)來計(jì)算,將其取值范圍歸一化到[0,1]。
三、余弦相似度(cosine similarity)
度量兩個(gè)向量夾角的余弦值,如果夾角為90°,則相似度為0,如果兩個(gè)向量方向相同,相似度為1。
取值范圍:[-1,+1],因此也需要將其歸一化到(0,1)之間。
定義:cosθ=A?B||A||||B||??cosθ=A?B||A||||B||
其中,||A||?||A||、||B||?||B||表示向量的2范數(shù),例如向量[4,2,2]?[4,2,2]的2范數(shù)為4?2?+2?2?+2?2???????????????????????√??42+22+22
Numpy中,范數(shù)的計(jì)算方法:linalg.norm()
2范數(shù)=x到0點(diǎn)的歐氏距離
其他距離:
代碼實(shí)現(xiàn):
結(jié)果(相似度):
0.135078105936 1.0 0.548001536074 1.0 0.204196010845 1.014.4.2 基于物品的相似度還是基于用戶的相似度?
菜肴之間的距離:基于物品(item-based)的相似度
用戶之間的距離:基于用戶(user-based)的相似度
行與行之間比較的是基于用戶的相似度,列與列之間比較的則是基于物品的相似度。
基于物品相似度計(jì)算的時(shí)間會(huì)隨物品數(shù)量的增加而增加,基于用戶的相似度計(jì)算的時(shí)間則會(huì)隨用戶數(shù)量的增加而增加。如果用戶的數(shù)目很多,那么我們可能傾向于使用基于物品相似度的計(jì)算方法。對于大部分產(chǎn)品導(dǎo)向的推薦系統(tǒng)而言,用戶的數(shù)量往往大于物品的數(shù)量,即購買商品的用戶數(shù)會(huì)多于出售的商品種類。
14.4.3 推薦引擎的評價(jià)
使用交叉測試的方法,具體做法就是我們將某些已知的評分值去掉,然后對它們進(jìn)行預(yù)測,最后計(jì)算預(yù)測值與真實(shí)值之間的差異。通常使用的指標(biāo)為最小均方根誤差(Root Mean Squared Error, RMSE)。
14.5 示例:餐館菜肴推薦系統(tǒng)
假設(shè)他不知道去哪里吃飯,該點(diǎn)什么菜,則我們的系統(tǒng)可以推薦給他。
步驟:
1)構(gòu)建一個(gè)基本引擎,能夠?qū)ふ矣脩魶]有品嘗過的菜肴
2)通過SVD來減少特征空間,并提高推薦效果
3)將程序打包并通過用戶可讀的人機(jī)界面提供給人們使用
14.5.1 推薦未嘗過的菜肴
過程:
給定一個(gè)用戶,系統(tǒng)會(huì)為此用戶返回N個(gè)最好的推薦菜。需要:
結(jié)果:
[[1 1 1 4 4][2 2 2 0 4][5 5 5 4 0][1 1 0 2 2][0 2 0 3 3][0 0 0 1 1]] [(2, 5.6806547361770336), (0, 5.6789547243533818)] [(0, 6.9478362016501283), (2, 6.9253660746962069)] [(0, 5.9000000000000004), (2, 5.666666666666667)]我們可知:
用戶4對物品2的預(yù)測評分值為5.6806547361770336;
用戶4對物品0的預(yù)測評分值為5.6789547243533818;
14.5.2 利用SVD提高推薦效果
下面展示一個(gè)更加真實(shí)的矩陣的例子:
結(jié)果:
Sigma:[ 15.77075346 11.40670395 11.03044558 4.84639758 3.092920552.58097379 1.00413543 0.72817072 0.43800353 0.220821130.07367823] Sig2:[ 2.48716665e+02 1.30112895e+02 1.21670730e+02 2.34875695e+019.56615756e+00 6.66142570e+00 1.00828796e+00 5.30232598e-011.91847092e-01 4.87619735e-02 5.42848136e-03] sum(Sig2): 542.0 sum(Sig2) * 0.9: 487.8 前兩個(gè)元素包含的能量: 378.829559511 前三個(gè)元素包含的能量: 500.500289128前三個(gè)元素包含的能量超過了總能量的90%,故可以將這11維矩陣轉(zhuǎn)化為3維矩陣,對轉(zhuǎn)化后的三維空間構(gòu)造一個(gè)相似度計(jì)算函數(shù),利用SVD將所有的菜肴映射到一個(gè)低維空間。
from numpy import * from numpy import linalg as ladef loadExData2():return [[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]# 利用不同的方法計(jì)算相似度 def eulidSim(inA, inB):return 1.0/(1.0+la.norm(inA - inB))#根據(jù)歐式距離計(jì)算相似度def pearsSim(inA, inB):if len(inA)<3:return 1.0else:return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1]def cosSim(inA, inB):num = float(inA.T*inB) #向量inA和向量inB點(diǎn)乘,得cos分子denom = la.norm(inA)*la.norm(inB) #向量inA,inB各自范式相乘,得cos分母return 0.5+0.5*(num/denom) #從-1到+1歸一化到[0,1]def standEst(dataMat,user,simMeas,item):"""計(jì)算在給定相似度計(jì)算方法的前提下,用戶對物品的估計(jì)評分值:param dataMat: 數(shù)據(jù)矩陣:param user: 用戶編號(hào):param simMeas: 相似性度量方法:param item: 物品編號(hào):return:"""#數(shù)據(jù)中行為用于,列為物品,n即為物品數(shù)目n=shape(dataMat)[1]simTotal=0.0ratSimTotal=0.0#用戶的第j個(gè)物品for j in range(n):userRating=dataMat[user,j]if userRating==0:continue#尋找兩個(gè)用戶都評級(jí)的物品overLap=nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]if len(overLap)==0:similarity=0else:similarity=simMeas(dataMat[overLap,item],dataMat[overLap,j])simTotal+=similarityratSimTotal+=simTotal*userRatingif simTotal==0:return 0else:return ratSimTotal/simTotaldef recommend(dataMat,user,N=3,simMeas=cosSim,estMethod=standEst):"""推薦引擎,會(huì)調(diào)用standEst()函數(shù):param dataMat: 數(shù)據(jù)矩陣:param user: 用戶編號(hào):param N:前N個(gè)未評級(jí)物品預(yù)測評分值:param simMeas::param estMethod::return:"""#尋找未評級(jí)的物品,nonzeros()[1]返回參數(shù)的某些為0的列的編號(hào),dataMat中用戶對某個(gè)商品的評價(jià)為0的列#矩陣名.A:將矩陣轉(zhuǎn)化為array數(shù)組類型#nonzeros(a):返回?cái)?shù)組a中不為0的元素的下標(biāo)unratedItems=nonzero(dataMat[user,:].A==0)[1]if len(unratedItems)==0:return 'you rated everything!'itemScores=[]for item in unratedItems:estimatedScore=estMethod(dataMat,user,simMeas,item)itemScores.append((item,estimatedScore))return sorted(itemScores,key=lambda jj:jj[1],reverse=True)[:N]#======================基于SVD的評分估計(jì)========================== def SVDEst(dataMat, user, simMeas, item):n = shape(dataMat)[1]simTotal = 0.0ratSimTotal = 0.0U, Sigma, VT = la.svd(dataMat)Sig4 = mat(eye(4)*Sigma[:4]) #化為對角陣,或者用linalg.diag()函數(shù)可破xformedItems = dataMat.T*U[:,:4]*Sig4.I#構(gòu)造轉(zhuǎn)換后的物品for j in range(n):userRating = dataMat[user,j]if userRating == 0 or j == item:continuesimilarity = simMeas(xformedItems[item,:].T, xformedItems[j, :].T)print("the %d and %d similarity is: %f" %(item,j,similarity))simTotal += similarityratSimTotal += similarity*userRatingif simTotal ==0 :return 0else:return ratSimTotal/simTotalmyMat = mat(loadExData2()) print(recommend(myMat, 1, estMethod = SVDEst)) print(recommend(myMat, 1, estMethod = SVDEst, simMeas = pearsSim))結(jié)果:
the 0 and 3 similarity is: 0.490950 the 0 and 5 similarity is: 0.484274 the 0 and 10 similarity is: 0.512755 the 1 and 3 similarity is: 0.491294 the 1 and 5 similarity is: 0.481516 the 1 and 10 similarity is: 0.509709 the 2 and 3 similarity is: 0.491573 the 2 and 5 similarity is: 0.482346 the 2 and 10 similarity is: 0.510584 the 4 and 3 similarity is: 0.450495 the 4 and 5 similarity is: 0.506795 the 4 and 10 similarity is: 0.512896 the 6 and 3 similarity is: 0.743699 the 6 and 5 similarity is: 0.468366 the 6 and 10 similarity is: 0.439465 the 7 and 3 similarity is: 0.482175 the 7 and 5 similarity is: 0.494716 the 7 and 10 similarity is: 0.524970 the 8 and 3 similarity is: 0.491307 the 8 and 5 similarity is: 0.491228 the 8 and 10 similarity is: 0.520290 the 9 and 3 similarity is: 0.522379 the 9 and 5 similarity is: 0.496130 the 9 and 10 similarity is: 0.493617 [(4, 3.3447149384692283), (7, 3.3294020724526971), (9, 3.328100876390069)] the 0 and 3 similarity is: 0.341942 the 0 and 5 similarity is: 0.124132 the 0 and 10 similarity is: 0.116698 the 1 and 3 similarity is: 0.345560 the 1 and 5 similarity is: 0.126456 the 1 and 10 similarity is: 0.118892 the 2 and 3 similarity is: 0.345149 the 2 and 5 similarity is: 0.126190 the 2 and 10 similarity is: 0.118640 the 4 and 3 similarity is: 0.450126 the 4 and 5 similarity is: 0.528504 the 4 and 10 similarity is: 0.544647 the 6 and 3 similarity is: 0.923822 the 6 and 5 similarity is: 0.724840 the 6 and 10 similarity is: 0.710896 the 7 and 3 similarity is: 0.319482 the 7 and 5 similarity is: 0.118324 the 7 and 10 similarity is: 0.113370 the 8 and 3 similarity is: 0.334910 the 8 and 5 similarity is: 0.119673 the 8 and 10 similarity is: 0.112497 the 9 and 3 similarity is: 0.566918 the 9 and 5 similarity is: 0.590049 the 9 and 10 similarity is: 0.602380 [(4, 3.3469521867021736), (9, 3.3353796573274703), (6, 3.307193027813037)]14.5.3 構(gòu)建推薦引擎面臨的挑戰(zhàn)
14.6 基于SVD的圖像壓縮
本節(jié)使用手寫體“0”來展開SVD對圖像的壓縮,原始圖像大小為32*32=1024,進(jìn)行圖像壓縮以后,就可以節(jié)省空間或帶寬開銷了。
代碼:
from numpy import * from numpy import linalg as ladef printMat(inMat,thresh=0.8):"""打印矩陣:param inMat:輸入數(shù)據(jù)集:param thresh:閾值:return:"""#由于矩陣包含了浮點(diǎn)數(shù),因此必須定義深色和淺色,通過閾值來界定#元素大于閾值,打印1,小于閾值,打印0for i in range(32):for k in range(32):if float(inMat[i,k])>thresh:print(1),else:print(0),print('')def imgCompress(numSV=3,thresh=0.8):"""實(shí)現(xiàn)圖像的壓縮,允許基于任意給定的奇異值數(shù)目來重構(gòu)圖像:param numSV::param thresh::return:"""#構(gòu)建列表myl=[]#打開文本文件,從文件中以數(shù)值方式讀入字符for line in open("0_5.txt").readlines():newRow=[]for i in range(32):newRow.append(int(line[i]))myl.append(newRow)myMat=mat(myl)print("******original matrix**********")#使用SVD對圖像進(jìn)行SVD分解和重構(gòu)printMat(myMat,thresh)U,Sigma,VT=la.svd(myMat)#建立一個(gè)全0矩陣SigRecon=mat(zeros((numSV,numSV)))#將奇異值填充到對角線for k in range(numSV):SigRecon[k,k]=Sigma[k]#重構(gòu)矩陣reconMat=U[:,:numSV]*SigRecon*VT[:numSV,:]print("***reconstructed matrix using %d singular values***" %numSV)printMat(reconMat,thresh)if __name__=='__main__':imgCompress(2)只需要兩個(gè)奇異值就能相當(dāng)精確地對圖像實(shí)現(xiàn)重構(gòu),U和VT都是32×2的矩陣,有兩個(gè)奇異值,也即只需要32×2+2+32×2=130個(gè)0、1進(jìn)行存儲(chǔ)。原來需要1024個(gè)0、1,幾乎獲得10倍的壓縮比。
14.7 總結(jié)
SVD是一種強(qiáng)大的降維工具,可以利用SVD來逼近矩陣并從中提取重要特征,保留矩陣80%-90%的能量,得到重要的特征去掉噪音。推薦系統(tǒng)為SVD的一個(gè)成功的應(yīng)用,協(xié)同過濾則是一種基于用戶喜好或行為數(shù)據(jù)的推薦的實(shí)現(xiàn)方法。協(xié)同過濾的核心是相似度計(jì)算方法。
大規(guī)模數(shù)據(jù)集上,SVD的計(jì)算和推薦可能是一個(gè)很困難的工程問題,通過離線的方式來進(jìn)行SVD分解和相似度計(jì)算,是一種減少冗余計(jì)算和推薦所需時(shí)間的辦法。
總結(jié)
以上是生活随笔為你收集整理的机器学习实战(十四)利用SVD简化数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五菱缤果将于 3 月上市,最大续航 33
- 下一篇: 博主:华为鸿蒙OS 4.0设计变动很大