機器學習 提供推薦

2021-08-15 21:19:47 字數 4208 閱讀 3183

計算兩個人的相似度

本來是推薦平均評分較高的作品,考慮到兩個人的愛好相似程度,對評分根據相似度進行加權平均

計算相似度:

歐幾里得距離

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之間的數。可以看出,有一些已經打分了,有一...