直播系统,利用关联规则实现推荐算法

直播系统,利用关联规则实现推荐算法

关联规则是以规则的方式呈现直播系统之间的相关性:关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。

关联规则的经典例子是通过发现顾客放入其购物篮中的不同商品之间的联系,可分析顾客在直播系统中的购买习惯。通过了解哪些商品频繁地被顾客同时购买,可以帮助零售商制定营销策略。

 

Apriori Algorithm(先验)

它是一种购物车的分析方法,用于揭示产品之间的关联关系。

他有三个简单的公式:

Support(X, Y) = Freq(X, Y) / N :它表示 X 和 Y 一起出现的概率。它是 X 和 Y 一起出现的频率除以 N。

Confidence(X, Y) = Freq(X, Y) / Freq(X) :表示购买产品X时购买产品Y的概率。X 和 Y 一起出现的频率除以 X 出现的频率。

Lift = Support(X, Y) / (Support(x) * Support (Y)) :当购买X时,购买Y的概率增加了lift的倍数。X 和 Y 一起出现的概率是 X 和 Y 分别出现的概率的乘积。它陈述了一个表达式,例如当我们购买一种产品时,购买另一种产品的概率会增加多少倍。

下面我们将使用Apriori Algorithm向用户推荐相应的产品

数据预处理

这里我们使用的数据集是online retail II dataset

!pip install mlxtend
import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.width', 500)
# It ensures that the output is on one line.
pd.set_option('display.expand_frame_repr', False)
from mlxtend.frequent_patterns import apriori, association_rules
df_ = pd.read_excel("datasets/online_retail_II.xlsx", sheet_name = "Year 2010-2011")
df = df_.copy()
df.info()
# Column       Non-Null Count   Dtype
# ---  ------       --------------   -----
#  0   Invoice      541910 non-null  object
#  1   StockCode    541910 non-null  object
#  2   Description  540456 non-null  object
#  3   Quantity     541910 non-null  int64
#  4   InvoiceDate  541910 non-null  datetime64[ns]
#  5   Price        541910 non-null  float64
#  6   Customer ID  406830 non-null  float64
#  7   Country      541910 non-null  objectdf.head()
#  Invoice StockCode                          Description  Quantity         InvoiceDate  Price  Customer ID         Country
# 0  536365    85123A   WHITE HANGING HEART T-LIGHT HOLDER         6 2010-12-01 08:26:00   2.55      17850.0  United Kingdom
# 1  536365     71053                  WHITE METAL LANTERN         6 2010-12-01 08:26:00   3.39      17850.0  United Kingdom
# 2  536365    84406B       CREAM CUPID HEARTS COAT HANGER         8 2010-12-01 08:26:00   2.75      17850.0  United Kingdom
# 3  536365    84029G  KNITTED UNION FLAG HOT WATER BOTTLE         6 2010-12-01 08:26:00   3.39      17850.0  United Kingdom
# 4  536365    84029E       RED WOOLLY HOTTIE WHITE HEART.         6 2010-12-01 08:26:00   3.39      17850.0  United Kingdom

 

我们使用这个函数来确定数据的阈值。

def outlier_thresholds(dataframe, variable):quartile1 = dataframe[variable].quantile(0.01)quartile3 = dataframe[variable].quantile(0.99)interquantile_range = quartile3 - quartile1up_limit = quartile3 + 1.5 * interquantile_rangelow_limit = quartile1 - 1.5 * interquantile_rangereturn low_limit, up_limit

 

下面这个函用阈值替换了异常值。

def replace_with_thresholds(dataframe, variable):low_limit, up_limit = outlier_thresholds(dataframe, variable)dataframe.loc[(dataframe[variable] < low_limit), variable] = low_limitdataframe.loc[(dataframe[variable] > up_limit), variable] = up_limit

 

第三个函数中我们从数据中提取包含“C”的值。“C”表示退回的物品。要计算总价,变量数量和价格必须大于零。在这个函数中还调用了 Outlier 和 Threshold 函数。

def retail_data_prep(dataframe):dataframe.dropna(inplace=True)dataframe = dataframe[~dataframe["Invoice"].str.contains("C", na=False)]dataframe = dataframe[dataframe["Quantity"] > 0]dataframe = dataframe[dataframe["Price"] > 0]replace_with_thresholds(dataframe, "Quantity")replace_with_thresholds(dataframe, "Price")return dataframedf = retail_data_prep(df)

 

准备购买-物品的矩阵

数据集中的收据(Invoice)包含了产品的购买,所以我们先处理这个

df_gr = df[df['Country'] == 'Germany']
df_gr.head()
Invoice StockCode                          Description  Quantity         InvoiceDate  Price  Customer ID  Country
1109  536527     22809              SET OF 6 T-LIGHTS SANTA       6.0 2010-12-01 13:04:00   2.95      12662.0  Germany
1110  536527     84347  ROTATING SILVER ANGELS T-LIGHT HLDR       6.0 2010-12-01 13:04:00   2.55      12662.0  Germany
1111  536527     84945   MULTI COLOUR SILVER T-LIGHT HOLDER      12.0 2010-12-01 13:04:00   0.85      12662.0  Germany
1112  536527     22242        5 HOOK HANGER MAGIC TOADSTOOL      12.0 2010-12-01 13:04:00   1.65      12662.0  Germany
1113  536527     22244           3 HOOK HANGER MAGIC GARDEN      12.0 2010-12-01 13:04:00   1.95      12662.0  Germany

 

根据 Invoice 和 Description,我们通过 groupby 计算 Quantities,可以计算产品的数量。

df_gr.groupby(['Invoice', 'Description']).agg({"Quantity": "sum"}).head(20)
# Invoice Description
# 536527  3 HOOK HANGER MAGIC GARDEN               12.0
#         5 HOOK HANGER MAGIC TOADSTOOL            12.0
#         5 HOOK HANGER RED MAGIC TOADSTOOL        12.0
#         ASSORTED COLOUR LIZARD SUCTION HOOK      24.0
#         CHILDREN'S CIRCUS PARADE MUG             12.0
#         HOMEMADE JAM SCENTED CANDLES             12.0
#         HOT WATER BOTTLE BABUSHKA                 4.0
#         JUMBO BAG OWLS                           10.0
#         JUMBO BAG WOODLAND ANIMALS               10.0
#         MULTI COLOUR SILVER T-LIGHT HOLDER       12.0
#         PACK 3 FIRE ENGINE/CAR PATCHES           12.0
#         PICTURE DOMINOES                         12.0
#         POSTAGE                                   1.0
#         ROTATING SILVER ANGELS T-LIGHT HLDR       6.0
#         SET OF 6 T-LIGHTS SANTA                   6.0
# 536840  6 RIBBONS RUSTIC CHARM                   12.0
#         60 CAKE CASES VINTAGE CHRISTMAS          24.0
#         60 TEATIME FAIRY CAKE CASES              24.0
#         CAKE STAND WHITE TWO TIER LACE            2.0
#         JAM JAR WITH GREEN LID                   12.0

 

我们使用 unstack 来避免重复的索引,使用 iloc 来显示前 5 个观察结果。如果产品不在收据中,则 使用NA 表示。

df_gr.groupby(['Invoice', 'Description']).agg({"Quantity": "sum"}).unstack().iloc[0:5, 0:5]
# Description  50'S CHRISTMAS GIFT BAG LARGE  DOLLY GIRL BEAKER  I LOVE LONDON MINI BACKPACK  RED SPOT GIFT BAG LARGE  SET 2 TEA TOWELS I LOVE LONDON
# Invoice
# 536527                                 NaN                NaN                          NaN                      NaN                              NaN
# 536840                                 NaN                NaN                          NaN                      NaN                              NaN
# 536861                                 NaN                NaN                          NaN                      NaN                              NaN
# 536967                                 NaN                NaN                          NaN                      NaN                              NaN
# 536983                                 NaN                NaN                          NaN                      NaN                              NaN

 

进行独热编码。把 NA 的地方写 0。

df_gr.groupby(['Invoice', 'Description']).agg({"Quantity": "sum"}).unstack().fillna(0).iloc[0:5, 0:5]
# Description  50'S CHRISTMAS GIFT BAG LARGE  DOLLY GIRL BEAKER  I LOVE LONDON MINI BACKPACK  RED SPOT GIFT BAG LARGE  SET 2 TEA TOWELS I LOVE LONDON
# Invoice
# 536527                                 0.0                0.0                          0.0                      0.0                              0.0
# 536840                                 0.0                0.0                          0.0                      0.0                              0.0
# 536861                                 0.0                0.0                          0.0                      0.0                              0.0
# 536967                                 0.0                0.0                          0.0                      0.0                              0.0
# 536983                                 0.0                0.0                          0.0                      0.0                              0.0

 

如果发票中的产品数量大于0,我们就写1,如果小于0或0,我们就写0。用apply对行或列进行操作。这里将通过应用 applymap 并执行操作来遍历所有单元格。

df_gr.groupby(['Invoice', 'Description']).agg({"Quantity": "sum"}).unstack().fillna(0).applymap(lambda x: 1 if x > 0 else 0).iloc[0:5, 0:5]
# Description  50'S CHRISTMAS GIFT BAG LARGE  DOLLY GIRL BEAKER  I LOVE LONDON MINI BACKPACK  RED SPOT GIFT BAG LARGE  SET 2 TEA TOWELS I LOVE LONDON
# Invoice
# 536527                                   0                  0                            0                        0                                0
# 536840                                   0                  0                            0                        0                                0
# 536861                                   0                  0                            0                        0                                0
# 536967                                   0                  0                            0                        0                                0
# 536983                                   0                  0                            0                        0                                0

 

我们创建了一个名为 create_invoice_df 的函数。如果想根据id变量搜索并得到结果,它会根据stockcode进行与上述相同的操作。如果我们输入的id为False,它会根据Description执行上面的操作。

def create_invoice_product_df(dataframe, id=False):if id:return dataframe.groupby(['Invoice', "StockCode"])['Quantity'].sum().unstack().fillna(0). \applymap(lambda x: 1 if x > 0 else 0)else:return dataframe.groupby(['Invoice', 'Description'])['Quantity'].sum().unstack().fillna(0). \applymap(lambda x: 1 if x > 0 else 0)
gr_inv_pro_df = create_invoice_product_df(df_gr)
gr_inv_pro_df.head(20)
gr_inv_pro_df = create_invoice_product_df(df_gr, id=True)
gr_inv_pro_df.head()
def check_id(dataframe, stock_code):product_name = dataframe[dataframe["StockCode"] == stock_code][["Description"]].values[0].tolist()print(product_name)check_id(df_gr, 16016)
# ['LARGE CHINESE STYLE SCISSOR']

 

所有可能的产品组合

frequent_itemsets = apriori(gr_inv_pro_df, min_support=0.01, use_colnames=True)
frequent_itemsets.sort_values("support", ascending=False).head()
#  support       itemsets
# 538   0.818381         (POST)
# 189   0.245077        (22326)
# 1864  0.225383  (POST, 22326)
# 191   0.157549        (22328)
# 1931  0.150985  (22328, POST)
check_id(df_gr, 22328)
#['ROUND SNACK BOXES SET OF 4 FRUITS ']

 

通过将我们用 Apriori 找到的Support插入到 association_rules 函数中,找到一些其他的统计数据,例如置信度和提升度。

rules = association_rules(frequent_itemsets, metric="support", min_threshold=0.01)
rules.sort_values("support", ascending=False).head()

 

POST产品和编号为22326的产品同时出现的概率为0.225383。被一起买的概率是0.275401。同时购买这两种产品的概率增加为1.123735。

# antecedents consequents  antecedent support  consequent support   support  confidence      lift  leverage  conviction
# 2650      (POST)     (22326)            0.818381            0.245077  0.225383    0.275401  1.123735  0.024817    1.041850
# 2651     (22326)      (POST)            0.245077            0.818381  0.225383    0.919643  1.123735  0.024817    2.260151
# 2784     (22328)      (POST)            0.157549            0.818381  0.150985    0.958333  1.171012  0.022049    4.358862
# 2785      (POST)     (22328)            0.818381            0.157549  0.150985    0.184492  1.171012  0.022049    1.033038
# 2414     (22328)     (22326)            0.157549            0.245077  0.131291    0.833333  3.400298  0.092679    4.529540

 

以上就是直播系统,利用关联规则实现推荐算法, 更多内容欢迎关注之后的文章

 

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

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

相关文章

项目经理的新伙伴:性能出众的进度管理软件

国内外主流的10款项目进度管理软件对比:PingCode、Worktile、Teambition、石墨文档(Shimo Docs)、Tower、有道云协作、Monday.com、Asana、Airtable、Notion。在管理任何项目时,及时准确地跟踪进度是至关重要的,但在琳琅满目的项目管理软件中找到最合适的一款却常常令人头…

mysqldump: Got error: 1066: Not unique table/alias: act_evt_log when using LOCK TABLES

先说解决办法:执行下面语句 mysqldump -ushooter -p123123 --single-transaction fd>fd.sqllower_case_table_names区分大小写设置 注意:此参数不可以动态修改,必须重启数据库 1 2 3 41、参数含义: lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候…

解决--SecureCRT乱码问题

SecureCRT是一个商业终端连接工具,支持多种自定义设置。默认设置下,通过SecureCRT连接SSH服务器可能出现中文乱码的情况。这是由于SecureCRT字符编码与服务器的字符编码不一致造成的。解决:将SecureCRT字符编码设置成与服务器的字符编码一致即可,将SecureCRT字符编码设置成…

动态内存分配的策略研究

使用Carnegie Mellon University提供的C语言模拟代码为测试,验证多种分配策略的特性,为设计新的更高效的算法进行探路,工程文件附于文章末尾。 基本宏定义 阅读C语言测试模型,得到基本分配块的结构约定。#define ALIGNMENT 8 //校准字长,4或8 #define ALIGN(size…

Naplespu微体系结构内多个插件融合分析(草稿)

Naplespu微体系结构内多个插件融合分析(草稿) http://www.naplespu.com/doc/index.php?title=Detailed_studies 介绍 打算展示替换链是如何相对于L2缓存发生的,观察目录控制器是如何演变以管理此类情况的发生的。主要目的是测试发生L2替换的所有情况,如图所示:目录控制器…

python-if elif嵌套结构

if 条件:if语句块 elif 条件:elif语句块 else:else语句块 示例:

python-换行

a=10+\20+\30 #\是换行符print(a)b=(10+20+30) #括号换行 print(b)

浅谈 I/O 与 I/O 多路复用

1.基础知识网络编程里常听到阻塞IO、非阻塞IO、同步IO、异步IO等概念,总听别人聊不如自己下来钻研一下。不过,搞清楚这些概念之前,还得先回顾一些基础的概念。下面说的都是Linux环境下,跟Windows环境不一样哈☺。1.1 用户空间和内核空间现在操作系统都采用虚拟寻址,处理器…

服务器性能监控系统安装与配置手册

服务器性能监控系统安装与配置手册 1. 前言 本手册旨在指导用户安装与配置服务器性能监控系统,并介绍系统的主要功能及使用方式。 2. 系统概述 本系统采用 [系统名称] 作为核心监控组件,并结合 [其他组件] 实现服务器性能的实时监控、告警和数据分析。 3. 系统架构监控节点: …

Java学习Day3_上 总结

1.算术运算符: %运算: a % b = a - a / b * b 2.关系运算符: 返回值是boolean类型. 3.逻辑运算符: PASS 4.三元运算符: 条件表达式 ? : 表达式1:表达式2; public class ThreeEye {public static void main(String arg[]) {int a = 1, b = 2;int c = a > b ? a : b;System…

太卷了,阿里云免费1个月大模型算力额度,玩转Llama3.1/Qwen2等训练推理

阿里云百炼平台发布推文,提供30天免费算力额度,助力玩转 Llama3.1 训练推理。老牛同学首当其冲,去体验一把,本文详细记录了整个过程,同时给出了老牛同学的一些想法,欢迎交流学习……早上收到朋友转发的阿里云公众号推文,阿里云为用户免费提供 1 个月的训练推理等算力额度…

【待做】【攻防技术系列+免杀】从零学习Webshell免杀

项目简介 这是一本能让你从零开始学习PHP的WebShell免杀的手册 博客地址: https://blog.zgsec.cn/index.php/archives/197/项目描述 一、PHP相关资料 PHP官方手册: https://www.php.net/manual/zh/PHP函数参考: https://www.php.net/manual/zh/funcref.php菜鸟教程: https:…