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

2021-07-23 15:04:04 字數 4795 閱讀 5652

**:

#!usr/bin/python

# -*- coding: utf-8 -*-

# 乙個涉及影評者及其對幾部電影評分情況的字典

from math import sqrt

# 收集偏好

critics = ,

'gene seymour': ,

'michael phillips': ,

'claudia puig': ,

'mick lasalle': ,

'jack matthews': ,

'toby': }

# 返回乙個有關person1與person2的基於距離的相似度評價

defsim_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 + sqrt(sum_of_squares))

# 返回p1和p2的皮爾遜相關係數

defsim_person

(prefs, p1, p2):

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

si = {}

for item in prefs[p1]:

if item in prefs[p2]:

si[item] = 1

# 得到列表元素的個數

n = len(si)

# 如果兩者沒有共同之處,則返回1

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

# 計算皮爾遜評價值

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

# 從反映偏好的字典中返回最為匹配者

# 返回結果的個數和相似度函式均為可選引數

deftopmatches

(prefs, person, n=5, similarity=sim_person):

scores = [(similarity(prefs, person, other), other) for other in prefs if other != person]

# 對結果進行排序,評價值最高的排在最前面

scores.sort()

scores.reverse()

return scores[0:n]

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

defgetrecommendations

(prefs, person, similarity=sim_person):

totals = {}

simsums = {}

for other in prefs:

# 不要和自己作比較

if other == person:

continue

sim = similarity(prefs, person, other)

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

if sim <= 0:

continue

for item in prefs[other]:

# 只對自己還未曾看過的影片進行評價

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

# 匹配商品

deftransformprefs

(prefs):

result = {}

for person in prefs:

for item in prefs[person]:

result.setdefault(item, {})

# 將物品和人員對調

result[item][person] = prefs[person][item]

return result

# 構造物品比較資料集

defcalculatesimilaritems

(prefs, n=10):

# 建立字典,以給出與這些物品最為相近的所有其他物品

result = {}

# 以物品為中心對偏好矩陣實施倒置處理

itemprefs = transformprefs(prefs)

c = 0

for item in itemprefs:

# 針對大資料集更新狀態變數

c += 1

if c % 100 == 0:

print ("%d / %d " %(c, len(itemprefs)))

# 尋找最為相近的物品

scores = topmatches(itemprefs, item, n=n, similarity=sim_distance)

result[item] = scores

return result

# 獲得推薦

defgetrecommendeditems

(prefs, itemmatch, user):

userratings = prefs[user]

scores = {}

totalsim = {}

# 迴圈遍歷由當前使用者評分的物品

for (item, rating) in userratings.items():

# 迴圈遍歷與當前物品相近的物品

for (similarity, item2) in itemmatch[item]:

# 如果該使用者已經對當前物品做過評價,則將其忽略

if item2 in userratings: continue

# 評價值與相似度的加權之和

scores.setdefault(item2, 0)

scores[item2] += similarity*rating

# 全部相似度之和

totalsim.setdefault(item2, 0)

totalsim[item2] += similarity

# 將每個合計值除以加權和,求出平均值

rankings = [(score/totalsim[item], item) for item,score in scores.items()]

# 按最高值到最低值的順序,返回評分結果

rankings.sort()

rankings.reverse()

return rankings

# 載入movielens資料集

defloadmovielens

(path='/data/ml-100k'):

# 獲取影片標題

movies = {}

for line in open(path+'/u.item'):

(id, title) = line.split('|')[0:2]

movies[id] = title

# 載入資料

prefs = {}

for line in open(path+'/u.data'):

(user, movieid, rating, ts) = line.split('\t')

prefs.setdefault(user, {})

prefs[user][movies[movieid]] = float(rating)

return prefs

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

先構造乙個簡單的資料集 使用者對不同電影的評分 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...