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

这篇具有很好参考价值的文章主要介绍了数据挖掘|序列模式挖掘及其算法的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.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(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 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])

输出:文章来源地址https://www.toymoban.com/news/detail-845497.html

	序列-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

到了这里,关于数据挖掘|序列模式挖掘及其算法的python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据挖掘】时间序列教程【四】

            我们可以对上述  的主模型采用方差分析方法,并将中的总变异分解为 为残差平方和和可归因于各种频率的变化。                 第二行是可能的,因为平方的所有交叉项都等于零,即对于所有 ,                                 

    2024年02月12日
    浏览(49)
  • 【数据挖掘】时间序列教程【八】

    我们先考虑一个简单的线性回归模型,                                          哪里 和是具有平均值的高斯过程 00 和自协方差 .现在,在不失去一般性的情况下,让我们假设 而那 瓦尔

    2024年02月12日
    浏览(45)
  • 【数据挖掘】时间序列教程【九】

            状态空间模型通常试图描述具有两个特征的现象 有一个底层系统具有时变的动态关系,因此系统在时间上的“状态”t 与系统在时间的状态t−1有关 .如果我们知道系统在时间上的状态t−1 ,那么我们就有了 我们需要知道的一切 ,以便对当时的状态进行推断或预测

    2024年02月13日
    浏览(43)
  • 【数据挖掘】时间序列教程【十】

    上一节中描述的状态空间模型作为观测方程的更一般的公式            和状态方程                    这里是一个p×1 向量是一个k×1 向量,  是一个p×k 矩阵,  是k×k 矩阵。我们可以想到的和          给定初始状态 和 ,预测方程为(类似于上面)      

    2024年02月15日
    浏览(51)
  • 【时间序列数据挖掘】ARIMA模型

    目录 0、前言 一、移动平均模型MA 二、自回归模型AR 三、自回归移动平均模型ARMA 四、自回归移动平均模型ARIMA 【总结】 传统时间序列分析模型: ARIMA模型是一个非常灵活的模型,对于时间序列的好多特征都能够进行描述,比如说平稳性特征,季节性特征,趋势性特征。 AR

    2024年02月07日
    浏览(47)
  • 数据挖掘——关联规则(Association Rule)Apriori算法和python代码实现

    关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。 用一些例子来说明一下: 当我们在超市进行购物时,超市中有琳琅满目的商品,在每一次购物结束之后,

    2024年02月04日
    浏览(54)
  • 【数据挖掘】时间序列模型处理指南(二)

            本文是一个系列文章的第二部分,本文将用股票数据进行时间序列分析为例,对时间分析的方法、过程,进行详细阐述。         在文章第一部分种:【数据挖掘】时间序列模型处理(一)_无水先生的博客-CSDN博客         我们将使用新德国基金(GF)的历

    2024年02月12日
    浏览(37)
  • 【数据挖掘】使用 LSTM 进行时间和序列预测

            每天,人类在执行诸如过马路之类的任务时都会做出被动预测,他们估计汽车的速度和与汽车的距离,或者通过猜测球的速度并相应地定位手来接球。这些技能是通过经验和实践获得的。然而,由于涉及众多变量,预测天气或经济等复杂现象可能很困难。在这种情

    2024年02月15日
    浏览(44)
  • 【数据挖掘】属性及其类型和数据的统计描述四分位数等详解(图文解释 超详细)

    觉得有帮助请点赞关注收藏~~~ 属性:(Attribute)是一个数据字段,表示数据对象的一个特征。在文献中,属性、维(Dimension)、特征(Feature)和变量(Variable)表示相同的含义,可以在不同场合互换使用。 属性类型:属性的取值范围决定了属性的类型 一类是定性描述的属性

    2024年02月04日
    浏览(42)
  • 基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

    收藏和点赞,您的关注是我创作的动力   随着科学技术的发展,人类进入了互联网时代,不仅数据量庞大,而且数据种类繁多,Python简单易学, 语法清晰,在数据操作方面有着一定优势,成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来作为开发语言,并

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包