Python之協同過濾(尋找相近的使用者)
資料內容是人們對不同電影的評價:我們通過計算人與人之間評價電影的相關度來找到口味相同的人,根據口味相同的人來推薦可能喜歡的電影。
資料如下:
critics={'lisa rose':{'lady in the Water':2.5,'snakes on a plane':3.5,'just my luck':3.0,'superman returns':3.5,
'you ,me and dupree':2.5,'the night listener':3.0},
'gene seymour':{'lady in the Water':3.0,'snakes on a plane':3.5,'just my luck':1.5,'superman returns':5.0,
'you ,me and dupree':3.5,'the night listener':3.0},
'michael phillips':{'lady in the Water':2.5,'snakes on a plane':3.0,'superman returns':3.5,
'the night listener':4.0},
'claudia puig':{'snakes on a plane':3.5,'just my luck':3.0,'superman returns':4.0,
'you ,me and dupree':2.5,'the night listener':4.5},
'mick lasalle':{'lady in the Water':3.0,'snakes on a plane':4.0,'just my luck':2.0,'superman returns':3.0,
'you ,me and dupree':2.0,'the night listener':3.0},
'jack mattews':{'lady in the Water':3.0,'snakes on a plane':4.0,'superman returns':5.0,
'you ,me and dupree':3.5,'the night listener':3.0},
'toby':{'snakes on a plane':4.5,'superman returns':4.0,'you ,me and dupree':1.0}}
兩種計算距離的方法:
from math import sqrt
def sim_distnace(prefs,persion1,persion2):
si={}
for item in prefs[persion1]:
if item in prefs[persion2]:
si[item]=1
if len(si)==0:return 0
sum_of_squares=sum([pow(prefs[persion1][item]-prefs[persion2][item],2)
for item in prefs[persion1] if item in prefs[persion2]])
return 1/(1+sqrt(sum_of_squares))
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]:
si[item]=1
n=len(si)
if n==0 : return 1
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
sum1sq=sum([pow(prefs[p1][it],2) for it in si])
sum2sq=sum([pow(prefs[p2][it],2) for it in si])
psum=sum([prefs[p1][it]*prefs[p2][it] for it in si])
num=psum-(sum1*sum2/n)
den=sqrt((sum1sq-pow(sum1,2)/n)*(sum2sq-pow(sum2,2)/n))
if den==0:return 0
r=num/den
return r
測試程式碼:
from recommendations import critics
from distance import sim_pearson
from skimage.transform._geometric import SimilarityTransform
def topMatches(prefs,person,n=5,Similarity=sim_pearson):
scores=[(Similarity(prefs,person,other),other) for other in prefs if other!=person]
scores.sort();
scores.reverse();
return scores[0:n]
print(topMatches(critics,'toby',n=3))
實驗結果:
[(0.9912407071619299, 'lisa rose'), (0.9244734516419049, 'mick lasalle'), (0.8934051474415647, 'claudia puig')]
我們僅僅找到跟我們品味相同的人是不夠的,我們要得到對影片的評價,跟我們品味相同的人,我們就更加看重他的評價,所以我們把相關係數作為權值來計算一個影片的評價分數。
程式碼如下:
def getRecommendations(prefs,person,Similarity=sim_pearson):
totals={}
simSums={}
for other in prefs:
if other == person:continue
sim=Similarity(prefs,person,other)
if sim<0:continue
for item in prefs[other]:
if item not in prefs[person] or prefs[person][item]==0:
totals.setdefault(item,0)
totals[item]+=prefs[other][item]*sim
simSums.setdefault(item,0)
simSums[item]+=Similarity
rankings=[(total/simSums[item],item) for item,total in totals.items()]
rankings.sort()
rankings.reverse()
return rankings
相關文章
- 協同過濾筆記筆記
- 基於使用者的協同過濾演算法演算法
- 協同過濾演算法演算法
- chapter2:協同過濾APT
- 協同過濾演算法概述與python 實現協同過濾演算法基於內容(usr-it演算法Python
- 【Datawhale】推薦系統-協同過濾
- 推薦協同過濾演算法演算法
- 協同過濾演算法——入門演算法
- 協同過濾演算法簡介演算法
- 基於使用者的協同過濾來構建推薦系統
- 基於物品的協同過濾演算法演算法
- SimRank協同過濾推薦演算法演算法
- chapter3:協同過濾-隱式評級及基於物品的過濾APT
- 推薦召回--基於物品的協同過濾:ItemCF
- 協同過濾實現小型推薦系統
- 協同過濾推薦演算法總結演算法
- 協同過濾的R語言實現及改進R語言
- 協同過濾在推薦系統中的應用
- Slope One :簡單高效的協同過濾演算法演算法
- 基於矩陣分解的協同過濾演算法矩陣演算法
- 推薦系統入門之使用協同過濾實現商品推薦
- 物品推薦(基於物品的協同過濾演算法)演算法
- 深入理解mahout基於hadoop的協同過濾流程Hadoop
- 推薦系統與協同過濾、奇異值分解
- 協同過濾(CF)演算法詳解和實現演算法
- 神經圖協同過濾(Neural Graph Collaborative Filtering)Filter
- [機器學習]協同過濾演算法的原理和基於Spark 例項機器學習演算法Spark
- [R]可能是史上程式碼最少的協同過濾推薦引擎
- Django(67)drf搜尋過濾和排序過濾Django排序
- 通過觸發器尋找密碼錯誤使用者觸發器密碼
- 矩陣分解在協同過濾推薦演算法中的應用矩陣演算法
- SAP 尋找使用者出口Exit
- 【小白學推薦1】 協同過濾 零基礎到入門
- 過濾搜尋引擎的抓取資料
- 通過文章獲得的贊同數爬取、過濾“掘金”中的文章(python Web)PythonWeb
- 協同辦公系統尋求合作
- 預測電影偏好?如何利用自編碼器實現協同過濾方法
- jQuery之過濾元素jQuery