
NLP之統(tǒng)計(jì)機(jī)器學(xué)習(xí)中的協(xié)同推薦
這次通過一個(gè)實(shí)例來講解一下協(xié)同推薦的問題。在實(shí)際生活中,我們會經(jīng)常收到當(dāng)當(dāng),卓馬遜等購物網(wǎng)站發(fā)來的商品推薦郵件。很奇怪卓馬遜是依據(jù)什么(數(shù)據(jù)分析師)來給我發(fā)一些相關(guān)商品的推薦,但是今天我們就假定他是根據(jù)協(xié)同推薦的機(jī)制來實(shí)現(xiàn)這一功能的吧。
很多時(shí)候購物網(wǎng)站都是根據(jù)其他用戶的評價(jià)給一個(gè)用戶推薦商品或者圖書等。很多購物網(wǎng)站都會有這種長尾效益,用戶購買或者評價(jià)的商品都是少數(shù),而大多數(shù)商品只是得到很少幾個(gè)用戶的評價(jià)。所以存在數(shù)據(jù)稀疏的問題。這里就叫“cold start”問題。SlopeOne算法可以用來解決這個(gè)問題,這個(gè)算法很簡單,易于實(shí)現(xiàn)且效率較高。
SlopeOne的基本概念很簡單,例如用戶X,Y和A都對項(xiàng)目1打了分。同時(shí)用戶X,Y還對項(xiàng)目2打了分,用戶A對項(xiàng)目2可能會打多少分呢?如下表1-1
用戶對項(xiàng)目1的評分對項(xiàng)目2的評分
X53
Y43
A4?
根據(jù)SlopeOne算法,應(yīng)該是:4-((5-3)+(4-3))/2=2.5.我想這個(gè)應(yīng)該是很好理解的,實(shí)際上就是找到對項(xiàng)目1和項(xiàng)目2都打過分的用戶,算出評分差的平均值,我們就可以推測出對項(xiàng)目1打過分的用戶A對項(xiàng)目2的可能評分,并向用戶A推薦新項(xiàng)目。這里可以看出SolpeOne有一個(gè)很大的優(yōu)點(diǎn),在有很少數(shù)據(jù)的時(shí)候也能得到一個(gè)相對準(zhǔn)確的推薦,這一點(diǎn)可以解決“cold start”問題。當(dāng)然,我們這里的情況是最簡單的,根據(jù)項(xiàng)目1的評價(jià)估計(jì)項(xiàng)目2的評價(jià),如果要根據(jù)好幾個(gè)項(xiàng)目的評價(jià)來估計(jì)某一個(gè)項(xiàng)目的評價(jià)就要用到加權(quán)算法(weighted SolpeOne)。如果有100個(gè)用戶對項(xiàng)目1和項(xiàng)目2做了評價(jià),1000個(gè)用戶對項(xiàng)目3和項(xiàng)目2也打了分。顯然這兩個(gè)的權(quán)重是不同的。我們的計(jì)算方法:(100*(rating 1 to 2)+1000*(rating 3 to 2))/(100+1000)
使用基于SolpeOne算法的推薦需要以下數(shù)據(jù):
1)有一組用戶
2)有一組項(xiàng)目(items),例如圖書,商品等
3)用戶對其中某些項(xiàng)目打分(rating)表達(dá)他們的喜好
SolpeOne算法要解決的問題是:對某個(gè)用戶,已經(jīng)知道他對其中一些項(xiàng)目的評價(jià),向他推薦一些他還沒有評分的項(xiàng)目,以增加銷售機(jī)會。數(shù)據(jù)分析師認(rèn)證
一個(gè)推薦系統(tǒng)的實(shí)現(xiàn)包括以下三步:
1)計(jì)算出任意兩個(gè)項(xiàng)目之間評分的差值
2)輸入某個(gè)用戶的評分記錄,推算出對其他項(xiàng)目的可能評分值
3)根據(jù)評分的值排序,給出評分最高的項(xiàng)目列表
第一步:例如我們有三個(gè)用戶和四個(gè)項(xiàng)目,用戶打分的情況如表1-2
項(xiàng)目用戶1用戶2用戶3
Item1544
Item2454
Item343N/A
Item4N/A55
在第一步中我們的工作就是計(jì)算出項(xiàng)目之間兩兩打分之差,計(jì)算出如下矩陣1-3
Item1Item2Item3Item4
Item1N/A0/32/2-2/2
Item20/3N/A2/2-1/2
Item3-2/2-2/2N/A-2/1
Item42/21/22/1N/A
首先要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)來存儲該矩陣中的每個(gè)打分情況:
public class Rating
{
public float Vlaue {get; set;}
public int Freq {get; set;}
public float AverageValue {
get {return Value/Freq;}
}
}
用一個(gè)Dictionary來保存這個(gè)結(jié)果矩陣,Dictionary的key是Item1Id加上Item2Id,值是Rating:
/************************************************************************/
/* 評分差均值矩陣 */
/************************************************************************/
class RatingDifferenceCollection : Dictionary
{
//獲得評分差值矩陣中的key值
private string GetKey(int Item1Id,int Item2Id)
{
//return Item1Id + "/" + Item2Id;
//根據(jù)差異矩陣的對稱性來簡化存儲
return (Item1Id < Item2Id) ? Item1Id + "/" + Item2Id : Item2Id + "/" + Item1Id;
}
//判斷矩陣中是否存在一對項(xiàng)目的評分差記錄
public bool Contains(int Item1Id,int Item2Id)
{
return this.Keys.Contains(GetKey(Item1Id, Item2Id));
}
//獲得評分差值矩陣中的Value值
public Rating this[int Item1Id,int Item2Id]{
get {
return this[this.GetKey(Item1Id,Item2Id)];
}
set {
this[this.GetKey(Item1Id, Item2Id)] = value;
}
}
}
接下來實(shí)現(xiàn)slopeOne類。首先創(chuàng)建一個(gè)RatingDifferenceCollection來保存矩陣,還要?jiǎng)?chuàng)建HashSet來保持系統(tǒng)中總共有那些項(xiàng)目:
//保存評分差異矩陣的字典
public RatingDifferenceCollection _DiffMarix = new RatingDifferenceCollection();
//系統(tǒng)中總共有多少項(xiàng)目
public HashSet _Items = new HashSet();
public void AddUserRatings(IDictionary userRatings)來實(shí)現(xiàn)差異矩陣的構(gòu)建。
第二步:輸入某個(gè)用戶的評分記錄,推算出其對其他項(xiàng)目的可能評分值,實(shí)現(xiàn)如下
//輸入某個(gè)用戶的評分記錄,推算出對其他項(xiàng)目的可能評分值
public IDictionary Predict (IDictionary userRatings)
{
Dictionary Predictions = new Dictionary();
//遍歷所有的項(xiàng)目
foreach (var itemId in this._Items)
{
//如果是該用戶已經(jīng)評論過的項(xiàng)目,忽略它
if (userRatings.Keys.Contains(itemId)) continue;
Rating itemRating = new Rating();
foreach (var userRating in userRatings)
{
if (userRating.Key == itemId) continue;
int inputItemId = userRating.Key;
if(_DiffMarix.Contains(itemId,inputItemId))
{
//在差異矩陣中找到相應(yīng)的項(xiàng)
Rating diff=_DiffMarix[itemId,inputItemId];
itemRating.Value += diff.Freq * (userRating.Value+diff.AverageValue*((itemId
itemRating.Freq += diff.Freq;
}
}
Predictions.Add(itemId,itemRating.AverageValue);
}
return Predictions;
}
第三步就是測試了,根據(jù)對用戶的評分推測來進(jìn)行相應(yīng)商品的推薦
userRating = new Dictionary();
userRating.Add(1,5);
userRating.Add(3,4);
IDictionary Predictions = test.Predict(userRating);
foreach(var rating in Predictions)
{
Console.WriteLine("Item"+rating.Key+"Rating:"+rating.Value);
}
輸出:
Item2 Rating:5
Item4 Rating:6
因?yàn)榫仃嚨膶ΨQ性,在代碼中對差異矩陣的存儲和相應(yīng)評分項(xiàng)的存儲都有所調(diào)整,這里不詳細(xì)介紹了,完整的實(shí)現(xiàn)了一下這個(gè)算法,給出了一個(gè)Demo在附件中。數(shù)據(jù)分析師培訓(xùn)
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(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)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(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ū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03