對於電影推薦系統,記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...