当前位置: 首页 > news >正文

数据挖掘|序列模式挖掘及其算法的python实现

数据挖掘|序列模式挖掘及其算法的python实现

  • 1. 序列模式挖掘
  • 2. 基本概念
  • 3. 序列模式挖掘实例
  • 4. 类Apriori算法(GSP算法)
    • 4.1 算法思想
    • 4.2 算法步骤
    • 4.3 基于Python的算法实现

1. 序列模式挖掘

序列(sequence)模式挖掘也称为序列分析。
序列模式发现(Sequential Patterns Discovery)是由R.Agrawal于1995年首先提出的。
序列模式寻找的是事件之间在顺序上的相关性。

  • 例如,“凡是买了喷墨打印机的顾客中,80%的人在三个月之后又买了墨盒”,就是一个序列关联规则。对于保险行业,通过分析顾客不同次的购买行为发现,顾客本次购买重疾险,下次购买分红保险,则企业可以通过对重疾险销量的统计来预测分红险的销售量。

序列模式挖掘在交易数据库分析、Web访问日志分析以及通信网络分析等领域具有广泛的应用前景。

2. 基本概念

I = i 1 , i 2 , . . . , i n I={i_1,i_2,...,i_n} I=i1,i2,...,in是一个项集,序列就是若事件(元素)组成的有序列表。

一个序列 S e Se Se可表示为 < s 1 , s 2 , . . . , s n > <s_1,s_2,...,s_n> <s1,s2,...,sn>,其中 s j ( j = 1 , 2 , … , n ) s_j(j=1,2, …, n) sj(j=1,2,,n)为事件,也称为 S e Se Se的元素。

元素由不同的项组成。当元素只包含一项时,一般省去括号,例如, { i 2 } \{i_2\} {i2}一般表示为 i 2 i_2 i2

元素之间是有顺序的,但元素内的项是无序的,一般定义为词典序。序列包含项的个数称为序列的长度,长度为 L L L的序列记为 L − 序列 L-序列 L序列

序列数据库就是元组 < s i d , S e > <sid, Se> <sid,Se>的集合,即有序事件序列组成的数据库,其中 S e Se Se是序列, s i d sid sid 是该序列的序列号。

存在两个序列 α = < a 1 , a 2 , . . . , a n > , β = < b 1 , b 2 , … , b n > \alpha = <a_1, a_2, ...,a_n>, \beta = <b_1, b_2, …, b_n> α=<a1,a2,...,an>,β=<b1,b2,,bn>,如果存在整数 1 ≤ i 1 < i 2 < … < i n ≤ m 1\leq i_1 < i_2 <…<i_n \leq m 1i1<i2<<inm a 1 ⊆ b i 1 , a 2 ⊆ b i 2 , … , a n ⊆ b i n a_1\subseteq b_{i1}, a_2 \subseteq b_{i2}, …, a_n \subseteq b_{in} a1bi1,a2bi2,,anbin,那么称序列 α \alpha α β \beta β 的子序列(subsequence),或者序列 β \beta β 包含 α \alpha α,记作 α ⊆ β \alpha\subseteq \beta αβ

序列在序列数据库 S e Se Se 中的支持度为序列数据库 S e Se Se 中包含序列 α \alpha α的序列个数除以总的序列数,记为 s u p p o r t ( α ) support (\alpha) support(α)。给定支持度阈值 τ \tau τ,如果序列 α \alpha α在序列数据库中的支持度不低于 τ \tau τ,则称序列 α \alpha α为序列模式(频繁序列)。

3. 序列模式挖掘实例

现有事务数据库如下表1所示,交易中不考虑顾客购买物品的数量,只考虑物品有没有被购买。整理后可得到顾客购物序列库,如表2所示。

  • 表1:顾客购物事务数据库
时间顾客ID购物项集
2023.12.10210,20
2023.12.11590
2023.12.12230
2023.12.13240,60,70
2023.12.14430
2023.12.15330,50,70
2023.12.17130
2023.12.17190
2023.12.18440,70
2023.12.19490
  • 表2:顾客购物序列库
顾客ID顾客购物序列
1<30,90>
2<{10,20},30,{40,60,70}>
3<{30,50,70}>
4<30,{40,70},90>
5<90>

设最小支持度为 25%,从表2中可以看出,<30,90> 是 <30, {40,70},90> 的子序列。两个序列<30,90>、<30,{40,70},90>的支持度都为 40%,因此是序列模式。

4. 类Apriori算法(GSP算法)

序列模式挖掘是在给定序列数据库中找出满足最小支持度阈值的序列模式的过程。

4.1 算法思想

采用分而治之的思想,不断产生序列数据库的多个更小的投影数据库,然后在各个投影数据库上进行序列模式挖掘。

4.2 算法步骤

  1. 扫描序列数据库,得到长度为 1 1 1的序列模式 L 1 L1 L1,作为初始的种子集。
  2. 根据长度为 i i i 的种子集 L i ( i ≥ 1 ) L_i (i\geq1) Li(i1) 通过连接操作生成长度为 i + 1 i+1 i+1的候选序列模式 C i + 1 C_{i+1} Ci+1;然后扫描序列数据库,计算每个候选序列模式的支持数,产生长度为 i + 1 i+1 i+1的序列模式 L i + 1 L_{i+1} Li+1,并将 L i + 1 L_{i+1} Li+1 作为新的种子集。
  3. 重复第二步,直到没有新的序列模式或新的候选序列模式产生为止

4.3 基于Python的算法实现

问题:原始序列为:<1,2,3,4>,<{1,5},2,3,4>, <1,3,4,{3,5}>, <1,3,5>, <4,5>,挖掘其中的序列模式。
以下代码是本人自己实现的。感觉原始序列的数据结构使用的不太好,导致子模式识别较为麻烦,可能存在错误,仅保证本算例正确,敬请谅解。

import numpy as np
#子模式判断 
def isSubSeq(seq,subseq)->bool:i=0;if len(subseq)>len(seq):return Falsefor sel in subseq:if i >= len(seq):return Falsefor j in range(i,len(seq)):if type(seq[j])==list:if sel in seq[j]:i=j+1breakelif j==len(seq)-1:return Falseelif sel==seq[j]:i=j+1breakelif j==len(seq)-1:return Falseelse:continuereturn True          # 获取L1数据集
def getL1(seq):ds=[]for ss in seq:for s in ss:if type(s)==list:for e in s:if [e] not in ds:ds.append([e])else:if [s] not in ds:ds.append([s])return np.array(ds)# 获取L2数据集
def getL2(l1seq)->np.ndarray:ds=[]for i in range(len(l1seq)):for j in range(len(l1seq)):if i != j:#np.append(ds, [l1seq[i],l1seq[j]])ds.append([l1seq[i][0],l1seq[j][0]])    return  np.array(ds)  # 获取L3数据集
def getL3(l1seq,l2seq):ds=[]for se2 in l2seq:for se1 in l1seq:if se1 not in se2:ds.append(np.append(se2, se1))         return  ds  
# 获取L4数据集
def getL4(l1seq,l3seq):ds=[]for se3 in l3seq:for se1 in l1seq:if se1 not in se3:ds.append(np.append(se3, se1))         return  ds        #计算支持度
def calSup(dsq,seq):i=0.0for s in dsq:if isSubSeq(s,seq):i=i+1return i/len(dsq)if __name__ == "__main__":min_support = 0.4  #最小支持度dsq = np.array([[1,2,3,4],[[1,5],2,3,4],[1,3,4,[3,5]],[1,3,5],[4,5]],dtype=object)l1=getL1(dsq)for l in l1:print('序列-1:',l,'的支持度为:',calSup(dsq, l))l2 = getL2(l1)l2seq=[]for i in range(len(l2)):sups=calSup(dsq, l2[i])if sups >=min_support:print('序列-2:',l2[i],'的支持度为:',sups)l2seq.append(l2[i])l3=getL3(l1,l2seq)l3seq=[]for i in range(len(l3)):sups=calSup(dsq, l3[i])if sups >=min_support:print('序列-3:',l3[i],'的支持度为:',sups)l3seq.append(l3[i])l4=getL4(l1,l3seq)l4seq=[]for i in range(len(l4)):sups=calSup(dsq, l4[i])if sups >=min_support:print('序列-4:',l4[i],'的支持度为:',sups)l4seq.append(l4[i])

输出:

	序列-1: [1] 的支持度为: 0.8序列-1: [2] 的支持度为: 0.4序列-1: [3] 的支持度为: 0.8序列-1: [4] 的支持度为: 0.8序列-1: [5] 的支持度为: 0.8序列-2: [1 2] 的支持度为: 0.4序列-2: [1 3] 的支持度为: 0.8序列-2: [1 4] 的支持度为: 0.6序列-2: [1 5] 的支持度为: 0.4序列-2: [2 3] 的支持度为: 0.4序列-2: [2 4] 的支持度为: 0.4序列-2: [3 4] 的支持度为: 0.6序列-2: [3 5] 的支持度为: 0.4序列-2: [4 5] 的支持度为: 0.4序列-3: [1 2 3] 的支持度为: 0.4序列-3: [1 2 4] 的支持度为: 0.4序列-3: [1 3 4] 的支持度为: 0.6序列-3: [1 3 5] 的支持度为: 0.4序列-3: [2 3 4] 的支持度为: 0.4序列-4: [1 2 3 4] 的支持度为: 0.4
http://www.lryc.cn/news/334685.html

相关文章:

  • 3. Django 初探路由
  • 论文笔记:Large Language Models as Analogical Reasoners
  • 第3章 数据定义语言DDL
  • C#操作MySQL从入门到精通(7)——对查询数据进行简单过滤
  • 【CVE复现计划】CVE-2024-0195
  • k8s的ca以及相关证书签发流程
  • 思迈特软件与上海德拓签署战略合作协议,携手赋能企业数字化转型
  • 【快捷部署】015_Minio(latest)
  • <网络安全>《72 微课堂<什么是靶场?>》
  • Golang | Leetcode Golang题解之第18题四数之和
  • 自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器
  • 基于ssm的星空游戏购买下载平台的设计与实现论文
  • DSOX6004A是德科技DSOX6004A示波器
  • golang 使用 cipher、aes 实现 oauth2 验证
  • LLMs之FreeGPT35:FreeGPT35的简介、安装和使用方法、案例应用之详细攻略
  • 【力扣一刷】代码随想录day32(贪心算法part2:122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II )
  • 安卓远离手机app
  • yolov5旋转目标检测遥感图像检测-无人机旋转目标检测(代码和原理)
  • 云手机提供私域流量变现方案
  • 树的基本概念与二叉树
  • 什么是物理服务器?
  • 数据结构:详解【树和二叉树】
  • “成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用“
  • semhear环境sox
  • 如何快速开启一个项目-ApiHug - API design Copilot
  • 从用友U9到钉钉通过接口配置打通数据
  • PyQt qrc2py 使用PowerShell将qrc文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用
  • phpstorm设置头部注释和自定义注释内容
  • 【数据分析面试】10. 计算平均通勤时间(SQL:timestampdiff() 和datediff()区别)
  • 2024年150道高频Java面试题(二十二)