99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀NLP之統(tǒng)計(jì)機(jī)器學(xué)習(xí)中的協(xié)同推薦
NLP之統(tǒng)計(jì)機(jī)器學(xué)習(xí)中的協(xié)同推薦
2016-01-16
收藏

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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }