
簡單易學(xué)的機器學(xué)習(xí)算法—協(xié)同過濾推薦算法(1)
一、推薦系統(tǒng)的概念
推薦系統(tǒng)(Recommendation System, RS),簡單來說就是根據(jù)用戶的日常行為,自動預(yù)測用戶的喜好,為用戶提供更多完善的服務(wù)。舉個簡單的例子,在京東商城,我們?yōu)g覽一本書之后,系統(tǒng)會為我們推薦購買了這本書的其他用戶購買的其他的書:
推薦系統(tǒng)在很多方面都有很好的應(yīng)用,尤其在現(xiàn)在的個性化方面發(fā)揮著重要的作用。
二、推薦系統(tǒng)的分類
推薦系統(tǒng)使用了一系列不同的技術(shù),主要可以分為以下兩類:
基于內(nèi)容(content-based)的推薦。主要依據(jù)的是推薦項的性質(zhì)。
基于協(xié)同過濾(collaborative filtering)的推薦。主要依據(jù)的是用戶或者項之間的相似性。
在協(xié)同過濾方法中,我們很顯然的會發(fā)現(xiàn),基于協(xié)同過濾的推薦系統(tǒng)用可以分為兩類:
基于項(item-based)的推薦系統(tǒng)。主要依據(jù)的是項與項之間的相似性。
基于用戶(user-based)的推薦系統(tǒng)。主要依據(jù)的是用戶與用戶之間的相似性。
三、相似度的度量方法
相似性的度量的方法有很多種,不同的度量方法的應(yīng)用范圍也不一樣。相似性度量方法的設(shè)計也是機器學(xué)習(xí)算法設(shè)計中很重要的一部分,尤其是對于聚類算法,推薦系統(tǒng)這類算法。
相似性的度量方法必須滿足拓?fù)鋵W(xué)中的度量空間的基本條件:
假設(shè)d是度量空間上M的度量,其中度量d滿足:
非負(fù)性:,當(dāng)且
僅當(dāng)時取等號;
對稱性:;
三角不等性:。
這里主要介紹三種相似性的度量方法:歐式距離、皮爾遜相關(guān)系數(shù)和余弦相似度。
1、歐式距離
歐式距離是使用較多的相似性的度量方法,在kMeans中就使用到歐式距離作為相似項的發(fā)現(xiàn)。
2、皮爾遜相關(guān)系數(shù)(Pearson Correlation)
在歐氏距離的計算中,不同特征之間的量級對歐氏距離的影響比較大,例如,和
我們就不能很好的利用歐式距離判斷和,和之間的相似性的大小。而皮爾遜相似性的度量對量級不敏感:
其中表示向量x和向量y內(nèi)積,
表示向量x的二范數(shù)。
3、余弦相似度(Cosine Similarity)
余弦相似度有著與皮爾遜相似度同樣的性質(zhì),對量級不敏感,是計算兩個向量的夾角。在吳軍老師的《數(shù)學(xué)之美》上,在計算文本相似性的過程中,大量使用了余弦相似性的度量方法。
四、基于相似度的推薦系統(tǒng)
協(xié)同過濾是通過將用戶和其他用戶的數(shù)據(jù)進行對比來實現(xiàn)推薦的。我們通過一個評分系統(tǒng)對基于協(xié)同過濾的推薦系統(tǒng)作闡述。
(不同用戶對不同商品的評分)
如圖,橫軸為每個用戶對不同商品的評分,評分的范圍為1~5,0表示該用戶未對該商品評分。我們以用戶Tracy為例,Tracy未對日式炸雞排和壽司飯評分,我們利用協(xié)同過濾推薦系統(tǒng)預(yù)測Tracy對該兩個商品評分,并依據(jù)分?jǐn)?shù)的高低向Tracy推薦商品。
1、計算相似度
在本例中,我們是依據(jù)物品的相似度,即計算日式炸雞排與鰻魚飯、烤牛肉和手撕豬肉的相似度實現(xiàn)對日式炸雞排的評分,用同樣的方法對壽司飯評分。數(shù)據(jù)分析師培訓(xùn)
2、排序
排序的目的是實現(xiàn)在日式炸雞排與壽司飯這兩個商品中推薦給用戶Tracy。
3、實驗結(jié)果
(相似度的計算——基于余弦相似度)
(推薦結(jié)果)
從推薦結(jié)果,我們發(fā)現(xiàn)壽司飯的評分更高,首推壽司飯,日式炸雞排排在壽司飯后面。
4、MATLAB代碼
主程序
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
%% 主函數(shù)
% 導(dǎo)入數(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];
% reccomendation
[sortScore, sortIndex] = recommend(data, 3, 'cosSim');
len = size(sortScore);
finalRec = [sortIndex, sortScore];
disp(finalRec);
計算相似度的函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ score ] = evaluate( data, user, simMeas, item )
[m,n] = size(data);
simTotal = 0;
ratSimTotal = 0;
% 尋找用戶都評價的商品
% data(user, item)為未評價的商品
for j = 1:n
userRating = data(user, j);%此用戶評價的商品
ratedItem = zeros(m,1);
numOfNon = 0;%統(tǒng)計已評價商品的數(shù)目
if userRating == 0%只是找到已評分的商品
continue;
end
for i = 1:m
if data(i,item) ~= 0 && data(i,j) ~= 0
ratedItem(i,1) = 1;
numOfNon = numOfNon + 1;
end
end
% 判斷有沒有都評分的項
if numOfNon == 0
similarity = 0;
else
% 構(gòu)造向量,便于計算相似性
vectorA = zeros(1,numOfNon);
vectorB = zeros(1,numOfNon);
r = 0;
for i = 1:m
if ratedItem(i,1) == 1
r = r+1;
vectorA(1,r) = data(i, j);
vectorB(1,r) = data(i, item);
end
end
switch simMeas
case {'cosSim'}
similarity = cosSim(vectorA,vectorB);
case {'ecludSim'}
similarity = ecludSim(vectorA,vectorB);
case {'pearsSim'}
similarity = pearsSim(vectorA,vectorB);
end
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
% 對未評分項打分,已達(dá)到推薦的作用
itemScore = zeros(numOfUnrated,2);
r = 0;
for j = 1:n
if unratedItem(1,j) == 1%找到未評分項
r = r + 1;
score = evaluate(data, user, simMeas, j);
itemScore(r,1) = j;
itemScore(r,2) = score;
end
end
%排序,按照分?jǐn)?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ù):
歐式距離函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ ecludSimilarity ] = ecludSim( vectorA, vectorB )
ecludSimilarity = 1./(1 + norm(vectorA - vectorB));
end
皮爾遜相關(guān)系數(shù)函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ pearsSimilarity ] = pearsSim( vectorA, vectorB )
pearsSimilarityMatrix = 0.5 + 0.5 * corrcoef(vectorA, vectorB);
pearsSimilarity = pearsSimilarityMatrix(1,2);
end
余弦相似度函數(shù)
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
function [ cosSimilarity ] = cosSim( vectorA, vectorB )
%注意vectorA和vectorB都是行向量
num = vectorA * vectorB';
denom = norm(vectorA) * norm(vectorB);
cosSimilarity = 0.5 + 0.5 * (num./denom);
end
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(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日 實施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(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ù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,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