
一、基于協(xié)同過濾的推薦系統(tǒng)
協(xié)同過濾(Collaborative Filtering)的推薦系統(tǒng)的原理是通過將用戶和其他用戶的數(shù)據(jù)進行比對來實現(xiàn)推薦的。比對的具體方法就是通過計算兩個用戶數(shù)據(jù)之間的相似性,通過相似性的計算來說明兩個用戶數(shù)據(jù)之間的相似程度。相似度函數(shù)的設計必須滿足度量空間的三點要求,即非負性,對稱性和三角不等性。常用的相似度的計算方法有:歐式距離法、皮爾遜相關系數(shù)法和夾角余弦相似度法。具體的可以參見上一篇文章“協(xié)同過濾推薦算法(1) ”。
二、面臨的問題
在基本的協(xié)同過濾的推薦系統(tǒng)中(主要指上面所提到的基本模型中),我們是在整個空間上計算相似度,進而實現(xiàn)推薦的。但是現(xiàn)實中的數(shù)據(jù)往往并不是那么規(guī)整,普遍的現(xiàn)象就是在用戶數(shù)據(jù)中出現(xiàn)很多未評分項,如下面所示的數(shù)據(jù):
對于這樣的稀疏矩陣,我們利用基本的協(xié)同過濾推薦算法的效率必將很低。對于這樣的稀疏矩陣,我們可以利用SVD對其進行降維,將這樣的稀疏矩陣映射到另一個具體的主題空間,SVD降維的原理可以參見博文“SVD奇異值分解”。
三、利用SVD構造主題空間
我們對上面所示的這樣一個矩陣進行SVD分解,分解的結果為:
1、U矩陣
(U矩陣,矩陣U主要反應的是用戶信息)
2、對角陣S
(S矩陣,矩陣S主要反映的是11個奇異值)
3、VT矩陣
(VT矩陣,矩陣VT主要反映的是物品信息)
4、選取奇異值并映射主題空間
奇異值分解公式為:,現(xiàn)在我們要將原始數(shù)據(jù)映射到反映物品的相互關系中。選取前5個奇異值,奇異值的選取符合能量的規(guī)則,選擇出來的奇異值的能量要能反映90%的原始信息。這樣新的主題空間的計算方式為:數(shù)據(jù)分析師培訓
即可得新的主題空間:
四、實驗的仿真
我們在這樣的數(shù)據(jù)集上做推薦計算。其中user為2號用戶。
(相似度的計算)
(推薦結果)
MATLAB代碼
主程序
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
%% 主函數(shù)
% 導入數(shù)據(jù)
%data = [4,4,0,2,2;4,0,0,3,3;4,0,0,1,1;1,1,1,2,0;2,2,2,0,0;1,1,1,0,0;5,5,5,0,0];
data = [2,0,0,4,4,0,0,0,0,0,0;0,0,0,0,0,0,0,0,0,0,5;0,0,0,0,0,0,0,1,0,4,0;3,3,4,0,3,0,0,2,2,0,0;5,5,5,0,0,0,0,0,0,0,0;
0,0,0,0,0,0,5,0,0,5,0;4,0,4,0,0,0,0,0,0,0,5;0,0,0,0,0,4,0,0,0,0,4;0,0,0,0,0,0,5,0,0,5,0;0,0,0,3,0,0,0,0,4,5,0;
1,1,2,1,1,2,1,0,4,5,0];
% reccomendation
%[sortScore, sortIndex] = recommend(data, 3, 'cosSim');
[sortScore, sortIndex] = recommend(data, 2, 'cosSim');
len = size(sortScore);
finalRec = [sortIndex, sortScore];
disp(finalRec);
SVD空間映射的函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ score ] = SVDEvaluate( data, user, simMeas, item )
[m,n] = size(data);
simTotal = 0;
ratSimTotal = 0;
% 奇異值分解
[U S V] = svd(data);
% 求使得保留90%能量的奇異值
sizeN = 0;%記錄維數(shù)
[m_1,n_1] = size(S);
a = 0;%求總能量
for i = 1:m_1
a = a + S(i,i)*S(i,i);
end
b = a*0.9;%能量的90%
c = 0;
for i = 1:n_1
c = c + S(i,i)*S(i,i);
if c >= b
sizeN = i;
break;
end
end
%物品降維后的空間
itemTransformed = data' * U(:,1:sizeN) * S(1:sizeN,1:sizeN)^(-1);
for j = 1:n
userRating = data(user, j);%此用戶評價的商品
if userRating == 0 || j == item%只是找到已評分的商品
continue;
end
vectorA = itemTransformed(item,:);
vectorB = itemTransformed(j,:);
switch simMeas
case {'cosSim'}
similarity = cosSim(vectorA,vectorB);
case {'ecludSim'}
similarity = ecludSim(vectorA,vectorB);
case {'pearsSim'}
similarity = pearsSim(vectorA,vectorB);
end
disp(['the ', num2str(item), ' and ', num2str(j), ' similarity is ', num2str(similarity)]);
simTotal = simTotal + similarity;
ratSimTotal = ratSimTotal + similarity * userRating;
end
if simTotal == 0
score = 0;
else
score = ratSimTotal./simTotal;
end
end
推薦的函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ sortScore, sortIndex ] = recommend( data, user, simMeas )
% 獲取data的大小
[m, n] = size(data);%m為用戶,n為商品
if user > m
disp('The user is not in the dataBase');
end
% 尋找用戶user未評分的商品
unratedItem = zeros(1,n);
numOfUnrated = 0;
for j = 1:n
if data(user, j) == 0
unratedItem(1,j) = 1;%0表示已經(jīng)評分,1表示未評分
numOfUnrated = numOfUnrated + 1;
end
end
if numOfUnrated == 0
disp('the user has rated all items');
end
% 對未評分項打分,已達到推薦的作用
itemScore = zeros(numOfUnrated,2);
r = 0;
for j = 1:n
if unratedItem(1,j) == 1%找到未評分項
r = r + 1;
%score = evaluate(data, user, simMeas, j);
score = SVDEvaluate(data, user, simMeas, j);
itemScore(r,1) = j;
itemScore(r,2) = score;
end
end
%排序,按照分數(shù)的高低進行推薦
[sortScore, sortIndex_1] = sort(itemScore(:,2),'descend');
[numOfIndex,x] = size(sortIndex_1(:,1));
sortIndex = zeros(numOfIndex,1);
for m = 1:numOfIndex
sortIndex(m,:) = itemScore(sortIndex_1(m,:),1);
end
end
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經(jīng)網(wǎng)絡(RNN)家族中,長短期記憶網(wǎng)絡(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ù)字經(jīng)濟蓬勃發(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 輸出不確定的成因、影響與應對策略? 長短期記憶網(wǎng)絡(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(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ù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03