計算兩個人的相似度
本來是推薦平均評分較高的作品,考慮到兩個人的愛好相似程度,對評分根據相似度進行加權平均
計算相似度:
歐幾里得距離
pearson相關度
critics=,
'gene seymour': ,
'michael phillips': ,
'claudia puig': ,
'mick lasalle': ,
'jack matthews': ,
'toby': }
pearson相關係數計算公式(參考)
# 歐幾里得距離評價
def sim_distance(prefs, person1, person2):
si = {}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] =1if
len(si) ==
0: return
0
sum_of_squares =
sum([pow(prefs[person1][item] - prefs[person2][item], 2)
for item in prefs[person1] if item in prefs[person2]])
return
1/ (1
+ sqrt(sum_of_squares))
# 皮爾遜相關度評價
def sim_pearson(prefs, person1, person2):
# 得到兩者評價過的相同商品
si = {}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] =
1
n =len(si)
# 如果兩個使用者之間沒有相似之處則返回1
if n ==
0: return
1# 對各自的所有偏好求和
sum1 =
sum([prefs[person1][item] for item in si])
sum2 =
sum([prefs[person2][item] for item in si])
# 求各自的平方和
sum1_square =
sum([pow(prefs[person1][item], 2) for item in si])
sum2_square =
sum([pow(prefs[person2][item], 2) for item in si])
# 求各自的乘積的平方
sum_square =
sum([prefs[person1][item] * prefs[person2][item] for item in si])
# 計算pearson相關係數
den = sqrt((sum1_square -
pow(sum1, 2) / n) * (sum2_square -
pow(sum2, 2) / n))
if den ==
0: return
0return (sum_square - (sum1 * sum2/n)) / den
print sim_distance(critics, 'lisa rose', 'gene seymour')
0.294298055086
print sim_pearson(critics, 'lisa rose', 'gene seymour')
0.396059017191
def topmatches(prefs, person, n =
5, simlarity = sim_pearson):
scores = [(simlarity(prefs, person, other), other) for other in prefs if other != person]
# 對列表進行排序,評價高者排在前面
scores.sort()
scores.reverse()
# 取指定個數的(不需要判斷n的大小,因為python中的元組可以接受正、負不在範圍內的index)
return scores[0:n]
尋找和「toby」有相似偏好的人,取前3個
topmatches(critics, 'toby', n =
3)
[(0.9912407071619299, 'lisa rose'),
(0.9244734516419049, 'mick lasalle'),
(0.8934051474415647, 'claudia puig')]
# 利用其他所有人的加權平均給使用者推薦
def get_recommendations(prefs, person, similarity=sim_pearson):
# 其他使用者對某個電影的評分加權之後的總和
totals = {}
# 其他使用者的相似度之和
sim_sums = {}
for other in prefs:
# 不和自己比較
if other == person:
continue
# 求出相似度
sim = similarity(prefs, person, other)
# 忽略相似度小於等於情況0的
if sim <=
0: continue
# 獲取other所有的評價過的電影評分的加權值
for item in prefs[other]:
# 只推薦使用者沒看過的電影
if item not
in prefs[person] or prefs[person][item] ==
0: #print item
# 設定預設值
totals.setdefault(item, 0)
# 求出該電影的加權之後的分數之和
totals[item] += prefs[other][item] * sim
# 求出各個使用者的相似度之和
sim_sums.setdefault(item, 0)
sim_sums[item] += sim
# 對於加權之後的分數之和取平均值
rankings = [(total / sim_sums[item], item) for item, total in totals.items()]
# 返回經過排序之後的列表
rankings.sort()
rankings.reverse()
return rankings
給出toby的電影推薦列表
print get_recommendations(critics, 'toby')
print get_recommendations(critics, 'toby', similarity=sim_distance)
[(3.3477895267131013, 'the night listener'), (2.8325499182641614, 'lady in the water'), (2.5309807037655645, 'just my luck')]
[(3.457128694491423, 'the night listener'), (2.778584003814924, 'lady in the water'), (2.4224820423619167, 'just my luck')]
機器學習資料推薦
4 pattern recognition and machine learning bishop 700頁 大名鼎鼎的機器學習教材,現在沒有中文版。2008版本,所以文中的內容很有時代性和系統性 7 discrete stochastic processes draft of 2nd editio...
機器學習 推薦演算法
推薦系統的核心問題是為使用者推薦與其興趣相似度比較高的商品。此時需要乙個函式f x 來計算候選商品與使用者之間的相似度,並向使用者推薦相似度比較高的商品。為了能夠 出函式f x 可以利用的歷史資料主要有 使用者的歷史行為資料 與該使用者相關的其他使用者資訊 商品之間的相似性 文字的描述等等。其中,r...
機器學習 推薦系統
在各類 軟體或各大購物 裡,通常會存在推薦系統。它可以根據每個使用者的個人喜好為使用者推薦相應的歌曲 商品 從而增加使用者體驗,並提高了產品的銷量。因此,推薦系統是乙個很值得學習的應用領域。如下圖所示,這是4個使用者對5部電影的評價,我們要求評價只能是0 5之間的數。可以看出,有一些已經打分了,有一...