【数据挖掘与商务智能决策】第十五章 智能推荐系统 - 协同过滤算法

news2024/9/25 15:27:05

第十五章 智能推荐系统 - 协同过滤算法

15.2 相似度计算三种常见方法

15.2.1 欧式距离

import pandas as pd
df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
df
用户1用户2用户3
物品A515
物品B422
物品C421
import numpy as np
dist = np.linalg.norm(df.iloc[0] - df.iloc[1])
dist
3.3166247903554

15.2.2 余弦内置函数

import pandas as pd
df = pd.DataFrame([[5, 1, 5], [4, 2, 2], [4, 2, 1]], columns=['用户1', '用户2', '用户3'], index=['物品A', '物品B', '物品C'])
df
用户1用户2用户3
物品A515
物品B422
物品C421
from sklearn.metrics.pairwise import cosine_similarity
user_similarity = cosine_similarity(df)
pd.DataFrame(user_similarity, columns=['物品A', '物品B', '物品C'], index=['物品A', '物品B', '物品C'])
物品A物品B物品C
物品A1.0000000.9146590.825029
物品B0.9146591.0000000.979958
物品C0.8250290.9799581.000000

15.2.3 皮尔逊相关系数简单版

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

皮尔逊相关系数小案例

import pandas as pd
df = pd.DataFrame([[5, 4, 4], [1, 2, 2], [5, 2, 1]], columns=['物品A', '物品B', '物品C'], index=['用户1', '用户2', '用户3'])  
df
物品A物品B物品C
用户1544
用户2122
用户3521
# 物品A与其他物品的皮尔逊相关系数
A = df['物品A']
corr_A = df.corrwith(A)
corr_A
物品A    1.000000
物品B    0.500000
物品C    0.188982
dtype: float64
# 皮尔逊系数表,获取各物品相关性
df.corr()
物品A物品B物品C
物品A1.0000000.5000000.188982
物品B0.5000001.0000000.944911
物品C0.1889820.9449111.000000

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

1.读取数据

import pandas as pd 
movies = pd.read_excel('电影.xlsx')
movies.head()
电影编号名称类别
01玩具总动员(1995)冒险|动画|儿童|喜剧|幻想
12勇敢者的游戏(1995)冒险|儿童|幻想
23斗气老顽童2(1995)喜剧|爱情
34待到梦醒时分(1995)喜剧|剧情|爱情
45新娘之父2(1995)喜剧
score = pd.read_excel('评分.xlsx')
score.head()
用户编号电影编号评分
0114.0
1134.0
2164.0
31475.0
41505.0
df = pd.merge(movies, score, on='电影编号')
df.head()
电影编号名称类别用户编号评分
01玩具总动员(1995)冒险|动画|儿童|喜剧|幻想14.0
11玩具总动员(1995)冒险|动画|儿童|喜剧|幻想54.0
21玩具总动员(1995)冒险|动画|儿童|喜剧|幻想74.5
31玩具总动员(1995)冒险|动画|儿童|喜剧|幻想152.5
41玩具总动员(1995)冒险|动画|儿童|喜剧|幻想174.5
df.to_excel('电影推荐系统.xlsx')
df['评分'].value_counts()  # 查看各个评分的出现的次数
4.0    26794
3.0    20017
5.0    13180
3.5    13129
4.5     8544
2.0     7545
2.5     5544
1.0     2808
1.5     1791
0.5     1369
Name: 评分, dtype: int64
%matplotlib inline
import matplotlib.pyplot as plt
df['评分'].hist(bins=20)  # hist()函数绘制直方图,竖轴为各评分出现的次数
<AxesSubplot:>

在这里插入图片描述

2.数据分析

ratings = pd.DataFrame(df.groupby('名称')['评分'].mean())
ratings.sort_values('评分', ascending=False).head()
评分
名称
假小子(1997)5.0
福尔摩斯和华生医生历险记:讹诈之王(1980)5.0
机器人(2016)5.0
奥斯卡(1967)5.0
人类状况III(1961)5.0
ratings['评分次数'] = df.groupby('名称')['评分'].count()
ratings.sort_values('评分次数', ascending=False).head()
评分评分次数
名称
阿甘正传(1994)4.164134329
肖申克的救赎(1994)4.429022317
低俗小说(1994)4.197068307
沉默的羔羊(1991)4.161290279
黑客帝国(1999)4.192446278

3.数据处理

user_movie = df.pivot_table(index='用户编号', columns='名称', values='评分')
user_movie.tail()
名称007之黄金眼(1995)100个女孩(2000)100条街道(2016)101忠狗续集:伦敦大冒险(2003)101忠狗(1961)101雷克雅未克(2000)102只斑点狗(2000)10件或更少(2006)10(1979)11:14(2003)...龙珠:神秘冒险(1988)龙珠:血红宝石的诅咒(1986)龙珠:魔鬼城堡中的睡公主(1987)龙种子(1944)龙纹身的女孩(2011)龙舌兰日出(1988)龙虾(2015)龙:夜之怒的礼物(2011)龙:李小龙的故事(1993)龟日记(1985)
用户编号
606NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
607NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6084.0NaNNaNNaNNaNNaNNaN3.5NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
6094.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
610NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaNNaNNaN4.0NaN4.5NaNNaNNaN

5 rows × 9687 columns

user_movie.describe()  # 因为数据量较大,这个耗时可能会有1分钟左右
名称007之黄金眼(1995)100个女孩(2000)100条街道(2016)101忠狗续集:伦敦大冒险(2003)101忠狗(1961)101雷克雅未克(2000)102只斑点狗(2000)10件或更少(2006)10(1979)11:14(2003)...龙珠:神秘冒险(1988)龙珠:血红宝石的诅咒(1986)龙珠:魔鬼城堡中的睡公主(1987)龙种子(1944)龙纹身的女孩(2011)龙舌兰日出(1988)龙虾(2015)龙:夜之怒的礼物(2011)龙:李小龙的故事(1993)龟日记(1985)
count132.0000004.001.01.044.0000001.09.0000003.0000004.0000004.00...1.01.02.0000001.042.00000013.0000007.0000001.08.000002.0
mean3.4962123.252.52.53.4318183.52.7777782.6666673.3750003.75...3.53.53.2500003.53.4880953.0384624.0000005.02.812504.0
std0.8593810.50NaNNaN0.751672NaN0.8333331.0408331.0307760.50...NaNNaN0.353553NaN1.3274220.4311580.707107NaN1.032940.0
min0.5000002.502.52.51.5000003.52.0000001.5000002.0000003.00...3.53.53.0000003.50.5000002.0000003.0000005.00.500004.0
25%3.0000003.252.52.53.0000003.52.0000002.2500003.1250003.75...3.53.53.1250003.52.6250003.0000003.5000005.02.875004.0
50%3.5000003.502.52.53.5000003.52.5000003.0000003.5000004.00...3.53.53.2500003.54.0000003.0000004.0000005.03.000004.0
75%4.0000003.502.52.54.0000003.53.0000003.2500003.7500004.00...3.53.53.3750003.54.0000003.0000004.5000005.03.125004.0
max5.0000003.502.52.55.0000003.54.5000003.5000004.5000004.00...3.53.53.5000003.55.0000004.0000005.0000005.04.000004.0

8 rows × 9687 columns

4.智能推荐

FG = user_movie['阿甘正传(1994)']  # FG是Forrest Gump(),阿甘英文名称的缩写
pd.DataFrame(FG).head()
阿甘正传(1994)
用户编号
14.0
2NaN
3NaN
4NaN
5NaN
import numpy as np
np.seterr(divide='ignore',invalid='ignore')
# axis默认为0,计算user_movie各列与FG的相关系数
corr_FG = user_movie.corrwith(FG)
similarity = pd.DataFrame(corr_FG, columns=['相关系数'])
similarity.head()
D:\coder\randomnumbers\venv\lib\site-packages\numpy\lib\function_base.py:2845: RuntimeWarning: Degrees of freedom <= 0 for slice
  c = cov(x, y, rowvar, dtype=dtype)
D:\coder\randomnumbers\venv\lib\site-packages\numpy\lib\function_base.py:518: RuntimeWarning: Mean of empty slice.
  avg = a.mean(axis, **keepdims_kw)
相关系数
007之黄金眼(1995)0.217441
100个女孩(2000)NaN
100条街道(2016)NaN
101忠狗续集:伦敦大冒险(2003)NaN
101忠狗(1961)0.141023
similarity.dropna(inplace=True)  # 或写成similarity=similarity.dropna()
similarity.head()
相关系数
007之黄金眼(1995)0.217441
101忠狗(1961)0.141023
102只斑点狗(2000)-0.857589
10件或更少(2006)-1.000000
11:14(2003)0.500000
similarity_new = pd.merge(similarity, ratings['评分次数'], left_index=True, right_index=True)
similarity_new.head()
相关系数评分次数
007之黄金眼(1995)0.217441132
101忠狗(1961)0.14102344
102只斑点狗(2000)-0.8575899
10件或更少(2006)-1.0000003
11:14(2003)0.5000004
# 第二种合并方式
similarity_new = similarity.join(ratings['评分次数'])
similarity_new.head()
相关系数评分次数
007之黄金眼(1995)0.217441132
101忠狗(1961)0.14102344
102只斑点狗(2000)-0.8575899
10件或更少(2006)-1.0000003
11:14(2003)0.5000004
similarity_new[similarity_new['评分次数'] > 20].sort_values(by='相关系数', ascending=False).head()  # 选取阈值
相关系数评分次数
阿甘正传(1994)1.000000329
抓狂双宝(1996)0.72323831
雷神:黑暗世界(2013)0.71580921
致命吸引力(1987)0.70185636
X战警:未来的日子(2014)0.68228430

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

import pandas as pd
data = pd.DataFrame([['战狼2', '丁一', 6, 8], ['攀登者', '王二', 8, 6], ['攀登者', '张三', 10, 8], ['卧虎藏龙', '李四', 8, 8], ['卧虎藏龙', '赵五', 8, 10]], columns=['电影名称', '影评师', '观前评分', '观后评分'])
data
电影名称影评师观前评分观后评分
0战狼2丁一68
1攀登者王二86
2攀登者张三108
3卧虎藏龙李四88
4卧虎藏龙赵五810
means = data.groupby('电影名称')[['观后评分']].mean()
means
观后评分
电影名称
卧虎藏龙9.0
战狼28.0
攀登者7.0
means = data.groupby('电影名称')[['观前评分', '观后评分']].mean()
means
观前评分观后评分
电影名称
卧虎藏龙8.09.0
战狼26.08.0
攀登者9.07.0
means = data.groupby(['电影名称', '影评师'])[['观后评分']].mean()
means
观后评分
电影名称影评师
卧虎藏龙李四8.0
赵五10.0
战狼2丁一8.0
攀登者张三8.0
王二6.0
count = data.groupby('电影名称')[['观后评分']].count()
count
观后评分
电影名称
卧虎藏龙2
战狼21
攀登者2
count = count.rename(columns={'观后评分':'评分次数'})
count
评分次数
电影名称
卧虎藏龙2
战狼21
攀登者2

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI大模型】SparkDesk讯飞星火认知大模型初体验-持续更新

文章目录 SparkDesk讯飞星火认知大模型简介语言理解知识问答逻辑推理数学题解答代码理解与编写写在最后 SparkDesk讯飞星火认知大模型简介 科大讯飞推出的新一代认知智能大模型&#xff0c;拥有跨领域的知识和语言理解能力&#xff0c;能够基于自然对话方式理解与执行任务。从海…

6.其他函数

1.时间日期类 -- current_date() 返回当前日期 -- date_add(date, n) 返回从date开始n天之后的日期 -- date_sub(date, n) 返回从date开始n天之前的日期 -- datediff(date1, date2) 返回date1-date2的日期差 -- year(date) 返回…

港联证券|“牛市旗手”频遭股东减持 机构仍看好板块后市表现

5月8日&#xff0c;证券板块再迎爆发。截至收盘&#xff0c;中国银河盘中触及涨停&#xff0c;收盘涨超7%&#xff0c;中银证券涨超5%&#xff0c;信达证券、光大证券、招商证券涨超4%。板块回暖之际&#xff0c;多家券商二季度却遭遇股东减持。业内人士认为&#xff0c;减持计…

算法--扫描线

写在前面&#xff1a; 这个算法理解还是挺好理解的&#xff0c;就是到后面解决面积并问题的时候开始难理解了&#xff0c;看了半天&#xff0c;主要是还有其他的知识没理解就开始搞这个了。虽然最后还是直接懂了。 文章目录 扫描线算法的介绍一维问题LintCode 391 数飞机题目…

【历史上的今天】5 月 9 日:中国黄页上线;Red Hat 创始人出生;Scratch 2.0 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 9 日&#xff0c;在 1993 年的今天&#xff0c;第一届东亚运动会在上海隆重开幕&#xff0c;这是亚洲体育运动史上的新篇章。来自东亚地区的中国、日本、…

【笔记】【HTTP】《图解HTTP》第5章 与HTTP协做的Web服务器

前言 有输入就要有产出&#xff0c;该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布&#xff0c;下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。…

信号signal编程测试

信号会打断系统调用&#xff0c;慎用&#xff0c;就是用的时候测一测。 下面是信号的基础测试 信号 信号&#xff08;signal&#xff09;机制是UNIX系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。信号可以由各种异步事件产生&#xff0c;例如…

数据结构与算法1:引入概念

接下来系统的学一下数据结构与算法的知识&#xff0c;本章节是第一部分&#xff1a;数据结构与算法的进入与基本概述 第一章&#xff1a;引入概念 【铁打的算法demo】先来看到题&#xff1a; 如果 a b c 1000&#xff0c;且 a2 b2 c2&#xff08;a, b , c 为⾃然数&…

快进来,带你了解FPGA基础知识---lattice莱迪斯深力科MachXO2 FPGA系列简介

FPGA基础知识---lattice莱迪斯深力科MachXO2 LCMXO2-4000HC-4TG144I FPGA简介 FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它…

《程序员面试金典(第6版)》面试题 16.17. 连续数列(贪心算法思想,动态规划算法思想,C++)

题目描述 给定一个整数数组&#xff0c;找出总和最大的连续数列&#xff0c;并返回总和。 示例&#xff1a; 输入&#xff1a; [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a; 6 解释&#xff1a; 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。进阶&#xff1a; 如果你已经实…

elementUI tabs切换 echarts宽度挤压到一起 由100%变成100px

被压缩的图表&#xff1a; 正常显示 <el-tabs v-model"activeName" type"card" tab-click"handleClick"><el-tab-pane name"first"></el-tab-pane><el-tab-pane name"second" label"未达成原因…

如何在Kali Linux中获得root权限?

根用户名或账户在Linux或任何其他类似Unix的操作系统中拥有所有可用命令和文件的默认权限。它也被称为超级用户、根账户和根用户。用户名&#xff1a;"kali "是登录新Kali系统的标准凭证。这建立了一个用户 "kali "的会话&#xff0c;你必须在 "Sudo …

Java—JDK8新特性—方法引用【内含思维导图】

目录 4.方法引用 思维导图 4.1 什么是方法引用 4.2 为什么要使用方法引用 4.3 方法引用语法 4.4 方法引用的5种情况使用示例 4.方法引用 思维导图 4.1 什么是方法引用 方法引用就是Lambda表达式&#xff0c;也就是函数式接口的一个实例&#xff0c;通过方法的名称来指向一…

Word怎么分页,提高效率就靠这3种方法!

案例&#xff1a;Word怎么分页 【文档要进行分页处理&#xff0c;但是我尝试了好多次还是不行&#xff01;大家知道Word怎么分页吗&#xff1f;】 在使用Microsoft Word处理文档时&#xff0c;我们常常需要进行分页操作。Word的分页功能可以将文档分成多个页面&#xff0c;以…

【Vue3 插件篇】GSAP 动画库与 图片预览插件

GSAP 动画库 GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个专业的动画库&#xff0c;可以用它完成你想要的各种效果 官网地址&#xff1a;https://greensock.com/ 参考文章一&#xff1a;https://www.jianshu.com/p/a8e150f0e569 参考文章二&#xff1a…

利用MQ事务消息实现分布式事务

MQ事务消息使用场景 消息队列中的“事务”&#xff0c;主要解决的是消息生产者和消息消费者的数据一致性问题。 拿我们熟悉的电商来举个例子。一般来说&#xff0c;用户在电商 APP 上购物时&#xff0c;先把商品加到购物车里&#xff0c;然后几件商品一起下单&#xff0c;最后…

为游客提供完美旅程:携程集团携手亚马逊云科技联合创新

刚刚过去的“五一”假期&#xff0c;旅游行业展现出了强劲的复苏势头。经文化和旅游部数据中心测算&#xff0c;全国国内旅游出游合计2.74亿人次&#xff0c;同比增长70.83%。 然而&#xff0c;出行前的航班高铁订票、酒店商旅预订、出游行程安排&#xff0c;就已经让不少家庭为…

C++linux高并发服务器项目实践 day9

Clinux高并发服务器项目实践 day9 信号集信号集相关函数以下信号集相关的函数都是对自定义的信号集进行操作sighandler_t函数sigaction函数 SIGCHLD信号共享内存共享内存使用步骤共享内存操作函数 信号集 许多信号相关的系统调用都需要能表示一组不同的信号&#xff0c;多个信…

深度思考:在 AI 时代,你会被放大一千倍的能力是什么?

Datawhale干货 作者&#xff1a;艾芙&#xff0c;复旦大学&#xff0c;百姓AI教育负责人 前言 大家晚上好&#xff0c;我是艾芙&#xff0c;百姓 AI 的 AI 教育负责人。 先做一下自我介绍&#xff0c;我是一个在技术圈和教育圈反复横跳的斜杠中年了。大约在 5 年前&#xff0c…

C++格式输入输出

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…