熱線電話:13121318867

登錄
首頁精彩閱讀NLP之統計機器學習中的協同推薦
NLP之統計機器學習中的協同推薦
2016-01-16
收藏

NLP之統計機器學習中的協同推薦

這次通過一個實例來講解一下協同推薦的問題。在實際生活中,我們會經常收到當當,卓馬遜等購物網站發來的商品推薦郵件。很奇怪卓馬遜是依據什么(數據分析師)來給我發一些相關商品的推薦,但是今天我們就假定他是根據協同推薦的機制來實現這一功能的吧。

  很多時候購物網站都是根據其他用戶的評價給一個用戶推薦商品或者圖書等。很多購物網站都會有這種長尾效益,用戶購買或者評價的商品都是少數,而大多數商品只是得到很少幾個用戶的評價。所以存在數據稀疏的問題。這里就叫“cold start”問題。SlopeOne算法可以用來解決這個問題,這個算法很簡單,易于實現且效率較高。

  SlopeOne的基本概念很簡單,例如用戶X,Y和A都對項目1打了分。同時用戶X,Y還對項目2打了分,用戶A對項目2可能會打多少分呢?如下表1-1

  用戶對項目1的評分對項目2的評分

  X53

  Y43

  A4?

  根據SlopeOne算法,應該是:4-((5-3)+(4-3))/2=2.5.我想這個應該是很好理解的,實際上就是找到對項目1和項目2都打過分的用戶,算出評分差的平均值,我們就可以推測出對項目1打過分的用戶A對項目2的可能評分,并向用戶A推薦新項目。這里可以看出SolpeOne有一個很大的優點,在有很少數據的時候也能得到一個相對準確的推薦,這一點可以解決“cold start”問題。當然,我們這里的情況是最簡單的,根據項目1的評價估計項目2的評價,如果要根據好幾個項目的評價來估計某一個項目的評價就要用到加權算法(weighted SolpeOne)。如果有100個用戶對項目1和項目2做了評價,1000個用戶對項目3和項目2也打了分。顯然這兩個的權重是不同的。我們的計算方法:(100*(rating 1 to 2)+1000*(rating 3 to 2))/(100+1000)

  使用基于SolpeOne算法的推薦需要以下數據:

  1)有一組用戶

  2)有一組項目(items),例如圖書,商品等

  3)用戶對其中某些項目打分(rating)表達他們的喜好

  SolpeOne算法要解決的問題是:對某個用戶,已經知道他對其中一些項目的評價,向他推薦一些他還沒有評分的項目,以增加銷售機會。數據分析師認證

  一個推薦系統的實現包括以下三步:

  1)計算出任意兩個項目之間評分的差值

  2)輸入某個用戶的評分記錄,推算出對其他項目的可能評分值

  3)根據評分的值排序,給出評分最高的項目列表

  第一步:例如我們有三個用戶和四個項目,用戶打分的情況如表1-2

  項目用戶1用戶2用戶3

  Item1544

  Item2454

  Item343N/A

  Item4N/A55

  在第一步中我們的工作就是計算出項目之間兩兩打分之差,計算出如下矩陣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

  首先要定義一個數據結構來存儲該矩陣中的每個打分情況:

  public class Rating

  {

  public float Vlaue {get; set;}

  public int Freq {get; set;}

  public float AverageValue {

  get {return Value/Freq;}

  }

  }

  用一個Dictionary來保存這個結果矩陣,Dictionary的key是Item1Id加上Item2Id,值是Rating:


  /************************************************************************/

  /* 評分差均值矩陣 */

  /************************************************************************/

  class RatingDifferenceCollection : Dictionary

  {

  //獲得評分差值矩陣中的key值

  private string GetKey(int Item1Id,int Item2Id)

  {

  //return Item1Id + "/" + Item2Id;

  //根據差異矩陣的對稱性來簡化存儲

  return (Item1Id < Item2Id) ? Item1Id + "/" + Item2Id : Item2Id + "/" + Item1Id;

  }

  //判斷矩陣中是否存在一對項目的評分差記錄

  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;

  }

  }

  }

  接下來實現slopeOne類。首先創建一個RatingDifferenceCollection來保存矩陣,還要創建HashSet來保持系統中總共有那些項目:

  //保存評分差異矩陣的字典

  public RatingDifferenceCollection _DiffMarix = new RatingDifferenceCollection();

  //系統中總共有多少項目

  public HashSet _Items = new HashSet();

  public void AddUserRatings(IDictionary userRatings)來實現差異矩陣的構建。

  第二步:輸入某個用戶的評分記錄,推算出其對其他項目的可能評分值,實現如下

  //輸入某個用戶的評分記錄,推算出對其他項目的可能評分值

  public IDictionary Predict (IDictionary userRatings)

  {

  Dictionary Predictions = new Dictionary();

  //遍歷所有的項目

  foreach (var itemId in this._Items)

  {

  //如果是該用戶已經評論過的項目,忽略它

  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))

  {

  //在差異矩陣中找到相應的項

  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;

  }

  第三步就是測試了,根據對用戶的評分推測來進行相應商品的推薦

  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

  因為矩陣的對稱性,在代碼中對差異矩陣的存儲和相應評分項的存儲都有所調整,這里不詳細介紹了,完整的實現了一下這個算法,給出了一個Demo在附件中。數據分析師培訓

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢