做韦恩图网站,网页设计开发培训,百度app官方下载安装,可以做代销的网站数据挖掘|序列模式挖掘及其算法的python实现 1. 序列模式挖掘2. 基本概念3. 序列模式挖掘实例4. 类Apriori算法#xff08;GSP算法#xff09;4.1 算法思想4.2 算法步骤4.3 基于Python的算法实现 1. 序列模式挖掘
序列(sequence)模式挖掘也称为序列分析。 序列模式发现… 数据挖掘|序列模式挖掘及其算法的python实现 1. 序列模式挖掘2. 基本概念3. 序列模式挖掘实例4. 类Apriori算法GSP算法4.1 算法思想4.2 算法步骤4.3 基于Python的算法实现 1. 序列模式挖掘
序列(sequence)模式挖掘也称为序列分析。 序列模式发现Sequential Patterns Discovery是由RAgrawal于1995年首先提出的。 序列模式寻找的是事件之间在顺序上的相关性。
例如“凡是买了喷墨打印机的顾客中80%的人在三个月之后又买了墨盒”就是一个序列关联规则。对于保险行业通过分析顾客不同次的购买行为发现顾客本次购买重疾险下次购买分红保险则企业可以通过对重疾险销量的统计来预测分红险的销售量。
序列模式挖掘在交易数据库分析、Web访问日志分析以及通信网络分析等领域具有广泛的应用前景。
2. 基本概念
设 I i 1 , i 2 , . . . , i n I{i_1,i_2,...,i_n} Ii1,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(j1,2, …, n) sj(j1,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 1≤i1i2…in≤m 且 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} a1⊆bi1,a2⊆bi2,…,an⊆bin那么称序列 α \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.10210202023.12.115902023.12.122302023.12.1324060702023.12.144302023.12.1533050702023.12.171302023.12.171902023.12.18440702023.12.19490
表2顾客购物序列库
顾客ID顾客购物序列130,902{10,20},30,{40,60,70}3{30,50,70}430,{40,70},90590
设最小支持度为 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的序列模式 L 1 L1 L1作为初始的种子集。根据长度为 i i i 的种子集 L i ( i ≥ 1 ) L_i (i\geq1) Li(i≥1) 通过连接操作生成长度为 i 1 i1 i1的候选序列模式 C i 1 C_{i1} Ci1然后扫描序列数据库计算每个候选序列模式的支持数产生长度为 i 1 i1 i1的序列模式 L i 1 L_{i1} Li1并将 L i 1 L_{i1} Li1 作为新的种子集。重复第二步直到没有新的序列模式或新的候选序列模式产生为止
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:i0;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]:ij1breakelif jlen(seq)-1:return Falseelif selseq[j]:ij1breakelif jlen(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):i0.0for s in dsq:if isSubSeq(s,seq):ii1return 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]],dtypeobject)l1getL1(dsq)for l in l1:print(序列-1,l,的支持度为,calSup(dsq, l))l2 getL2(l1)l2seq[]for i in range(len(l2)):supscalSup(dsq, l2[i])if sups min_support:print(序列-2,l2[i],的支持度为,sups)l2seq.append(l2[i])l3getL3(l1,l2seq)l3seq[]for i in range(len(l3)):supscalSup(dsq, l3[i])if sups min_support:print(序列-3,l3[i],的支持度为,sups)l3seq.append(l3[i])l4getL4(l1,l3seq)l4seq[]for i in range(len(l4)):supscalSup(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