
1. 奇異值分解 SVD(singular value decomposition)
1.1 SVD評價
優(yōu)點: 簡化數(shù)據(jù), 去除噪聲和冗余信息, 提高算法的結果
缺點: 數(shù)據(jù)的轉換可能難以理解
1.2 SVD應用
(1) 隱性語義索引(latent semantic indexing, LSI)/隱性語義分析(latent semantic analysis, LSA)
在LSI中, 一個矩陣由文檔和詞語組成的.在該矩陣上應用SVD可以構建多個奇異值, 這些奇異值代表文檔中的概念或主題, 可以用于更高效的文檔搜索.
(2) 推薦系統(tǒng)
先利用SVD從數(shù)據(jù)中構建一個主題空間, 然后在該主題空間下計算相似度.
1.3 SVD分解
SVD是一種矩陣分解技術,其將原始的數(shù)據(jù)集矩陣A(m*n)分解為三個矩陣,分解得到的三個矩陣的維度分別為m*m,m*n,n*n.其中
除了對角元素不為0,其它元素均為0,其對角元素稱為奇異值,且按從大到小的順序排列, 這些奇異值對應原始數(shù)據(jù)集矩陣A的奇異值,即A*A(T)的特征值的平方根.
在某個奇異值(r個)之后, 其它的奇異值由于值太小,被忽略置為0, 這就意味著數(shù)據(jù)集中僅有r個重要特征,而其余特征都是噪聲或冗余特征.如下圖所示:
問題: 如何選擇數(shù)值r?
解答: 確定要保留的奇異值數(shù)目有很多啟發(fā)式的策略,其中一個典型的做法就是保留矩陣中90%的能量信息.為了計算能量信息,將所有的奇異值求其平方和,從大到小疊加奇異值,直到奇異值之和達到總值的90%為止;另一種方法是,當矩陣有上萬個奇異值時, 直接保留前2000或3000個.,但是后一種方法不能保證前3000個奇異值能夠包含錢90%的能量信息,但是操作簡單.
****SVD分解很耗時,通過離線方式計算SVD分解和相似度計算,是一種減少冗余計算和推薦所需時間的辦法.
2. 基于協(xié)同過濾的推薦引擎
2.1 定義
協(xié)同過濾是通過將用戶和其他用戶的數(shù)據(jù)進行對比來實現(xiàn)推薦的.
例如: 試圖對某個用戶喜歡的電影進行預測,搜索引擎會發(fā)現(xiàn)有一部電影該用戶還沒看過,然后它會計算該電影和用戶看過的電影之間的相似度, 如果相似度很高, 推薦算法就會認為用戶喜歡這部電影.
缺點: 在協(xié)同過濾情況下, 由于新物品到來時由于缺乏所有用戶對其的喜好信息,因此無法判斷每個用戶對其的喜好.而無法判斷某個用戶對其的喜好,也就無法利用該商品.
2.2 相似度計算
協(xié)同過濾利用用戶對食物的意見來計算相似度,下圖給出了一些用戶對菜的評級信息所組成的矩陣:
定義相似度在0-1之間變化,且物品對越相似,其相似度值越大,可以使用公式 相似度 = 1/(1 + 距離) 來計算相似度.
計算距離的方法如下:
(1) 歐氏距離
(2)皮爾遜相關系數(shù)(pearson correlation)
度量兩個向量間的相似度,該方法優(yōu)于歐氏在于其對用戶評級的量級不敏感,例如某個人對所有物品的評分都是5分,另一個人對所有物品評分都是1分,皮爾遜相關系數(shù)認為這兩個評分向量是相等的. 不過皮爾遜相關系數(shù)的取值范圍是(-1,1),通過0.5 + 0.5 * corrcoef()將其歸一化到0-1之間.
(3) 余弦相似度( cosine similarity)
計算的是兩個向量夾角的余弦值.其取值范圍是(-1,1),因此也要將其歸一化到(0,1)區(qū)間.
以下是這三種相似度計算方法的代碼實現(xiàn):
<span style="font-size:18px;">def eulidSim(in1,in2):
return 1.0/(1.0+la.norm(in1-in2))
def pearsonSim(in1,in2):
if len(in1) < 3: #檢查是否存在3個或更多的點,小于的話,這兩個向量完全相關
return 1.0
return 0.5 + 0.5 * corrcoef(in1,in2,rowvar = 0)[0][1]
</span><span style="font-size:18px;"> def cosSim(in1,in2):
num = float(in1.T * in2)
denom = la.norm(in1) * la.norm(in2)
return 0.5 + 0.5 * (num/denom)
</span>
2.3 餐館菜推薦引擎
(1) 用處: 推薦餐館食物. 給定一個用戶, 系統(tǒng)會為此用戶推薦N個最好的推薦菜.為了實現(xiàn)這一目的,要做到:
尋找用戶沒有評級的菜, 即在用戶-物品矩陣中的0值;
在用戶沒有評級的所有物品中,對每個物品預計一個可能的評級分數(shù).
對這些物品的評分從高到低進行排序,返回前n個物品
下面是實現(xiàn)代碼:
<span style="font-size:18px;">#計算在給定相似度計算方法的條件下,用戶user對物品item的估計評分值
def standEst(dataMat,user,simMea,item):
n = shape(dataMat)[1]
simTotal = 0.0
ratSimTotal = 0.0
for j in range(n):
userRate = dataMat[user,j]
if userRate == 0 :
continue
#得到對菜item和j都評過分的用戶id,用來計算物品item和j之間的相似度
overlap = nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
if len(overlap) == 0:
similarity = 0
else:
#計算物品item和j之間的相似度(必須選取用戶對這兩個物品都評分的用戶分數(shù)構成物品分數(shù)向量)
similarity = simMea(dataMat[overlap,item],dataMat[overlap,j])
simTotal += similarity
ratSimTotal += similarity * userRate
if simTotal ==0:
return 0
else:
return ratSimTotal/simTotal #歸一化處理
#輸入依次是數(shù)據(jù)矩陣,用戶編號,返回的菜的個數(shù),距離計算方法,獲得物品評分的函數(shù)
def recommend(dataMat,user,n=3,simMea=cosSim,estMethod=standEst):
#返回user用戶未評分的菜的下標
unratedItem = nonzero(dataMat[user,:].A == 0)[1]
if(len(unratedItem) == 0):
return 'you rated every one'
itemScore = []
#對每個沒評分的菜都估計該用戶可能賦予的分數(shù)
for item in unratedItem:
score = estMethod(dataMat,user,simMea,item)
itemScore.append((item,score))
#返回評分最高的前n個菜下標以及分數(shù)
return sorted(itemScore, key = lambda jj:jj[1],reverse = True)[:n]</span>
2.4 利用SVD提高推薦效果
實際的數(shù)據(jù)集得到的矩陣相當稀疏,因此可以先利用SVD將原始矩陣映射到低維空間中,; 然后再在低維空間中, 計算物品間的相似度,大大減少計算量.
其代碼實現(xiàn)如下:
<span style="font-size:18px;">#通過SVD對原始數(shù)據(jù)矩陣降維,便于計算物品間的相似度
def scdEst(dataMat,user,simMea,item):
n = shape(dataMat)[1]
simTotal = 0.0
ratSimTotal = 0.0
u,sigma,vt = la.svd(dataMat) #sigma是行向量
sig4 = mat(eye(4) * sigma[:4]) #只利用最大的4個奇異值,將其轉換為4*4矩陣,非對角元素為0
xformedItems = dataMat.T * u[:,:4] * sig4.I #得到n*4
for j in range(n):
userRate = dataMat[user,j]
if userRate == 0 or j == item:
continue
#得到對菜item和j都評過分的用戶id,用來計算物品item和j之間的相似度
#overlap = nonzero(logical_and(dataMat[:,item].A>0,dataMat[:,j].A>0))[0]
#if len(overlap) == 0:
# similarity = 0
#else:
#計算物品item和j之間的相似度
# similarity = simMea(dataMat[overlap,item],dataMat[overlap,j])
similarity = simMea(xformedItems[item,:].T,xformedItems[j,:].T)
simTotal += similarity
ratSimTotal += similarity * userRate
if simTotal ==0:
return 0
else:
return ratSimTotal/simTotal #歸一化處理</span>
3. 基于SVD的圖像壓縮
<span style="font-size:18px;">#打印矩陣
def printMat(in1,thresh=0.8):
for i in range(32):
for k in range(32):
if(float(in1[i,k]) > thresh):
print 1,
else:
print 0,
print ''
#利用SVD實現(xiàn)圖像壓縮,允許基于任意給定的奇異值來重構圖像,默認去前3個奇異值
def imgCompress(numSV=3,thresh=0.8):
#32*32 matrix
my1 = []
for line in open('0_5.txt').readlines():
newrow = []
for i in range(32):
newrow.append(int(line[i]))
my1.append(newrow)
myMat = mat(my1)
print '***original matrix***'
printMat(myMat)
u,sigma,vt = la.svd(myMat)
#將sigma矩陣化,即sigrecon的對角元素是sigma的元素
sigrecon = mat(zeros((numSV,numSV)))
for k in range(numSV):
sigrecon[k,k] = sigma[k]
#重構矩陣
reconMat = u[:,:numSV] * sigrecon * vt[:numSV,:]
print '***reconstruct matrix***'
printMat(reconMat)</span>
以數(shù)字為例:數(shù)字0存儲為32*32的矩陣,需要存儲1024個數(shù)據(jù); 通過實驗發(fā)現(xiàn)只需要2個奇異值就能夠很精確地對圖像進行重構,u,vt的大小都是32*2的矩陣,再加上2個奇異值,則需要32*2*2+2=130個0-1值來存儲0;通過對比發(fā)現(xiàn),實現(xiàn)了幾乎10倍的壓縮比.
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經網絡(RNN)家族中,長短期記憶網絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務的價值轉化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據(jù)查詢到趨勢預判? ? 在數(shù)據(jù)驅動決策的時代,預測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內權威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網絡(LSTM)作為循環(huán)神經網絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調研數(shù)據(jù)中的深度應用? 市場調研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉日期:解鎖數(shù)據(jù)處理的關鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03