日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于用户的协同过滤和皮尔逊相关系数

發布時間:2025/7/25 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于用户的协同过滤和皮尔逊相关系数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于用戶的協同過濾和皮爾遜相關系數

?isnowfy?algorithm,?web frameborder="0" hspace="0" marginheight="0" marginwidth="0" scrolling="no" tabindex="0" vspace="0" width="100%" id="I0_1448430258843" name="I0_1448430258843" src="https://apis.google.com/u/0/se/0/_/+1/fastbutton?usegapi=1&size=small&origin=http%3A%2F%2Fwww.isnowfy.com&url=http%3A%2F%2Fwww.isnowfy.com%2Fcollaborative-filtering-and-pearson-correlation-coefficient%2F&gsrc=3p&ic=1&jsh=m%3B%2F_%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.zh_CN.3ZnptyJyqBA.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Ft%3Dzcms%2Frs%3DAGLTcCO9UqyjRGXu4wYeaqGuwkJDGsrriQ#_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart%2Concircled%2Cdrefresh%2Cerefresh&id=I0_1448430258843&parent=http%3A%2F%2Fwww.isnowfy.com&pfname=&rpctoken=13579790" data-gapiattached="true" title="+1" style="border-width: 0px; border-style: none; margin: 0px; padding: 0px; vertical-align: baseline; position: static; top: 0px; width: 70px; left: 0px; visibility: visible; height: 15px; background: transparent;"> Go to comment

推薦系統的經典算法就是協同過濾了,協同過濾算法有兩種,一種是基于物品的,一種是基于用戶的。從很多實驗效果來看基于用戶的協同過濾算法要好于基于物品的協同過濾算法。

那么簡單來說基于物品的協同過濾算法是說我會推薦給你和你喜歡物品相似的物品,而基于用戶的協同過濾算法是說我把和你相似的用戶喜歡的東西推薦給你。為什么叫協同過濾呢,因為我們是利用用戶的群體行為來作這些相似操作的。計算物品的相似的時候我們比較不同的人來對他打分來比較,同樣計算用戶相關性的時候我們就是通過對比他們對相同物品打分的相關度來計算的,我們來舉個例子。

--------+--------+--------+--------+--------+| X | Y | Z | R | --------+--------+--------+--------+--------+a | 5 | 4 | 1 | 5 | --------+--------+--------+--------+--------+b | 4 | 3 | 1 | ? | --------+--------+--------+--------+--------+c | 2 | 2 | 5 | 1 | --------+--------+--------+--------+--------+

a用戶給X物品打了5分,Y打了4分,Z打了1分,同理b用戶和c用戶,那么很容易看到a用戶和b用戶非常相似,但是b用戶沒有看過R物品,那么我們就可以把和b用戶很相似的a用戶打分很高的R物品推薦給b用戶,這就是基于用戶的協同過濾。

ok,回到我們協同過濾的算法上,現在我們知道了基于用戶的協同過濾需要比較用戶的相關性,那么如何計算這個相關性呢,于是我們可以利用兩個用戶對于相同物品的評分來計算相關性。對于a,b用戶而言,他們都對XYZ物品進行了評價,那么,a我們可以表示為(5,4,1),b可以表示為(4,3,1),經典的算法是計算把他們看作是兩個向量,并計算兩個向量間的夾角,或者說計算向量夾角的cosine值來比較,于是a和b的相關性為。

sim=5?4+4?3+1?152+42+12?42+32+12

這個值介于-1到1之間,越大,說明相關性越大。

到這里似乎cosine還是不錯的,但是考慮這么個問題,用于用戶間的差異,d用戶可能喜歡打高分,e用戶喜歡打低分,f用戶喜歡亂打分。

--------+--------+--------+--------+| X | Y | Z | --------+--------+--------+--------+d | 4 | 4 | 5 | --------+--------+--------+--------+e | 1 | 1 | 2 | --------+--------+--------+--------+f | 4 | 1 | 5 | --------+--------+--------+--------+

很顯然用戶d和e對于作品評價的趨勢是一樣的,所以應該認為d和e更相似,但是用cosine計算出來的只能是d和f更相似。于是就有皮爾遜相關系數(pearson correlation coefficient)。

sim=ni=1(Xi?Xˉ)?(Yi?Yˉ)ni=1(Xi?Xˉ)2?ni=1(Yi?Yˉ)2

pearson其實做的事情就是先把兩個向量都減去他們的平均值,然后再計算cosine值。

最后讓我們用實際數據來對比下cosine和pearson的效果吧。這里我們用到了movielens的數據,數據是1000多個用戶對于1700個movie的超過10000的評分數據,數據已經分成多組,并且每組都是80%的訓練數據和20%的測試數據。我們在訓練數據上對于每個用戶找出和他相似的20個用戶,然后把當前用戶沒看過的這些用戶的movie的評分加權和,然后選出5篇分數最高的作為推薦,然后把推薦出來的在測試數據上計算一個得分。代碼如下。

  • # -*- coding: utf-8 -*-
  • import?heapq
  • name =?'u1'
  • def?get(f):
  • ret =?{}
  • for?i?in?open(f,?'r'):
  • tmp =?map(int,?filter(lambda?x:len(x)>0, i.split('\t')))
  • if?tmp[0]?not?in?ret:
  • ret[tmp[0]]?=?{}
  • ret[tmp[0]][tmp[1]]?= tmp[2]
  • return?ret
  • def?cosine(item1, item2):
  • sum0 =?sum(map(lambda?x:x[0]*x[1],?zip(item1, item2)))
  • sum1 =?sum(map(lambda?x:x*x, item1))
  • sum2 =?sum(map(lambda?x:x*x, item2))
  • return?sum0/(sum1**0.5)/(sum2**0.5)
  • def?pearson(item1, item2):
  • a1 =?(sum(item1)+0.0)/len(item1)
  • a2 =?(sum(item2)+0.0)/len(item2)
  • sum0 =?sum(map(lambda?x:(x[0]-a1)*(x[1]-a2),?zip(item1, item2)))
  • sum1 =?sum(map(lambda?x:(x-a1)*(x-a1), item1))
  • sum2 =?sum(map(lambda?x:(x-a2)*(x-a2), item2))
  • if?not?sum1?or?not?sum2:
  • return?cosine(item1, item2)
  • return?sum0/(sum1**0.5)/(sum2**0.5)
  • def?get_sim(user):
  • ret =?{}
  • for?i?in?user:
  • ret[i]?=?{}
  • for?j?in?user:
  • itemset =?set(user[i].keys())&set(user[j].keys())
  • tmp1 =?map(lambda?x:x[1],?filter(lambda?y:y[0]?in?itemset,?sorted(user[i].items())))
  • tmp2 =?map(lambda?x:x[1],?filter(lambda?y:y[0]?in?itemset,?sorted(user[j].items())))
  • if?not?len(tmp1):
  • ret[i][j]?=?0
  • else:
  • ret[i][j]?= cosine(tmp1, tmp2)
  • return?ret
  • def?get_re(user, sim):
  • ret =?{}
  • for?i?in?user:
  • tmp =?filter(lambda?y:y[0]!=i,?heapq.nlargest(20, sim[i].items(), key=lambda?x:x[1]))
  • tmp_res =?{}
  • for?j?in?tmp:
  • for?k?in?user[j[0]]:
  • if?k?in?user[i]:
  • continue
  • if?k?not?in?tmp_res:
  • tmp_res[k]?=?0
  • tmp_res[k]?+= j[1]*user[j[0]][k]
  • ret[i]?=?map(lambda?x:x[0],?heapq.nlargest(5, tmp_res.items(), key=lambda?x:x[1]))
  • return?ret
  • def?test_score(test_data,?re):
  • score =?0
  • for?i?in?test_data:
  • u = test_data[i]
  • r =?re[i]
  • tmp =?0
  • for?i?in?r:
  • if?i?in?u:
  • tmp += u[i]
  • score +=?(tmp+0.0)/len(r)
  • return?score/len(test_data)
  • def?main():
  • data1 = get(name+'.base')
  • data2 = get(name+'.test')
  • sim = get_sim(data1)
  • re?= get_re(data1, sim)
  • print?test_score(data2,?re)
  • if?__name__ ==?'__main__':
  • main()
  • 最后我們看看結果。

    從圖中可以看出,用pearson來計算用戶相似來進行推薦的話,效果還是要好于cosine的。所以說基于用戶的協同過濾還是用pearson來做用戶相似是比較好的阿。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的基于用户的协同过滤和皮尔逊相关系数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。