在網上購物,聽歌,看電影的**上,**都會根據我們的購物記錄,聽歌記錄或著是**記錄給我們推薦一些商品,**或者是電影。那這些推薦系統是怎麼實現的呢?首先,推薦乙個東西,得是購物者所感興趣的,那麼怎麼判斷購物者對該物品感興趣呢?那麼,就得根據購物者的記錄來判斷了,假定購物者所購買的物品都是他所感興趣的。那麼跟該購物者的物品相似的物品就是可以推薦的,這種推薦是基於相似條目的。另外,可以相似的人會大都會有相同的愛好,因此可以根據購物者的該買記錄找出相似的購物者,並把相似購物者購買的物品推薦出來,這就是基於相似使用者的推薦。
這裡簡單講解一種基於使用者相似度的簡單的經典演算法——歐里幾得距離演算法。
歐里幾得距離指的就是平面上的兩個點的距離,即是如下方式計算:
擴充套件到n維的空間上,兩個點的距離為:
那麼,假定兩個購物者x,y,他們都購買了某一件物品,或者都沒有購買某一件物品,那麼該點的距離為0,如果只有一人購買了,那麼距離為1,通過計算他們所買的所有物品的距離,就可以計算處x和y的距離distance(x,y)
可以通過以下程式來實現:
#初始距離,即是最小距離為0.對於相通的商品,0表示沒有購買,1表示購買了的。通過計算,得知x和y的距離為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
sqrt(dis)
print distance(x_user,y_user)
這樣計算存在乙個問題,對於不同數目的商品,計算出來的距離會不在同乙個範圍內,所以需要對結果進行處理。相似度在0-1的範圍內,越大表示相似度越高。那麼相似度公式為:
經過這樣的處理,就可以保證相似度和距離成反比,且保持在0-1的範圍內。
**修正如下:
#注釋:pow()函式---次方!/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)
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...