集體智慧型程式設計(一)推薦系統之歐里幾德距離

2022-07-26 14:57:18 字數 2665 閱讀 7984

在網上購物,聽歌,看電影的**上,**都會根據我們的購物記錄,聽歌記錄或著是**記錄給我們推薦一些商品,**或者是電影。那這些推薦系統是怎麼實現的呢?首先,推薦乙個東西,得是購物者所感興趣的,那麼怎麼判斷購物者對該物品感興趣呢?那麼,就得根據購物者的記錄來判斷了,假定購物者所購買的物品都是他所感興趣的。那麼跟該購物者的物品相似的物品就是可以推薦的,這種推薦是基於相似條目的。另外,可以相似的人會大都會有相同的愛好,因此可以根據購物者的該買記錄找出相似的購物者,並把相似購物者購買的物品推薦出來,這就是基於相似使用者的推薦。

這裡簡單講解一種基於使用者相似度的簡單的經典演算法——歐里幾得距離演算法。

歐里幾得距離指的就是平面上的兩個點的距離,即是如下方式計算:

擴充套件到n維的空間上,兩個點的距離為:

那麼,假定兩個購物者x,y,他們都購買了某一件物品,或者都沒有購買某一件物品,那麼該點的距離為0,如果只有一人購買了,那麼距離為1,通過計算他們所買的所有物品的距離,就可以計算處x和y的距離distance(x,y)

可以通過以下程式來實現:

#

!/usr/bin/python

#data

x_user=

y_user=

#calculate distance

from math import

sqrt

defdistance(person1,person2):

dis=0

dis=sum([pow(person1[item]-person2[item],2)

for item in

person1])

return

sqrt(dis)

print distance(x_user,y_user)

初始距離,即是最小距離為0.對於相通的商品,0表示沒有購買,1表示購買了的。通過計算,得知x和y的距離為1。

這樣計算存在乙個問題,對於不同數目的商品,計算出來的距離會不在同乙個範圍內,所以需要對結果進行處理。相似度在0-1的範圍內,越大表示相似度越高。那麼相似度公式為:

經過這樣的處理,就可以保證相似度和距離成反比,且保持在0-1的範圍內。

**修正如下:

#

!/usr/bin/python

#data

x_user=

y_user=

#calculate distance

from math import

sqrt

defdistance(person1,person2):

dis=0

dis=sum([pow(person1[item]-person2[item],2)

for item in

person1])

return 1/(1+sqrt(dis))

print distance(x_user,y_user)

注釋:pow()函式---次方

sqrt() ---乙個非負實數的平方根函式

dictionary: 字典(即c++標準庫的map)

dict =

每乙個元素是pair,包含key、value兩部分。key是integer或string型別,value 是任意型別。

鍵是唯一的,字典只認最後乙個賦的鍵值。

[process_item for item in some_list_or_tuple if condition] 

這種語句就可以得到乙個list, 

比如想得到每個list中每個item加倍的list 

>>> l = [1, 2, 3, 4] 

>>> l 

[1, 2, 3, 4] 

>>> l2 = [i * 2 for i in l] 

>>> l2 

[2, 4, 6, 8] 

如果在加倍的同時想**條件判斷,符合條件的不在結果中,比如大於2的才加倍,可以這樣寫 

>>> l3 = [i * 2 for i in l if i > 2] 

>>> l3 

[6, 8] 

sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]]) 

明白了這個這個表示式就很好理解 

sum()裡的這個引數就是乙個list,[pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]] 

對原list(prefs[person1])的每個item進行求值pow(prefs[person1][item]-prefs[person2][item],2),把這個結果作為新的list的一項,當然還需滿足條件if item in prefs[person2]

此時,計算出的相似度為0.5

以上只是歐里幾德方法的一種簡單實現,這種演算法精度不是很高,還有很多幾個可以提高的方面:

1、對於每個物品的距離,可以更加精確,不只是0或者1,可以是0-5之間的值

參考:​

以及《集體智慧型程式設計》

集體智慧型程式設計 推薦系統2

總體的思路很簡單,為每件物品計算與其最相近的其他物品。然後我們為某為使用者提供推薦時,就可以檢視他曾經評分過的物品,並從中選出排位靠前者 這多少代表了一些喜好 再構造乙個加權的列表,其中包含了與這些選中物品最為相近的其他物品。選擇乙個物品相近的物品的演算法我們上次其實就已經講過了,就是將原先的key...

推薦系統 (一)推薦系統評測

2 評測指標 3 覆蓋率 4 多樣性 5 新穎性 6 驚喜度 7 信任度 8 實時性 9 健壯性 乙個完整的推薦系統一般需要使用者 物品提供者和提供推薦系統的 三個參與方。準確度是推薦系統領域的重要質變,但是準確的 並不代表好的推薦 因為使用者可能不管你推不推薦都會購買,失去了推薦的意義 通過日誌系...

集體智慧型程式設計實踐(一)

usr bin python coding utf 8 乙個涉及影評者及其對幾部電影評分情況的字典 from math import sqrt 收集偏好 critics gene seymour michael phillips claudia puig mick lasalle jack matt...