推荐系统原理
可以将推荐系统表示成如下矩阵:
行,表示用户
列,表示物品
数值表示,当前用户对物品的打分,?表示用户与物品无交互
目标:预测?处的评分,然后排序,推荐评分较高的物品给用户
推荐系统:
一.应用最广泛的
协
同
过
滤
协同过滤
协同过滤 推荐
1.基于
用
户
用户
用户的协同过滤推荐
2.基于
物
品
物品
物品的协同过滤推荐
3.隐语义模型
二.基于内容的 推荐
三.混合推荐
基于用户 协同过滤推荐
- 计算用户之间的相似度,用户画像(总结用户的特征+打标签–>向量化),训练相似度
- 获取与目标用户相似度较高的用户
- 将他们交互的物品中评分较高的(目标用户未交互的)推荐给该目标用户
计算用户相似度:
- 欧式距离
1
1
+
d
\frac{1}{1+d}
1+d1
2.余弦距离 cos ( θ ) = A B ∣ ∣ A ∣ ∣ ∗ ∣ ∣ B ∣ ∣ \cos(\theta) = \frac {A B}{||A||*||B||} cos(θ)=∣∣A∣∣∗∣∣B∣∣AB
3.相关系数
c o r r = c o v ( x , y ) D ( x ) ∗ D ( y ) corr = \frac {cov(x,y)}{\sqrt {D(x)}*\sqrt{D(y)}} corr=D(x)∗D(y)cov(x,y)
协 方 差 c o v ( x , y ) = E ( [ x − E ( x ) ] ∗ [ y − E ( y ) ] ) 协方差 cov(x,y) = E([x-E(x)]*[y-E(y)]) 协方差cov(x,y)=E([x−E(x)]∗[y−E(y)])
简单案例分析
小数据集的电影推荐
提取码:cm7y
"""
小数据量的 电影推荐
基于用户的协同过滤 推荐
"""
import numpy as np
import pandas as pd
def load_data(filename):
df = pd.read_json(filename)
return df
if __name__=="__main__":
#load data
#row movies
#col users
df = load_data("ratings.json")
#preview data
print(df.head())
print("\n")
#recommend for cur user
cur_user = "Michael Henry"
#calc similarity user matrix
similar_mat = df.corr()
print("similarity user matrix:\n")
print(similar_mat)
#select positive correlation for cur user
sim_to_cur_user = similar_mat[cur_user].drop(cur_user)
sim_to_cur_user = sim_to_cur_user[sim_to_cur_user>0]
print(sim_to_cur_user)
print("\n")
#store movies
rec_movies = {}
#travel similar user ,check relative movies
for similar_user,similar_score in sim_to_cur_user.items():
#check movies scored by similar_user,but not by cur user
temp = df.filter([similar_user,cur_user])
movies = temp[temp[similar_user].notnull()&temp[cur_user].isnull()]
print(movies)
#another method
#travel per movie, filter not viewed by cur user
#deal movies that will recommend for cur user
temp = movies[similar_user]
for m,score in temp.items():
if m not in rec_movies: #store in dict
rec_movies[m] = [[],[]]
rec_movies[m][0].append(score) #movie score
rec_movies[m][1].append(similar_score) #weight ,namely user similarity
print("\n")
print("当前推荐电影:\n")
print(rec_movies)
print("\n")
#sorted rec_movies
sorted_rec_movies = sorted(rec_movies.items(),key=lambda x:np.average(x[1][0],weights=x[1][1]),reverse=True)
print("排序的推荐电影:",sorted_rec_movies)
print("仅推荐电影:",[i[0] for i in sorted_rec_movies])
基于物品 协同过滤推荐
- 计算物品之间的相似度(需要预计算,即训练,然后保存,调用)
- 获取与目标用户交互的(评分高)物品中相似度较高的物品
- 将推荐评分高的物品推荐给目标用户
可以使用上例的数据,实现基于物品的推荐
部署推荐系统
将 推 荐 系 统 模 型 推荐系统模型 推荐系统模型 封装成后端服务----> 提供一个API