集體智慧型程式設計學習筆記 更新

2021-07-11 13:01:15 字數 3504 閱讀 2015

本人是python初學者,本系列用來熟悉python和記錄學習點滴

【度量、引數、函式】『名詞』▲注意

第二章:推薦演算法

語言python

步驟: 1『數值化』將屬性的值對應到數字,。如喜歡:1不喜歡-1;已購買2,已瀏覽1未購買0

2『相似度係數』:用來確定與其他人評委的相似程度的度量。

常用兩種度量:

①【歐幾里得距離】:座標系上兩點之間的距離 

pow(m,n) m的n次方 sqrt(m)m的平方根。/無須

sqrt(pow(a-b,2)+pow(c-d),2))空間(a,b)(c,d)上兩點的距離。須from math import sqrt

距離越小,偏好越接近。不過為了使得總是返回0-1之間的值,並且值越大,偏好越接近。

在這裡對距離進行處理1/(1+sqrt(pow(a-b,2)+pow(c-d),2))),+1並去倒數。

【函式】

def sim_distance(prefs,person1,pernson2):

si={}

for item in prefs[person1]:

if item in prefs[person2]:

si[item]=1

if 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+sum_of_squares)

▲如果乙個人的評價始終比另乙個人嚴格寬鬆,導致評價分蘇偏高偏低,則歐幾里得距離不再使用,下面的方法修正了這一點

②【皮爾遜相關係數】:與某一直線的擬合程度,數學上講就是線性相關程度。是介於-1與1之間的數,1完全正相關,-1完全負相關。

如果乙個人對不同電影打分總是比另乙個人偏高,而二者的分值只差又始終保持一致。

反應在座標系上,資料會擬合成一條直線。兩個的分數的相關程度越高,說明兩人仍有著相對近似的偏好。

公式:兩個變數x、y,那麼兩變數間的皮爾遜相關係數可通過以下公式計算

【函式】

def sim_pearson(prefs,p1,p2):

si={}

for item in prefs[p1]:

if item in prefs[p2]: si[item]=1

if len(si)==0: return 0
n=len(si)

#求和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

③【其他度量】:jaccard係數、曼哈頓距離。
【函式】

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]

返回相似性最高的前n項。

這裡利用了python的列表推導式:  【 函式(表示式) for  var  in 序列(列表、字典)  if condion】

功能是對一組元素進行條件過濾,並的過濾後的元素代入函式或者表示式進行變形,可省略if不進行過濾單獨使用。

這裡similarity用來選擇一種係數,可以是任何一種係數的函式,只要他返回乙個浮點數且數值越大,相似度越大。

4.推薦電影。

我們就需要考慮所有的人的評價,無論他是與我們趣味相投,還是相差甚遠。

通過乙個加權的評價值設計來解決這個問題。

加權後的評價值= 評價值*相似度係數 ,影片得分=加權評價值之和 / 相似度係數之和

【函式】

def getrecommendations(prefs,person,similarity=sim_pearson):

totals={}

simsums={}

for other in prefs:

# 不和自己比較

if other==person: continue

sim=similarity(prefs,person,other)

# 去掉評價0的情況

if sim<=0: continue

for item in prefs[other]:

# 只對自己沒看過或評價為0的電影進行計算

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]+=sim

rankings=[(total/simsums[item],item) for item,total in totals.items()]

rankings.sort()

rankings.reverse()

return rankings

【dict.setdefault(key,[default])】:

如果鍵在字典中,返回這個鍵所對應的值。如果鍵不在字典中,向字典 中插入這個鍵,並且以default為這個鍵的值,並返回 default。default的預設值為none

《集體智慧型程式設計》學習筆記(一)

先構造乙個簡單的資料集 使用者對不同電影的評分 critics gene seymour michael phillips claudia puig mick lasalle jack matthews toby 評價值特點 歐幾里德距離 多維空間中兩點之間的距離,用來衡量二者的相似度。距離越小,相...

《集體智慧型程式設計》學習筆記(一)

先構造乙個簡單的資料集 使用者對不同電影的評分 critics gene seymour michael phillips claudia puig mick lasalle jack matthews toby 評價值特點 歐幾里德距離 多維空間中兩點之間的距離,用來衡量二者的相似度。距離越小,相...

集體智慧型程式設計學習

集體智慧型程式設計學習 概要 文章主要討論一些我遇到的問題,學習到的方法,總結一些演算法的實現過程。注 所參考的版本為2009年出版。書中packages與現在有變化,但是可以通過查閱相關packages文件來找到相關功能 3.相似度排序 4.相似人群加權排名及歸一化 6.構建基於 del.icio...