协同过滤

目标:

想求user="1“对于item="E"的相关系数(推荐评分)

公共过程:

1.引入数据集和包

import pandas as pd
import numpy as np#定义数据集
def loadData():#用于ItemCFitems = {'A': {1: 5, 2: 3, 3: 4, 4: 3, 5: 1},'B': {1: 3, 2: 1, 3: 3, 4: 3, 5: 5},'C': {1: 4, 2: 2, 3: 4, 4: 1, 5: 5},'D': {1: 4, 2: 3, 3: 3, 4: 5, 5: 2},'E': {2: 3, 3: 5, 4: 4, 5: 1}}#用于UserCFusers = {1: {'A': 5, 'B': 3, 'C': 4, 'D': 4},2: {'A': 3, 'B': 1, 'C': 2, 'D': 3, 'E': 3},3: {'A': 4, 'B': 3, 'C': 4, 'D': 3, 'E': 5},4: {'A': 3, 'B': 3, 'C': 1, 'D': 5, 'E': 4},5: {'A': 1, 'B': 5, 'C': 5, 'D': 2, 'E': 1}}return items, users

2.数据预处理

#UserCF过程
#加载数据集
items,users=loadData()
#转化为数据表单格式,并转置
item_df = pd.DataFrame(items).T
user_df = pd.DataFrame(users).T

userCF

主要思想:

利用用户和用户之间的相似性根据其他用户的感兴趣物品对该用户进行推荐

实现逻辑:

1.计算用户相似性的矩阵(首先找到用户和用户之间谁的关系更近)

计算方法:使用用户-物品的评分数据,找到两个不同的用户,如果两个用户都对同一个物品进行了评分,就在他们两个的向量组中加入该物品以及他们的评分,最后使用np.corrcoef()计算皮尔逊相关系数,即计算两个user对应的共同的评分向量的相关关系

#创建用户相似性矩阵
similarity_matrix=pd.DataFrame(np.zeros((len(users),len(items))),index=[1,2,3,4,5],columns=[1,2,3,4,5])#遍历每条用户-物品评分数据
for userID in users:for otheruserID in users:# vec向量化的意思vec_user=[]vec_otheruser=[]if userID != otheruserID:# 遍历物品-用户评分数据for itemId in items:itemRatings=items[itemId]# 这也是个字典  每条数据为所有用户对当前物品的评分#如果两个用户都对这个物品评过分if userID in itemRatings and otheruserID in itemRatings:vec_user.append(itemRatings[userID])vec_otheruser.append(itemRatings[otheruserID])# np.corrcoef 计算皮尔逊积矩相关系数#在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,# (文章中常用r或Pearson's r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。# 两个变量之间的皮尔逊相关系数可以定义为两个变量之间的协方差和标准差的商。# 样本相关系数(r)总体相关系数(ρ)# np.array:数组similarity_matrix[userID][otheruserID] = np.corrcoef(np.array(vec_user),np.array(vec_otheruser))[0][1]#用[0][1]取出皮尔逊相关系数#print( np.corrcoef(np.array(vec_user),np.array(vec_otheruser))[0][1])

2.计算上面求出来具有相关性的User中他们对于物品"E"感兴趣的程度

(1)根据前n个相似的用户对于”E“的兴趣进行分析相关性

(2)首先将上述求出的相关性进行降序排序,并找出前两个user存下来

(3)计算该user对于所有物品的兴趣的均值

(4)计算权重分数,计算总的相关系数

for user in similarity_user:#该用户和我们的目标用户的相关系数corr_value=similarity_matrix[1][user]#该用户对于所有物品的相关系数的平均值mean_user_score=np.mean(np.array([value for value in users[user].values()]))#加权分数(减去了平均的分数)weighted_score+=corr_value*(users[user]['E']-mean_user_score)corr_values_sum+= corr_value

此处的加权分数是前n个user对于物品E的加权分数之和,总的相关系数是前n个user对于物品E的相关系数之和

最后求final_scores采用base_scores + weighted_score / corr_values_sum的求法

final_scores= base_score + weighted_score / corr_values_sum
print("用户1对于物品E的推荐打分为:")
print(final_scores)
# 计算前n个相似的用户
n=2#sort_values排序函数
#ascending=True  按照升序排序
#ascending=False 按照降序排序#按照降序排序
#indexsimilarity_user=similarity_matrix[1].sort_values(ascending=False)[:n].index.tolist()#对用户“1”的similarity_matrix进行排序后取前n个
#注释理解sort_values函数#计算出了user和user之间的相关度# print(similarity_matrix[1].sort_values(ascending=False))
# print("ok")
# print(similarity_matrix[1].sort_values(ascending=False)[:n])
# print("ok")
# print(similarity_matrix[1].sort_values(ascending=False)[:n])
# print(similarity_matrix[1].sort_values(ascending=False)[:n].index)
# #tolist是将数组作为列表返回
# print(similarity_matrix[1].sort_values(ascending=False)[:n].index.tolist())#计算最终的得分(np.mean是求平均值)
base_score=np.mean(np.array([value for value in users[1].values()]))
#base是用户1对于所有物品的平均分数
#现在要求相关的user,他交互过的物品weighted_score =0.
corr_values_sum=0.for user in similarity_user:#该用户和我们的目标用户的相关系数corr_value=similarity_matrix[1][user]#该用户对于所有物品的相关系数的平均值mean_user_score=np.mean(np.array([value for value in users[user].values()]))#加权分数(减去了平均的分数)weighted_score+=corr_value*(users[user]['E']-mean_user_score)corr_values_sum+= corr_value#加权分数是所有相关user对应的E物品的
#cor_values是所有相关user对应的final_scores= base_score + weighted_score / corr_values_sum
print("用户1对于物品E的推荐打分为:")
print(final_scores)

itemCF

主要思想:

利用物品与物品之间的相似性根据用户交互过的物品以及物品的相似性对该用户进行推荐

实现逻辑:

1.计算物品的相似性矩阵(首先找到物品之间谁的关系更近)

使用物品-用户的交互矩阵,找到两个不同的item之间的关系,如果两个item与同一个user交互过,就向他们分别的向量组添加该评分和交互信息,使用该向量信息,使用np.corrcoef()求出皮尔逊相关系数,找出相关性,并写到矩阵中

similarity_matrix=pd.DataFrame(np.zeros((len(users),len(items))),index=['A','B','C','D','E'],columns=['A','B','C','D','E'])#itemCF是根据用户遍历过的物品的相似性去进行推荐
#遍历物品-用户评分数据
for itemID in items:for otheritemID in items:vec_item=[]      #保存当前两个物品的向量值vec_otheritem=[]if itemID != otheritemID:for userID in users:userRatings =users[userID]# 字典,保存的是该用户对于所有物品的评分if itemID in userRatings and otheritemID in userRatings:vec_item.append(userRatings[itemID])vec_otheritem.append(userRatings[otheritemID])# print(vec_item)# print(vec_otheritem)# print(itemID)# print(otheritemID)similarity_matrix[itemID][otheritemID]= np.corrcoef(np.array(vec_item),np.array(vec_otheritem))[0][1]

2.计算上面求出来的具有相关性的item中,谁对于user:“1”相关性更强

(1)选定n=2,将上述进行降序排序,选出前两个相关性强的item

(2)计算weighted_scores和corr_values_num的值

首先计算出

base_score=np.mean(np.array([value for value in items['E'].values()]))

base_score表示该物品对于所有人的平均评分

for item in similarity_item:#物品和物品之间的相关系数corr_value=similarity_matrix['E'][item]#求加权分数mean_item_score=np.mean(np.array([value for value in items[item].values()]))weighted_scores+=corr_value*(users[1][item]-mean_item_score)corr_values_sum+=corr_value

求出mean_item_score是当前物品对于所有人的平均评分

使用weighted_scores表示前n个物品对于用户1的权重分数的总和

使用corr_values_sum表示前n个物品对于用户1的相关性的总和

最后计算使用 该物品对于所有人的平均评分加上总的权重分数的总和除以相关性的总和

final_scores=base_score +weighted_scores/corr_values_sum
print("用户1对于物品E的推荐打分为")
print(final_scores)
n=2similarity_item=similarity_matrix['E'].sort_values(ascending=False)[:n].index.tolist()base_score=np.mean(np.array([value for value in items['E'].values()]))weighted_scores=0corr_values_sum=0for item in similarity_item:#物品和物品之间的相关系数corr_value=similarity_matrix['E'][item]#求加权分数mean_item_score=np.mean(np.array([value for value in items[item].values()]))weighted_scores+=corr_value*(users[1][item]-mean_item_score)corr_values_sum+=corr_value
final_scores=base_score +weighted_scores/corr_values_sum
print("用户1对于物品E的推荐打分为")
print(final_scores)

涉及知识点

1.皮尔逊系数

皮尔逊系数

# np.corrcoef 计算皮尔逊积矩相关系数
#在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,
# (文章中常用r或Pearson's r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。
# 两个变量之间的皮尔逊相关系数可以定义为两个变量之间的协方差和标准差的商。
# 样本相关系数(r)总体相关系数(ρ)

截图来源于百度百科(非常清晰,计算过程和表征意义)

2.转化为表单格式

#pandas
# python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,
# 与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。
# Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,
# 其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。user_df = pd.DataFrame(users).T

使用py.DataFrame()

加上".T"表示转置矩阵

3.创建空的矩阵

# 创建用户相似性矩阵(还未计算)(先创建一个空的)
similarity_matrix=pd.DataFrame(np.zeros((len(users),len(items))),index=[1,2,3,4,5],columns=[1,2,3,4,5])

使用index、columns来定义行列title

np.zeros来用0填充空位

4.sort_values排序函数

#sort_values排序函数
#ascending=True  按照升序排序
#ascending=False 按照降序排序

5.np.mean 求平均值

base_score=np.mean(np.array([value for value in users[1].values()]))

机器学习Day4-协同过滤UserCFItemCF-源代码-逻辑-分析相关推荐

  1. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

  2. 机器学习算法--协同过滤算法

    0. 关键词 推荐算法 长尾理论 UserCF ItemCF 1. 推荐算法 互联网的飞速发展使我们进入了信息过载的时代,搜索引擎可以帮助我们查找内容,但只能解决明确的需求.为了让用户从海量信息中高效 ...

  3. 基于机器学习实现协同过滤推荐算法的电影推荐系统

    推荐算法在互联网行业的应用非常广泛,今日头条.美团点评等都有个性化推荐,推荐算法抽象来讲,是一种对于内容满意度的拟合函数,涉及到用户特征和内容特征,作为模型训练所需维度的两大来源,而点击率,页面停留时 ...

  4. 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法

    协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...

  5. 14 机器学习 - CF协同过滤推荐算法原理

    1 概述 什么是协同过滤 (Collaborative Filtering, 简称 CF)? 首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做? 大部分的人会问问周围的朋友 ...

  6. 机器学习相关——协同过滤

    在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.本文将带你深入了解协同过滤的秘密.下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是 ...

  7. 人工智障学习笔记——机器学习(6)协同过滤

    一.概念 有句成语可以将协同过滤这个思想表现的淋漓尽致,那就是物以类聚,人以群分  --出处:<易经·系辞上>: 天尊地卑,乾坤定矣.卑高以陈,贵贱位矣.动静有常,刚柔断矣.方以类聚,物以 ...

  8. 协同过滤和关联规则分析的区别

    协同过滤 (Collaborative filtering),按维基百科的说法,有广义和狭义两种定义.现在讨论较多的是狭义的定义,在电商网站应用比较广泛.狭义的定义指的是,通过收集群体用户的偏好信息, ...

  9. 推荐系统知识梳理——协同过滤

    注:本次为参加datawhale的打卡活动~详细资料在team-learning-rs 核心系列内容: 协同过滤算法: 包括基于用户的协同过滤(UserCF)和基于商品的协同过滤(ItemCF),这是 ...

最新文章

  1. 谷歌 notification 测试 页面
  2. 崔巍 计算机考研怎么样,中国科学院大学研究生导师教师师资介绍简介-崔巍
  3. CentOS7.2最小化安装后系统优化
  4. ajax定时器怎么写,js定时器怎么写?就是在特定时间执行某段程序
  5. 初学者指南:服务器基本技术名词
  6. mysql binlog c++_MySQL binlog的格式解析
  7. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...
  8. 2016.01.18 UILabel
  9. fatal error LNK _X
  10. 白嫖5T空间Onedrive并搭建下载站
  11. SRS:软件需求规格说明书
  12. vim全文替换字符串
  13. c语言utc时间转换,gps时转换为utc时间方法
  14. 数字藏品:传承优秀传统文化的新载体
  15. 一篇关于大黄蜂的鸡汤文的杂想
  16. 简单酷炫时尚设计开场视频模板剪辑素材
  17. 【Django入门】——模型管理器对象、模型管理器类和模型类
  18. 汇编inc为什么不影响cf_为什么INC和DEC指令不会影响进位标志?
  19. css-doodle 学习第三天, selectors的使用
  20. 数据质量管理平台 Qualitis 安装部署

热门文章

  1. Android 输入法
  2. 敏捷项目管理常用的两个确定优先级的方法(二)Kano模型
  3. 第五次实验 紫金学院 集合框架2
  4. 回顾 | 【Power Platform 中文社区】- 金杜黑客松活动
  5. jquery.datepick使用
  6. 评价订单中的五角星,点击之后前面所有的五角星颜色变红,后面的所有星星颜色不变...
  7. SSL证书有什么用,https 就是 ssl 吗?
  8. pycharm折线图不显示折线_Matplotlib的折线图
  9. vue input点击输入键盘顶起页面解决方案 ios
  10. 《Generalized Focal Loss V1》论文笔记