当前位置:   article > 正文

智能推荐系统 - 协同过滤算法_智能推荐算法案例

智能推荐算法案例

相似度计算三种常见方法

 1.欧式距离

  1. import pandas as pd
  2. df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
  3. df

  1. import numpy as np
  2. dist = np.linalg.norm(df.iloc[0] - df.iloc[1])
  3. dist

 

2. 余弦内置函数

  1. import pandas as pd
  2. df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
  3. df

 

  1. from sklearn.metrics.pairwise import cosine_similarity
  2. user_similarity = cosine_similarity(df)
  3. pd.DataFrame(user_similarity, columns=['物品A', '物品B', '物品C'], index=['物品A', '物品B', '物品C'])

 

 3 皮尔逊相关系数

  1. from scipy.stats import pearsonr
  2. X = [1, 3, 5, 7, 9]
  3. Y = [9, 8, 6, 4, 2]
  4. corr = pearsonr(X, Y)
  5. print('相关系数r值为' + str(corr[0]) + ',显著性水平P值为' + str(corr[1]))

  1. import pandas as pd
  2. df = pd.DataFrame([[5, 4, 4], [1, 2, 2], [5, 2, 1]], columns=['物品A', '物品B', '物品C'], index=['用户1', '用户2', '用户3'])

 

df

  1. # 物品A与其他物品的皮尔逊相关系数
  2. A = df['物品A']
  3. corr_A = df.corrwith(A)
  4. corr_A

 

  1. # 皮尔逊系数表,获取各物品相关性
  2. df.corr()

 

 案例实战 - 电影智能推荐系统 

1.读取数据

  1. import pandas as pd
  2. movies = pd.read_excel('电影.xlsx')
  3. movies.head()

  1. score = pd.read_excel('评分.xlsx')
  2. score.head()

 

  1. df = pd.merge(movies, score, on='电影编号')
  2. df.head()

 

df.to_excel('电影推荐系统.xlsx')
df['评分'].value_counts()  # 查看各个评分的出现的次数

  1. import matplotlib.pyplot as plt
  2. df['评分'].hist(bins=20) # hist()函数绘制直方图,竖轴为各评分出现的次数

 

2.数据分析 

  1. ratings = pd.DataFrame(df.groupby('名称')['评分'].mean())
  2. ratings.sort_values('评分', ascending=False).head()

  1. ratings['评分次数'] = df.groupby('名称')['评分'].count()
  2. ratings.sort_values('评分次数', ascending=False).head()

 

 3.数据处理

  1. user_movie = df.pivot_table(index='用户编号', columns='名称', values='评分')
  2. user_movie.tail()

user_movie.describe()  # 因为数据量较大,这个耗时可能会有1分钟左右

 

4.智能推荐 

  1. FG = user_movie['阿甘正传(1994)'] # FG是Forrest Gump(),阿甘英文名称的缩写
  2. pd.DataFrame(FG).head()

  1. # axis默认为0,计算user_movie各列与FG的相关系数
  2. corr_FG = user_movie.corrwith(FG)
  3. similarity = pd.DataFrame(corr_FG, columns=['相关系数'])
  4. similarity.head()

 

  1. similarity.dropna(inplace=True) # 或写成similarity=similarity.dropna()
  2. similarity.head()

 

  1. similarity_new = pd.merge(similarity, ratings['评分次数'], left_index=True, right_index=True)
  2. similarity_new.head()

 

  1. # 第二种合并方式
  2. similarity_new = similarity.join(ratings['评分次数'])
  3. similarity_new.head()

 

similarity_new[similarity_new['评分次数'] > 20].sort_values(by='相关系数', ascending=False).head()  # 选取阈值

 

补充知识点:groupby()函数的使用 

  1. import pandas as pd
  2. data = pd.DataFrame([['战狼2', '丁一', 6, 8], ['攀登者', '王二', 8, 6], ['攀登者', '张三', 10, 8], ['卧虎藏龙', '李四', 8, 8], ['卧虎藏龙', '赵五', 8, 10]], columns=['电影名称', '影评师', '观前评分', '观后评分'])
data

 

  1. means = data.groupby('电影名称')[['观后评分']].mean()
  2. means

  1. means = data.groupby('电影名称')[['观前评分', '观后评分']].mean()
  2. means

 

  1. means = data.groupby(['电影名称', '影评师'])[['观后评分']].mean()
  2. means

 

 

  1. count = data.groupby('电影名称')[['观后评分']].count()
  2. count

  1. count = count.rename(columns={'观后评分':'评分次数'})
  2. count

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/86455
推荐阅读
相关标签
  

闽ICP备14008679号