前言什麼是集體智慧型?
答:為了創造新的想法,而將一群人的行為、偏好或思想組合在一起。
第二章:提供推薦
例子:影片推薦
一、名詞:協作型過濾演算法(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 ...