机器学习 协同过滤算法

news/2024/4/20 15:15:38/文章来源:https://blog.csdn.net/weixin_56260304/article/details/130353041

协同过滤算法

协同过滤算法是根据已有的数据来推测出未知的数据,从海量的数据中找到相似度达到指定范围的数据,而这些数据成为你的邻居,系统将会为你推荐心仪的物品。

余弦相似法

在这里插入图片描述
通过计算两个向量的夹角余弦值来评估它们的相似度

修正余弦相似法

在这里插入图片描述

中心化后再求余弦相似度

皮尔森系数法

在这里插入图片描述
皮尔森系数和修正余弦相似度的计算是相同的,不同的是皮尔森系数的分母采用评分集是两个用户共同评分集,而修正余弦是采用两个用户各自的评分集。

具体步骤:
1、找到与目标用户兴趣相似的用户集合
2、计算相似度
3、找到这个集合中用户喜欢的,且目标用户没用的物品,推荐给用户

import math
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd#创建数据
data = {"Tom":{"The Avengers":3.0,"The Martin":4.0,"Guardians of the Galaxy":3.5,"Edge of Tomorrow":5.0,"The Maze Runner":3.0},"Jane":{"The Avengers":3.0,"The Martin":4.0,"Guardians of the Galaxy":4.0,"Edge of Tomorrow":3.0,"The Maze Runner":3.0,"Unbroken":4.5},"Jim":{"The Martin":5.0,"Guardians of the Galaxy":4.0,"Edge of Tomorrow":1.0,"The Maze Runner":2.0,"Unbroken":4.0}}data.get("Tom")
'''
{'The Avengers': 3.0,'The Martin': 4.0,'Guardians of the Galaxy': 3.5,'Edge of Tomorrow': 5.0,'The Maze Runner': 3.0}
'''

余弦相似法

#余弦相似法
def user_similarity_on_cosine(data,user1,user2):#选出用户1与用户2共有的评分电影common = [movie for movie in data[user1] if movie in data[user2]]#movie 返回的是data[user1]的键,即为电影名if len(common)==0:return 0#分子multiply_sum = sum((data[user1][movie])*(data[user2][movie]) for movie in common)#用户1用户2的电影评分相乘相加#分母pow_sum1 = sum(math.pow(data[user1][movie],2) for movie in data[user1])#用户1的电影评分平方和pow_sum2 = sum(math.pow(data[user2][movie],2) for movie in data[user2])#用户2的电影评分平方和modified_cosine_similarity = float(multiply_sum)/math.sqrt(pow_sum1*pow_sum2)#余弦相似性系数return modified_cosine_similarity
r1 = user_similarity_on_cosine(data,"Tom","Jane")
print('Tom与Jane的相似性:',r1)

修正余弦相似法


#修正余弦相似法
def user_similarity_on_modified_cosine(data,user1,user2):#选出用户1与用户2共有的评分电影common = [movie for movie in data[user1] if movie in data[user2]]#movie 返回的是data[user1]的键,即为电影名if len(common)==0:return 0#分子average1 = float(sum(data[user1][movie] for movie in data[user1]))/len(data[user1]) #用户1的电影评分均值average2 = float(sum(data[user2][movie] for movie in data[user2]))/len(data[user2]) #用户2的电影评分均值#分子#用户1和用户2的电影评分中心化后,在对应相乘相加multiply_sum =sum((data[user1][movie]-average1)*(data[user2][movie]-average2) for movie in common)#分母pow_sum1 = sum(math.pow(data[user1][movie]-average1,2) for movie in data[user1])#用户1的电影评分中心化后平方和pow_sum2 = sum(math.pow(data[user2][movie]-average2,2) for movie in data[user2])#用户2的电影评分中心化后平方和modified_cosine_similarity = float(multiply_sum)/math.sqrt(pow_sum1*pow_sum2)#修正余弦相似性系数return modified_cosine_similarity
r2 = user_similarity_on_modified_cosine(data,"Tom","Jane")
print('Tom与Jane的相似性:',r2)

皮尔森系数

#皮尔森系数
def similarUserWithPearson(data,user1,user2):#选出用户1与用户2共有的评分电影common = [movie for movie in data[user1] if movie in data[user2]]#movie 返回的是data[user1]的键,即为电影名if len(common)==0:return 0#分子average1 = float(sum(data[user1][movie] for movie in common))/len(common) #用户1的电影评分均值average2 = float(sum(data[user2][movie] for movie in common))/len(common) #用户2的电影评分均值#分子#用户1和用户2的电影评分中心化后,在对应相乘相加multiply_sum =sum((data[user1][movie]-average1)*(data[user2][movie]-average2) for movie in common)#分母pow_sum1 = sum(math.pow(data[user1][movie]-average1,2) for movie in common)#用户1的电影评分中心化后平方和pow_sum2 = sum(math.pow(data[user2][movie]-average2,2) for movie in common)#用户2的电影评分中心化后平方和modified_cosine_similarity = float(multiply_sum)/math.sqrt(pow_sum1*pow_sum2)#修正余弦相似性系数return modified_cosine_similarity
r3 = similarUserWithPearson(data,"Tom","Jane")
print('Tom与Jane的相似性:',r3)

可视化分析,找到相似度最高的用户

r11 = user_similarity_on_cosine(data,"Jane","Jim")
r12 = user_similarity_on_cosine(data,"Jane","Tom")
r21 = user_similarity_on_modified_cosine(data,"Jane","Jim")
r22 = user_similarity_on_modified_cosine(data,"Jane","Tom")
r31 = similarUserWithPearson(data,"Jane","Jim")
r32 = similarUserWithPearson(data,"Jane","Tom")matplotlib.rcParams['font.family'] = 'SimHei'
plt.figure(figsize=(6,4))
r1 = [r11,r21,r31]
r2 = [r12,r22,r32]
l = len(r1)
width = 0.3#条形宽度
x1 = np.arange(l)
x2 = np.arange(l)+width#将第二种图形分开,不设置的话会重合
s = ['余弦法','修正余弦法','皮尔森法']
plt.bar(x1,r1,width=0.3,label='Jane,Jim')
plt.bar(x2,r2,width=0.3,label='Jane,Tom')plt.xticks(x1+width,s)
plt.ylim(0,1.2)#拉长纵坐标
plt.yticks([])#取消坐标刻度
plt.ylabel(u'相似性系数值',fontproperties='SimHei')
plt.legend()#图例放到图中
plt.title('Jane与其他用户的相似系数值')

在这里插入图片描述

recommendation = list(set(data.get("Jane")).difference(data.get("Jim")))
print("Jane看过而Jim没看过的电影:",recommendation)#Jane看过而Jim没看过的电影: ['The Avengers']recommendation = list(set(data.get("Jane")).difference(data.get("Tom")))
print("Jane看过而Tom没看过的电影:",recommendation)#Jane看过而Tom没看过的电影: ['Unbroken']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102952.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《站在巨人的肩膀上学习Java》

Java从诞生距今已经有28年了,在这段时间里,随着Java版本的不断迭代,Java新特性的不断出现,使得Java被使用的越来越广泛。在工程界Java语言一直是大家最喜欢的语言之一,Java一直排行在编程语言热门程度的前3名。 可想而…

从0搭建Vue3组件库(六):前端流程化控制工具gulp的使用

随着前端诸如webpack,rollup,vite的发展,gulp感觉似乎好像被取代了。其实并没有,只不过它从台前退居到了幕后。我们仍然可以在很多项目中看到它的身影,比如elementplus、vant等。现在gulp更多的是做流程化的控制。 比如…

delta.io 参数 spark.databricks.delta.replaceWhere.constraintCheck.enabled

总结 默认值true 你写入的df分区字段必须全部符合覆盖条件 .option("replaceWhere", "c2 == 2") false: df1 overwrite tb1: df1中每个分区的处理逻辑: - tb1中存在(且谓词中匹配)的分区,则覆盖 - tb1中存在(谓词中不匹配)的分区,则append - tb1中不存…

今天试了试chatgpt

今天试了试chatgpt,真是服了 arcade? Arcade是一个Python游戏开发库,它提供了一系列的工具和函数,可以帮助开发者快速地创建2D游戏。以下是Arcade的一些特点: 简单易用:Arcade提供了简单易用的API&#x…

Android分屏流程分析

本文基于Android 11。 SystemUI模块中的Divider管理着所有关于分屏的对象: DividerView(分屏分割线,分屏显示界面)SplitScreenTaskOrganizer(分屏Task组织者,分屏逻辑) 这里重点关注分屏逻辑…

Qt如何生成dump文件和pdb文件并进行调试定位

在main文件中增加下面代码用于可生成dump文件 #include "widget.h" #include <QApplication> #include <QDir> #include <QDateTime> #ifdef Q_OS_WIN#include <windows.h>#include <dbghelp.h> #endifstatic LONG WINAPI exceptionC…

简单介绍一下什么是“工作内存”和“主内存”(JMM中的概念)

在学习Java多线程编程里&#xff0c; volatile 关键字保证内存可见性的要点时&#xff0c;看到网上有些资料是这么说的&#xff1a;线程修改一个变量&#xff0c;会把这个变量先从主内存读取到工作内存&#xff1b;然后修改工作内存中的值&#xff0c;最后再写回到主内存。 对…

Spring 循环依赖处理之三级缓存设计

一、思考 1、Spring是如何解决循环依赖问题的? 2、为什么要使用三级缓存?二级缓存能否解决问题? 3、提前暴露对象暴露的是什么? 4、主要源码 二、循环依赖 1、介绍 如上图&#xff0c;创建A之前需要先创建B,创建B之前需要先创建A,造成循环依赖。 由于A没创建完成&am…

一个关于Mybatis和spring的公共组件starter

utils-springboot-starter 介绍使用说明 介绍 一个关于Mybatis和spring的公共组件starter&#xff0c;目前包含以下功能&#xff1a; 接口请求日志SQL执行日志数据自动加解密数据自动脱敏服务治理方面&#xff1a; 接口限流接口熔断降级&#xff1a;CPU、内存、异常数、异常率…

win11 环境下streamlit使用pycharm debug

目录 1. pycharm中配置run 脚本2. streamlit3. 开始debug调试 1. pycharm中配置run 脚本 &#xff08;一&#xff09;点击 Edit Configurations,按图操作. 2. streamlit 1.streamlit 安装在 anaconda 的 base 环境&#xff08;随意哈&#xff0c;安装哪里都可以&#xff0c…

问题定位及解决方案

1.视频沉浸页快速滑动后&#xff0c;必现不能向下划动 复现步骤&#xff1a; 进入视频沉浸页&#xff0c;快速向下划动&#xff0c;滑动到第一页最后一个时&#xff0c;不能再向下划动。 解决步骤&#xff1a; 1.确定请求API&#xff1a; mtop.aliexpress.ugc.feed.video.lis…

PE文件反编译为python脚本流程

1、查壳 DetectltEasy、PeiD查壳 2、脱壳 常见打包工具PyInstaller&#xff0c;脱壳方法 &#xff08;1&#xff09;用pyinstxtractor.py脱壳&#xff0c;用”python pyinstxtractor.py 1.exe“命令&#xff0c;生成“.exe文件名_extracted” &#xff08;2&#xff09;用…

深度学习技巧应用8-各种数据类型的加载与处理,并输入神经网络进行训练

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用8-各种数据类型的加载与处理&#xff0c;并输入神经网络进行训练。在模型训练中&#xff0c;大家往往对各种的数据类型比较难下手&#xff0c;对于非结构化数据已经复杂的数据的要进行特殊处理&…

LeetCode:6390. 滑动子数组的美丽值

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;6390. 滑动子数组的美丽值 题目描述&#xff1a;给你一个长度为 n 的整…

波形生成:均匀和非均匀时间向量

波形生成—— 脉冲、chirp、VCO、正弦函数、周期性/非周期性和调制信号 使用 chirp 生成线性、二次和对数 chirp。使用 square、rectpuls 和 sawtooth 创建方波、矩形波和三角形波。 如需了解此处未显示的其他无线波形生成功能&#xff0c;请参阅无线波形发生器 (Communicat…

完整的生产车间管理流程是怎样的?六大步骤分享

阅读本文您将了解&#xff1a;1.生产车间管理的特征&#xff1b;2.生产车间管理流程具体步骤&#xff1b;3.生产车间管理流程规范的重要性。 一、生产车间管理的特征 车间管理是指对车间所从事的各项生产经营活动进行计划、组织、指挥、协调和控制的一系列管理工作。生产车间…

巧用千寻位置GNSS软件| 电力线勘测如何实现?

正如大家所知&#xff0c;电力线勘测是在做电力线路设计之前对设计线路沿途自然环境进行勘察测量&#xff0c;最后把手簿测量数据在电脑端经过转换输出为电力软件专用格式数据的专用功能。 那么在千寻位置GNSS软件中该如何操作完成电力线的勘察测量呢&#xff1f; 点击【测量】…

SwiftUI 中 TabView 如何原生使用类 UIPageView 的翻页样式?

功能需求 我们知道 TabView 是 SwiftUI 中非常好用的布局组织容器,它可以分类组织视图并依次展示给用户。 从 SwiftUI 2.0 开始(iOS 14.0+),TabView 除了常规的以标签(Tab Label)样式显示外,还可以用类似 UIPageView 的样式分页原生显示视图,显得更加简洁: 如上图所…

AWT-对话框——Dialog以及其子类FileDialog

Dialog: Dialog时Window类的子类&#xff0c;时一个容器类&#xff0c;属于特殊组件。对话框是可以独立存在的顶级窗口&#xff0c;因此用法与普通窗口的用法几乎完全一样&#xff0c;但是使用对话框需要注意以下几点&#xff1a; 对话框通常依赖于其它窗口&#xff0c;就是通…

基于Java+SpringBoot+vue学生学习平台详细设计实现

基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…