協同過濾實現

2021-08-21 15:31:06 字數 2499 閱讀 9553

對於電影推薦系統,記nn為使用者的數量,mm為電影的數量,r(i,j) = 1表示使用者 j 對電影 i 進行過了評價,y(i,j)就是它的分數。r(i,j) = 0 表示使用者還沒**過這個電影,也沒評分過。我們假設使用者看過電影後,一定會給電影乙個評分,如果沒有給,預設評分為零。電影推薦系統的任務,就是根據使用者的評分,**出那些使用者還未**的電影的評分,從而把那些使用者可能會給出較高評分的電影推薦給使用者。

以電影推薦系統為例,假設theta(j)表示使用者 j 的引數,x(i)為電影i的特徵向量 (比如愛情電影,動作電影。這樣,使用者j對電影i的**評分為theta)

theta, x = unroll(res.x)

return theta, x

def predict(theta, x):

"""**

args:

theta - 使用者偏好矩陣

x - 電影特徵矩陣

return:

h **

"""return x * theta.t

def gettoprecommends(theta, x, i, count, rated, items):

"""獲得推薦

args:

theta - 使用者偏好矩陣

x - 影片特徵矩陣

i - 使用者索引

count - 目標推薦數量

rated - 已經評價的影片id

items - 影片庫

returns:

toprecommends - 推薦專案

"""predictions = (predict(theta, x) + mu)[:, i]

# 實用pandas的dataframe可以將不同型別資料放在乙個frame中,方便排序等操作

# 相較而言,numpy的多維陣列要求內部型別完全一致

df = pd.dataframe(data=predictions, columns=['prediction',])

df['movie'] = items

df.sort_values(by='prediction', ascending=false,inplace=true)

# 不推薦已經評過分的影片

df.drop(rated, inplace=true)

return df[0:count]

return train, predict, gettoprecommends載入資料

from scipy.io import loadmat

data = loadmat('data/ex8_movies.mat')

y = data['y']

r = data['r']

movieparams = loadmat('data/ex8_movieparams.mat')

nm = movieparams['num_movies'][0,0]

n = movieparams['num_features'][0,0]

def getmovie(line):

return ' '.join(line.split()[1:])

movielist =

with open('data/movie_ids.txt') as f:

for line in f:

myratings = np.mat(np.zeros((nm,1)))

myratings[0] = 4

myratings[97] = 2

myratings[6] = 3

myratings[11] = 5

myratings[53] = 4

myratings[63] = 5

myratings[65] = 3

myratings[68] = 5

myratings[182] = 4

myratings[225] = 5

myratings[354] = 5

# 將我們的新使用者資料加入

y = np.column_stack((myratings, y))

r = np.column_stack((myratings, r)).astype(bool)

train, predict, gettoprecommends = getrecommender(

y, r, n=n, thelambda=10.0)

訓練得出結果:

theta, x = train()

rated = np.nonzero(myratings)[0].tolist()

# -1 就是剛才加入的最新使用者

toprecommends = gettoprecommends(theta, x, -1, 10, rated, movielist)

toprecommends

輸出:

協同過濾 基於使用者的協同過濾itemCF

基於使用者的協同過濾演算法也被稱為最近鄰協同過濾或knn k nearest neighbor,k最近鄰演算法 其核心思想就是,首先根據相似度計算出目標使用者的鄰居集合,然後用鄰居使用者評分的加權組合來為目標使用者作推薦。通常這些演算法都可以總結成三步 首先,使用使用者已有的評分來計算使用者之間的相...

協同過濾的簡單實現

資料集 u mr 轉換為 m ur 歐幾里得距離 皮爾遜相關係數 其他還有jaccard係數,曼哈頓距離演算法 輸入 兩個暫時用字典表示的 輸出 相關係數 m mp 書上用的是歐幾里得距離算電影之間的相關性 對user進行推薦 獲取u mr user 獲取m mp movie movie不在u mr...

Hadoop實現協同過濾演算法

step1 static class step1 reducer extends reducer step2 按使用者分組,計算所有物品出現的組合列表,得到使用者對物品的喜愛度得分矩陣 static class step2 reducer extends reducer step3 step4 pr...