集體智慧型程式設計學習筆記 第二章

2021-07-25 16:38:41 字數 3601 閱讀 6328

前言什麼是集體智慧型?

答:為了創造新的想法,而將一群人的行為、偏好或思想組合在一起。

第二章:提供推薦

例子:影片推薦

一、名詞:協作型過濾演算法(collaborative filtering)

對一大群人進行搜尋,從中找到與我們品味相近的一小群人。

二、蒐集偏好

非常簡單的方法是使用乙個巢狀的字典

三、尋找品味相近的人

步驟:1、將屬性的值對應到數值。如喜歡:1不喜歡-1;已購買2,已瀏覽1未購買0;進行評分1,2,3,4

2、相似度評價值:用來確定與其他人的相似程度的度量。

常用兩種度量:

①【歐幾里得距離】:歐式空間上兩點之間的距離的模值。 

python中pow(m,n) m的n次方 sqrt(m)m的平方根。

在使用aqrt時要注意,from math import sqrt

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

對距離進行處理1/(1+sqrt(pow(a-b,2)+pow(c-d),2))),+1是為了避免被零整除。

這樣,值越接近1就表示越相似。

**

from math import sqrt

#返回乙個person1和person2之間的基於距離的相似度評價

def sim_distance(prefs,person1,person2):

#得到shared_items 的列表

si = {}

for item in prefs[person1]:

if item in prefs[person2]:

si[item] = 1

#如果兩者之間沒有共同之處,返回0

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完全負相關。

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

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

#返回p1、p2的pearson相關係數

def sim_pearson(prefs,p1,p2):

#得到雙方都評價過的物品

si = {}

for item in prefs[p1]:

if item in prefs[p2]:

si[item] = 1

#得到雙方都評價過的物品的個數

n = len(si)

if n == 0:

return 1

#對所有偏好求和

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])

#計算pearson相關係數

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(reverse=true)

return scores[0:n]

**中n代表顯示趣味相投的前n個人

4、推薦物品

為了解決這種問題,設定權值。把相似度看成權值,這樣與被推薦人趣味相近的人對推薦做的貢獻就大。

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

#利用所有他人的評價值的加權平均,為某人提供建議

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

totals = {}#存放加權後評分之和

simsums = {}#存放參與評價的相似度之和

for other in prefs:

if other == person: continue

sim = similarity(prefs,person,other)

#忽略評價值為零或者小於零的情況

if sim<=0: continue

for item in prefs[other]:

#只對自己還沒有看過的電影進行評價

totals.setdefault(item,0)#如果某人沒有評價,則將他的評價設定為0,不影響求和

totals[item]+=prefs[other][item]*sim

#相似度之和

simsums.setdefault(item,0)

simsums[item]+=sim

#建立乙個歸一化的列表

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

#返回經過排序的列表,列表內元素是元組,預設對元組內第乙個元素排序嗎?看來是的

#如果把item放在前面,會按照首字母排序

ranking.sort(reverse=true)

return ranking

這樣就得到了乙個經過排名的影片列表,還可以據此推測出自己對每部影片的評價。

現在,就建立起乙個推薦系統,適用於任何型別的商品推薦或者網路連線。

需要的就是建立乙個有人員、物品、評價的字典。然後度量相似度。最後按照相似度排序進行推薦。

集體智慧型程式設計 第二章,推薦演算法

有乙個 允許使用者對她看過的電影打分。乙個可能的結果是 使用者1 使用者2 使用者3 省略其他使用者。怎麼計算相似度呢?第一種方式是向量距離,也就是常用的 x1 x2 2 y1 y2 2開根號。第二種方式是pearson相關係數,利用的是斜率,比如jack喜歡打高分 a 5,b 4 tom喜歡打低分...

第二章學習筆記

在c 中,陣列下標從0開始,而不是1.c 不支援陣列的抽象,也不支援對整個陣列的操作。在c 中,物件可以靜態分配 即編譯器在處理程式源 時分配,也可以動態分配 即程式執行時,用執行時刻庫函式來分配。靜態與動態記憶體分配的兩個主要區別是 1 靜態物件是有名字的變數,可以直接對你進行操作。而動態物件是沒...

第二章學習筆記

ansi c 有翻譯和執行兩種環境,且不必在一台機器上,例如交叉編譯器 cross compiler 作業系統也是如此 freestanding environment 翻譯 將源 轉換為可執行機器指令 執行 實際執行 翻譯經過以下階段 形成的目標檔案字尾可能在不同系統下不同,如 o obj cc ...