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

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

  • [1. 序列模式挖掘](#1. 序列模式挖掘)
  • [2. 基本概念](#2. 基本概念)
  • [3. 序列模式挖掘实例](#3. 序列模式挖掘实例)
  • [4. 类Apriori算法(GSP算法)](#4. 类Apriori算法(GSP算法))
    • [4.1 算法思想](#4.1 算法思想)
    • [4.2 算法步骤](#4.2 算法步骤)
    • [4.3 基于Python的算法实现](#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 1≤i1<i2<...<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.10 2 10,20
2023.12.11 5 90
2023.12.12 2 30
2023.12.13 2 40,60,70
2023.12.14 4 30
2023.12.15 3 30,50,70
2023.12.17 1 30
2023.12.17 1 90
2023.12.18 4 40,70
2023.12.19 4 90
  • 表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(i≥1) 通过连接操作生成长度为 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>,挖掘其中的序列模式。

以下代码是本人自己实现的。感觉原始序列的数据结构使用的不太好,导致子模式识别较为麻烦,可能存在错误,仅保证本算例正确,敬请谅解。

python 复制代码
import numpy as np
#子模式判断 
def isSubSeq(seq,subseq)->bool:
    i=0;
    if len(subseq)>len(seq):
        return False
    for sel in subseq:
        if i >= len(seq):
            return False
        for j in range(i,len(seq)):
            if type(seq[j])==list:
                if sel in seq[j]:
                    i=j+1
                    break
                elif j==len(seq)-1:
                    return False
            elif sel==seq[j]:
                i=j+1
                break
            elif j==len(seq)-1:
                return False
            else:
                continue
    return 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.0
    for s in dsq:
        if isSubSeq(s,seq):
            i=i+1
    return 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
相关推荐
云泽野16 分钟前
【Java|集合类】list遍历的6种方式
java·python·list
麻雀无能为力1 小时前
CAU数据挖掘实验 表分析数据插件
人工智能·数据挖掘·中国农业大学
时序之心1 小时前
时空数据挖掘五大革新方向详解篇!
人工智能·数据挖掘·论文·时间序列
IMPYLH2 小时前
Python 的内置函数 reversed
笔记·python
小赖同学啊4 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼4 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
小陈phd5 小时前
李宏毅机器学习笔记——梯度下降法
人工智能·python·机器学习
kk爱闹5 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
Blossom.1185 小时前
机器学习在智能建筑中的应用:能源管理与环境优化
人工智能·python·深度学习·神经网络·机器学习·机器人·sklearn
亚力山大抵6 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask