精华内容
下载资源
问答
  • 灰色关联分析(GRA)的理论及应用(matlab和python)

    万次阅读 多人点赞 2018-08-26 21:48:11
    什么是灰色关联分析 灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。 ...

    什么是灰色关联分析

    灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。

    通常可以运用此方法来分析各个因素对于结果的影响程度,也可以运用此方法解决随时间变化的综合评价类问题,其核心是按照一定规则确立随时间变化的母序列,把各个评估对象随时间的变化作为子序列,求各个子序列与母序列的相关程度,依照相关性大小得出结论。


    灰色关联分析的步骤

    灰色关联分析的具体计算步骤如下:

    第一步:确定分析数列。

    确定反映系统行为特征的参考数列和影响系统行为的比较数列。反映系统行为特征的数据序列,称为参考数列。影响系统行为的因素组成的数据序列,称比较数列。

    (1)参考数列(又称母序列)为Y=Y(k)k=1,2...nY={Y(k) | k = 1,2...n}

    (2)比较数列(又称子序列)为Xi=Xi(k)k=1,2...n,i=1,2...mX_i={X_i(k) | k = 1,2...n},i = 1,2...m

    第二步,变量的无量纲化

    由于系统中各因素列中的数据可能因量纲不同,不便于比较或在比较时难以得到正确的结论。因此在进行灰色关联度分析时,一般都要进行数据的无量纲化处理。主要有一下两种方法
      
    (1)初值化处理:xi(k)=xi(k)xi(1),k=1,2...n;i=0,1,2...mx_i(k)=\frac{x_i(k)}{x_i(1)},k=1,2...n;i=0,1,2...m

    (2)均值化处理:xi(k)=xi(k)xiˉ,k=1,2...n;i=0,1,2...mx_i(k)=\frac{x_i(k)}{\bar{x_i}},k=1,2...n;i=0,1,2...m

    其中kk 对应时间段,ii 对应比较数列中的一行(即一个特征)

    第三步,计算关联系数

    与的关联系数

    i(k)=y(k)xi(k)\triangle_i(k)=|y(k)-x_i(k)|,则
      这里写图片描述

    ρ(0,)\rho\in(0,\infty),称为分辨系数。ρ越小,分辨力越大,一般ρ的取值区间为(0,1)(0,1),具体取值可视情况而定。当ρ0.5463\rho\le0.5463时,分辨力最好,通常取ρ=0.5ρ = 0.5

    第四步,计算关联度

    因为关联系数是比较数列与参考数列在各个时刻(即曲线中的各点)的关联程度值,所以它的数不止一个,而信息过于分散不便于进行整体性比较。因此有必要将各个时刻(即曲线中的各点)的关联系数集中为一个值,即求其平均值,作为比较数列与参考数列间关联程度的数量表示,关联度riri公式如下:

    ri=1nk=1nξi(k),k=1,2,Λ,nr_i=\frac{1}{n}\sum_{k=1}^n\xi_i(k),k=1,2,\Lambda,n

    第五步,关联度排序

    关联度按大小排序,如果r1<r2r1 < r2,则参考数列yy与比较数列x2x2更相似。

    在算出Xi(k)Xi(k)序列与Y(k)Y(k)序列的关联系数后,计算各类关联系数的平均值,平均值riri就称为Y(k)Y(k)Xi(k)Xi(k)的关联度。


    灰色关联分析的实例

    下表为某地区国内生产总值的统计数据(以百万元计),问该地区从2000年到2005年之间哪一种产业对GDP总量影响最大。

    年份 国内生产总值 第一产业 第二产业 第三产业
    2000 1988 386 839 763
    2001 2061 408 846 808
    2002 2335 422 960 953
    2003 2750 482 1258 1010
    2004 3356 511 1577 1268
    2005 3806 561 1893 1352

    步骤1:确立母序列

    在此需要分别将三种产业与国内生产总值比较计算其关联程度,故母序列为国内生产总值。若是解决综合评价问题时则母序列可能需要自己生成,通常选定每个指标或时间段中所有子序列中的最佳值组成的新序列为母序列。

    步骤2:无量纲化处理

    在此采用均值化法,即将各个序列每年的统计值与整条序列的均值作比值,可以得到如下结果:

    年份 国内生产总值 第一产业 第二产业 第三产业
    2000 0.7320 0.8361 0.6828 0.7439
    2001 0.7588 0.8838 0.6885 0.7878
    2002 0.8597 0.9141 0.7812 0.9292
    2003 1.0125 1.0440 1.0237 0.9847
    2004 1.2356 1.1069 1.2833 1.2363
    2005 1.4013 1.2152 1.5405 1.3182

    步骤3:计算每个子序列中各项参数与母序列对应参数的关联系数

    这里写图片描述

    其中ξi(k)ξ_i(k)表示第ii个子序列的第kk个参数与母序列(即0序列)的第kk个参数的关联系数,$\rho\ 为分辨系数取值范围在[0,1]$,其取值越小求得的关联系数之间的差异性越显著,在此取为0.5进行计算可得到如下结果:

    年份 S01(t) S02(t) S03(t)
    2000 0.4755 0.6591 0.8933
    2001 0.4299 0.5739 0.7681
    2002 0.6358 0.5465 0.5767
    2003 0.7527 0.8993 0.7758
    2004 0.4228 0.6661 1.0000
    2005 0.3358 0.4037 0.5322

    步骤4:计算关联度

    用公式ri=1nk=1nξi(k),k=1,2,Λ,nr_i=\frac{1}{n}\sum_{k=1}^n\xi_i(k),k=1,2,\Lambda,n, 可以得到r1=0.5088r2=0.6248r3=0.7577r1 = 0.5088,r2 = 0.6248,r3 = 0.7577,通过比较三个子序列与母序列的关联度可以得出结论:该地区在2000年到2005年期间的国内生产总值受到第三产业的影响最大。


    灰色关联分析matlab的实现

    clc;
    close;
    clear all;
    x=xlsread('data.xlsx');
    x=x(:,2:end)';
    column_num=size(x,2);
    index_num=size(x,1);
    
    % 1、数据均值化处理
    x_mean=mean(x,2);
    for i = 1:index_num
        x(i,:) = x(i,:)/x_mean(i,1);
    end
    % 2、提取参考队列和比较队列
    ck=x(1,:)
    cp=x(2:end,:)
    cp_index_num=size(cp,1);
    
    %比较队列与参考队列相减
    for j = 1:cp_index_num
        t(j,:)=cp(j,:)-ck;
    end
    %求最大差和最小差
    mmax=max(max(abs(t)))
    mmin=min(min(abs(t)))
    rho=0.5;
    %3、求关联系数
    ksi=((mmin+rho*mmax)./(abs(t)+rho*mmax))
    
    %4、求关联度
    ksi_column_num=size(ksi,2);
    r=sum(ksi,2)/ksi_column_num;
    
    %5、关联度排序,得到结果r3>r2>r1
    [rs,rind]=sort(r,'descend');
    

    运行结果:
    在这里插入图片描述


    灰色关联分析python的实现

    import pandas as pd
    x=pd.read_excel('data.xlsx')
    x=x.iloc[:,1:].T
    
    # 1、数据均值化处理
    x_mean=x.mean(axis=1)
    for i in range(x.index.size):
        x.iloc[i,:] = x.iloc[i,:]/x_mean[i]
    
    # 2、提取参考队列和比较队列
    ck=x.iloc[0,:]
    cp=x.iloc[1:,:]
    
    # 比较队列与参考队列相减
    t=pd.DataFrame()
    for j in range(cp.index.size):
        temp=pd.Series(cp.iloc[j,:]-ck)
        t=t.append(temp,ignore_index=True)
    
    #求最大差和最小差
    mmax=t.abs().max().max()
    mmin=t.abs().min().min()
    rho=0.5
    #3、求关联系数
    ksi=((mmin+rho*mmax)/(abs(t)+rho*mmax))
    
    
    #4、求关联度
    r=ksi.sum(axis=1)/ksi.columns.size
    
    #5、关联度排序,得到结果r3>r2>r1
    result=r.sort_values(ascending=False)
    

    展开全文
  • 白话机器学习算法理论+实战之关联规则

    千次阅读 多人点赞 2020-02-06 16:51:56
    1. 写在前面 如果想从事数据挖掘和数据分析的工作,掌握常用的机器学习算法是非常有必要...无监督算法:聚类,降维,关联规则等 为了详细的理解这些,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些...

    1. 写在前面

    如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法:

    • 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等
    • 无监督算法:聚类,降维,关联规则, PageRank等

    为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感觉话语里比较深奥,读起来没有耐心,并且理论到处有,而实战最重要, 所以在这里想用最浅显易懂的语言写一个白话机器学习算法理论+实战系列

    个人认为,理解算法背后的idea和使用,要比看懂它的数学推导更加重要。idea会让你有一个直观的感受,从而明白算法的合理性,数学推导只是将这种合理性用更加严谨的语言表达出来而已,打个比方,一个梨很甜,用数学的语言可以表述为糖分含量90%,但只有亲自咬一口,你才能真正感觉到这个梨有多甜,也才能真正理解数学上的90%的糖分究竟是怎么样的。如果算法是个梨,本文的首要目的就是先带领大家咬一口。另外还有下面几个目的:

    • 检验自己对算法的理解程度,对算法理论做一个小总结
    • 能开心的学习这些算法的核心思想, 找到学习这些算法的兴趣,为深入的学习这些算法打一个基础。
    • 每一节课的理论都会放一个实战案例,能够真正的做到学以致用,既可以锻炼编程能力,又可以加深算法理论的把握程度。
    • 也想把之前所有的笔记和参考放在一块,方便以后查看时的方便。

    学习算法的过程,获得的不应该只有算法理论,还应该有乐趣和解决实际问题的能力!

    今天是白话机器学习算法理论+实战的第二篇,关联规则挖掘的学习, 通过今天的学习,应该可以掌握关联规则挖掘算法apriori算法和FPgrowth的基本原理,并且会通过后面的小实战掌握算法的运用。

    大纲如下

    • 搞懂关联规则中的几个重要概念(频繁项集,支持度,置信度,提升度)
    • 关联规则算法之Apriori算法
    • 关联规则算法之FP-Growth算法
    • 项目实战(通过几个小例子说明如何使用mlxtend进行数据关联分析,然后再介绍一个工具包efficient_apriori,并基于这个工具包进行“导演是如何选择演员的”一个项目实战)

    OK, let’s go !

    2. 关联规则挖掘:我打算还是从啤酒和尿布开始谈起:

    为了避免后面的故事有点晦涩,先讲讲数据挖掘界的经典案例:啤酒和尿布的故事吧:

    在美国有婴儿的家庭中,一般是母亲在家中照看婴儿,年轻的父亲前去超市购买尿布。父亲在购买尿布的同时,往往会顺便为自己购买啤酒,这样就会出现啤酒与尿布这两件看上去不相干的商品经常会出现在同一个购物篮的现象。如果这个年轻的父亲在卖场只能买到两件商品之一,则他很有可能会放弃购物而到另一家商店,直到可以一次同时买到啤酒与尿布为止。沃尔玛发现了这一独特的现象,开始在卖场尝试将啤酒与尿布摆放在相同的区域,让年轻的父亲可以同时找到这两件商品,并很快地完成购物;而沃尔玛超市也可以让这些客户一次购买两件商品、而不是一件,从而获得了很好的商品销售收入,这就是“啤酒与尿布”故事。

    看完这个故事的感想是啥? 是不是很奇怪啊? 啤酒和尿布这两个听起来完全不相关的东西,竟然能够产生关联,并且通过挖掘两个其中的关系,可以使得销售更好,这背后起作用的就是关联规则的挖掘

    只要掌握了这项技能,你不仅可以根据超市里的客户商品明细表,挖掘出哪些商品放在一起可以增大销售,还可以分析出银行理财产品的交叉预售,每个手机用户的APP之间的关联,还可以自己爬取电影数据,分析关联,得到导演喜欢用哪些演员,以及哪个演员常和哪个演员经常在一块拍戏等(后面的实战里面都有涉及,这叫做一通百通)

    哈哈,是不是开始有诱惑力了呢? 但需要一些知识作为铺垫,比如,到底什么是关联规则呢?

    • 关联规则这个概念,最早是由 Agrawal 等人在 1993 年提出的。
    • 关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。

    但是在学习具体算法之前,先搞懂几个概念,因为这些算法选关联规则时候,都是先依赖着这些标准。

    搞懂关联规则中的几个概念

    为了白话一点,还是通过例子来介绍吧,看一个超市里面购物的例子:
    在这里插入图片描述

    2.1 频繁项集

    频繁项集是指那些经常出现在一起的物品,例如上图的{啤酒、尿布、牛奶},从上面的数据集中也可以找到尿布->啤酒的关联规则,这意味着有人买了尿布,那很有可能他也会购买啤酒。那如何定义和表示频繁项集和关联规则呢?这里引入支持度和可信度(置信度)。

    2.2 支持度

    支持度是个百分比,它指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。

    比如上面的例子里面,我们看到“牛奶”出现了4次,那么5笔订单中,“牛奶”的支持度就是4/5=0.8。

    同理, 我们看到"牛奶+面包"出现了3次,那么这5笔订单里面"牛奶+面包" 的支持度就是3/5 = 0.6

    2.3 置信度

    它指的就是当你购买了商品 A的条件下,会有多大的概率购买商品 B,这其实是一个条件概率。

    • 置信度(牛奶→啤酒)=2/4=0.5,代表如果你购买了牛奶,会有0.5的概率会购买啤酒。
    • 置信度(啤酒→牛奶)=2/3=0.67,代表如果你购买了啤酒,会有0.67的概率会购买。

    在上面这个例子中:我们看到在4次购买了牛奶的情况下,有2次购买了啤酒,所以(牛奶 -> 啤酒)的置信度就是2/4 = 0.5。

    同理, 3 次购买啤酒的情况下,有 2 次购买了牛奶,所以置信度(啤酒→牛奶)=0.67。

    2.3 提升度

    我们在做商品推荐的时候,重点考虑的是提升度,因为提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度

    还是看上面的例子,如果我们单纯看置信度 (可乐→尿布)=1,也就是说可乐出现的时候,用户都会购买尿布,那么当用户购买可乐的时候,我们就需要推荐尿布么?

    实际上,就算用户不购买可乐,也会直接购买尿布的,所以用户是否购买可乐,对尿布的提升作用并不大。(也就是说,没有可乐出现的地方,用户也会买尿布,或者说不要根据冷门物品去推荐热门物品)

    我们可以用下面的公式来计算商品 A 对商品 B 的提升度:

    提升度 (A→B)= 置信度 (A→B) / 支持度 (B)

    这个公式是用来衡量 A 出现的情况下,是否会对 B 出现的概率有所提升。

    所以提升度有三种可能:

    • 提升度 (A→B)>1:代表有提升;
    • 提升度 (A→B)=1:代表有没有提升,也没有下降;
    • 提升度 (A→B)<1:代表有下降。

    关于关联规则挖掘,上面的几个概念也比较关键了,基于这几个关键,下面才有了几个挖掘算法,比较著名的也就是Apriori算法和FP—Growth算法了。下面具体看看。

    3. Apriori的工作原理

    明白了关联规则中支持度、置信度和提升度这几个重要概念,我们来看下 Apriori 算法是如何工作的。

    Apriori 算法其实就是查找频繁项集 (frequent itemset) 的过程。而频繁项集的定义,需要最小支持度,大于等于最小支持度的项集就是频繁项集。项集这个概念,英文叫做 itemset,它可以是单个的商品,也可以是商品的组合。还是用例子来说明一下怎么算:

    我们把上面案例中的商品用 ID 来代表,牛奶、面包、尿布、可乐、啤酒、鸡蛋的商品 ID 分别设置为 1-6,上面的数据表可以变为:
    在这里插入图片描述

    假设我随机指定最小支持度是 50%,也就是 0.5。看下Apriori算法是怎么运算的。

    首先,我们先计算单个商品的支持度,也就是得到 K=1 项的支持度:
    在这里插入图片描述
    因为最小支持度是 0.5,所以你能看到商品 4、6 是不符合最小支持度的,不属于频繁项集,于是经过筛选商品的频繁项集就变成:
    在这里插入图片描述
    在这个基础上,我们将商品两两组合,得到 k=2 项的支持度:
    在这里插入图片描述
    我们再筛掉小于最小值支持度的商品组合,可以得到:
    在这里插入图片描述
    我们再将商品进行 K=3 项的商品组合,可以得到:
    在这里插入图片描述
    根据先验性质频繁项集的所有非空子集也一定是频繁的 ,所以,这里的2, 3, 5的二项非空子集为{2,3},{2,5},{3,5}, 只有{2,3}是频繁的, 1,2,5也是同理, 所以根据我们的先验性质, 我们就可以排除掉后两个, 当然这里根据最小值支持度也可以筛掉小于最小值支持度的商品组合,可以得到:
    在这里插入图片描述

    通过上面这个过程,我们可以得到 K=3 项的频繁项集{1,2,3},也就是{牛奶、面包、尿布}的组合。

    上面模拟了一遍整个 Apriori 算法的流程,下面总结下 Apriori 算法的递归流程:

    1. K=1,计算 K 项集的支持度;
    2. 筛选掉小于最小支持度的项集;
    3. 如果项集为空,则对应 K-1 项集的结果为最终结果。
      否则 K=K+1,重复 1-3 步。

    但是Apriori 在计算的过程中有以下几个缺点:

    • 可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了;
    • 每次计算都需要重新扫描数据集,来计算每个项集的支持度。

    所以 Apriori 算法会浪费很多计算空间和计算时间,为此人们提出了 FP-Growth 算法,它的特点是:

    • 创建了一棵 FP 树来存储频繁项集。在创建前对不满足最小支持度的项进行删除,减少了存储空间。我稍后会讲解如何构造一棵 FP 树;
    • 整个生成过程只遍历数据集 2 次,大大减少了计算量。

    下面来看看FP-Growth算法。

    四、Apriori的改进算法:FP-Growth算法

    频繁项集挖掘分为构建 FP 树,和从 FP 树中挖掘频繁项集两步。

    1. 构建 FP 树
      构建 FP 树时,首先统计数据集中各个元素出现的频数,将频数小于最小支持度的元素删除,然后将数据集中的各条记录按出现频数排序,剩下的这些元素称为频繁项;
      接着,用更新后的数据集中的每条记录构建 FP 树,同时更新头指针表。头指针表包含所有频繁项及它们的频数,还有每个频繁项指向下一个相同元素的指针,该指针主要在挖掘 FP 树时使用。
      下面看看例子:
      统计商品的支持度,去掉不频繁的项:
      在这里插入图片描述
      然后排序:
      在这里插入图片描述

    下面开始构建FP树的详细过程:

    • 扫描编号1:
      在这里插入图片描述
    • 扫描编号2

    在这里插入图片描述

    • 扫描编号3
      在这里插入图片描述
    • 扫描编号4
      在这里插入图片描述
    • 扫描编号5
      在这里插入图片描述
      上面就是完整的FP建树过程。最终版如下:
      在这里插入图片描述
    1. 通过FP树挖掘频繁项集
      到这里,我们就得到了一个存储频繁项集的 FP 树,以及一个项头表。我们可以通过项头表来挖掘出每个频繁项集。

      具体的操作会用到一个概念,叫“条件模式基”,它指的是以要挖掘的节点为叶子节点,自底向上求出 FP 子树,然后将 FP 子树的祖先节点设置为叶子节点之和。

      我以“啤酒”的节点为例,从 FP 树中可以得到一棵 FP 子树,将祖先节点的支持度记为叶子节点之和,得到:
      在这里插入图片描述

    你能看出来,相比于原来的 FP 树,尿布和牛奶的频繁项集数减少了。这是因为我们求得的是以“啤酒”为节点的 FP 子树,也就是说,在频繁项集中一定要含有“啤酒”这个项。你可以再看下原始的数据,其中订单 1{牛奶、面包、尿布}和订单 5{牛奶、面包、尿布、可乐}并不存在“啤酒”这个项,所以针对订单 1,尿布→牛奶→面包这个项集就会从 FP 树中去掉,针对订单 5 也包括了尿布→牛奶→面包这个项集也会从 FP 树中去掉,所以你能看到以“啤酒”为节点的 FP 子树,尿布、牛奶、面包项集上的计数比原来少了 2。

    条件模式基不包括“啤酒”节点,而且祖先节点如果小于最小支持度就会被剪枝,所以“啤酒”的条件模式基为空。同理,我们可以求得“面包”的条件模式基为:
    在这里插入图片描述
    所以可以求得面包的频繁项集为{尿布,面包},{尿布,牛奶,面包}。同样,我们还可以求得牛奶,尿布的频繁项集,这里就不再计算展示。

    这就是FPGrowth的工作原理了。

    五、项目实战前的热身

    这里是项目实战前的热身,在这里主要说一下如何通过工具包使用Apriori算法进行购物篮的分析(调用Apriori算法的库有两个,这里都分别使用一下,并说一下区别),然后把购物篮分析的这个思想迁移到超市订单上以及银行理财产品的交叉预售和APP的关联挖掘上。这些任务基本上相似。

    5.1 购物篮的商品分析

    首先构造数据集:

    data = [['牛奶','面包','尿布'],
               ['可乐','面包', '尿布', '啤酒'],
               ['牛奶','尿布', '啤酒', '鸡蛋'],
               ['面包', '牛奶', '尿布', '啤酒'],
               ['面包', '牛奶', '尿布', '可乐']]
    

    实现Apriori算法的,好多方式,这里介绍两种:

    1. 利用mlxtend包里面的Apriori算法进行数据关联分析
      如果是使用这个包的话, apriori和association_rules一块使用的,并且这个对处理的数据的格式又要求(必须是宽表的格式)
      先导入如下:
    import pandas as pd
    
    from mlxtend.frequent_patterns import apriori, association_rules
    from mlxtend.preprocessing import TransactionEncoder
    

    TransactionEncoder是进行数据转换中的,需要先将上面的data数据转成宽表的形式,何谓宽表,下面的这种:

    """数据转换"""
    transEn = TransactionEncoder()
    oht_ary = transEn.fit_transform(data)
    new_data = pd.DataFrame(oht_ary, columns=transEn.columns_)
    new_data
    

    数据就变成了下面的这个样子,所谓宽表,就是把所有的商品都放在列上,每一条购买记录,如果买了该商品,相应的地方就是1,否则就是0.
    在这里插入图片描述
    只有上面这样的数据,apriori才能处理,下面就很简单了。两步搞定:

    • 第一步:计算频繁项集,在这里可以定义最小支持度进行筛选频繁项集:
    """计算频繁项集"""
    frequent_itemset = apriori(new_data, min_support=0.5, use_colnames=True)
    frequent_itemset
    

    结果如下:
    在这里插入图片描述

    • 第二步:挖取关联规则, 这里的准则部分可以使用置信度(confidence),或者是提升度(lift)
    rules = association_rules(frequent_itemset, metric='confidence', min_threshold=1)
    rules
    

    在这里插入图片描述
    这里就挖掘出了关联规则{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}。

    下面小总一下这种方式:

    这种方式一般会用三个函数:

    • TransactionEncoder: 需要把数据转成宽表的形式
    • apriori(): 这里面需要指定最小支持度
    • association_rules(): 这里面指定筛选准则(置信度或者提升度或者支持度都可以)

    优点:最后显示的关联规则中,支持度,置信度,提升度等信息非常详细,一目了然。
    缺点:数据有特殊的规则要求,处理起来比较麻烦,并且用关联规则那块两个函数分开,用起来麻烦一些。

    1. efficient-apriori工具包
      这个包使用起来简单一些,只需要一行代码就可同时把频繁项集合关联规则找出来,并且数据不用特殊的处理。
    itemsets, rules = apriori(data, min_support, min_confidence)
    

    其中 data 是我们要提供的数据集,它是一个 list 数组类型。min_support 参数为最小支持度,在 efficient-apriori 工具包中用 0 到 1 的数值代表百分比,比如 0.5 代表最小支持度为 50%。min_confidence 是最小置信度,数值也代表百分比,比如 1 代表 100%。

    下面用这个包实现以下:

    from efficient_apriori import apriori
    # 设置数据集
    data = [('牛奶','面包','尿布'),
               ('可乐','面包', '尿布', '啤酒'),
               ('牛奶','尿布', '啤酒', '鸡蛋'),
               ('面包', '牛奶', '尿布', '啤酒'),
               ('面包', '牛奶', '尿布', '可乐')]
    # 挖掘频繁项集和频繁规则
    itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)
    print(itemsets)
    print(rules)
    

    结果如下(和上面产生的关联规则一样):
    在这里插入图片描述
    这个的优点是使用起来简单,并且efficient-apriori 工具包把每一条数据集里的项式都放到了一个集合中进行运算,并没有考虑它们之间的先后顺序。因为实际情况下,同一个购物篮中的物品也不需要考虑购买的先后顺序。
    而其他的 Apriori 算法可能会因为考虑了先后顺序,出现计算频繁项集结果不对的情况。所以这里采用的是 efficient-apriori 这个工具包。

    5.2 思想迁移以下,完成其他的例子

    上面的这个关联规则方式可以迁移以下,完成许多其他的任务,比如超市中的真实订单数据,银行理财产品交叉预售,手机APP之间的关联等。 怎么迁移一下呢? 主要是数据的处理方式: 如何把普通的数据转成宽表的形式

    5.2.1 超市订单的真实数据

    超市订单的数据data一般长这样:
    在这里插入图片描述
    这种数据的话,需要转成宽表,但是再转宽表之前,需要先分类汇总一下:下面的一行代码

    new_data = data.groupby(['订单号', '购买商品'])['数量'].sum().unstack().reset_index().fillna(0).set_index('订单号')
    new_data
    

    在这里插入图片描述
    下面再把数值映射一下,就成了宽表的形式:

    def encode_unit(x):
        if x <= 0:
            return 0
        if x >=1 :
            return 1
    
    new_data = new_data.applymap(encode_unit)
    new_data
    

    在这里插入图片描述
    这就是宽表的形式了,后面和购物篮分析的一样了,计算频繁项集,挖掘关联规则:

    frequent_itemset = apriori(new_data, min_support=0.5, use_colnames=True)
    rules = association_rules(frequent_itemset, metric='confidence', min_threshold=1)
    

    5.2.2 银行理财产品交叉预售

    bank数据长这样:
    在这里插入图片描述
    其实和上面的那个差不多,也是先分类汇总 -> 转成宽表的形式 -> 挖掘

    bankset = bank.groupby(['CSR_ID', 'FIN_PROD']).size().unstack().reset_index().set_index('CSR_ID').fillna(0)
    bank_data = bankset.applymap(encode_unit)  # 这个函数见上面
    bank_data
    

    最后成这个样子,再和上面一样的分析方式
    在这里插入图片描述

    5.2.3 手机APP之间的关联

    APP数据长这样:
    在这里插入图片描述
    看了这个是不是懂了迁移的方式了,先根据设备识别号,APP名称汇总,然后转成宽表的形式,然后进行挖掘。

    app_new = app.groupby(['设备识别号', 'APP名称']).size().unstack().fillna(0)
    app_data = app_new.applymap(encode_unit)
    

    在这里插入图片描述

    六、项目实战 - 导演是如何选择演员的

    这个是通过Apriori算法进行关联规则挖掘,分析出导演一般喜欢哪些演员,哪个演员一般和哪个演员在一块演电影。

    这里用的导演是宁浩(你也可以用别的), 使用的数据集的格式如下:(前面是宁浩导演的电影的名称,后面是里面的演员名称。)
    在这里插入图片描述
    关于这个数据,需要使用爬虫技术,去https://movie.douban.com搜索框中输入导演姓名,比如“宁浩”。
    在这里插入图片描述
    关于爬虫技术的编写,这里不多说,之前写过一个Python爬虫快速入门,完全可以解决这里的数据爬取问题。下面只给出代码:

    """下载某个导演的电影数据集"""
    def dowloaddata(director):
    
        # 浏览器模拟
        driver = webdriver.Chrome('C:/Users/ZhongqiangWu/AppData/Local/Google/Chrome/Application/chromedriver')
           
         # 写入csv文件
        file_name = './' + director + '.csv'
        out = open(file_name,'w', newline='', encoding='utf-8-sig')
        csv_write = csv.writer(out, dialect='excel')
        flags = []
        """下载某个指定页面的数据"""
        def download(request_url):
    
            driver.get(request_url)
            time.sleep(1)
    
            html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
            html = etree.HTML(html)
    
            # 设置电影名称,导演演员的XPATH
            movie_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']") 
            name_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']") # 获取返回的数据个数
    
            # 获取返回的数据个数
            num = len(movie_lists)
            if num > 15:   # 第一页会有16条数据, 第一条是导演的介绍
                # 默认第一个不是,所以需要去掉
                movie_lists = movie_lists[1:]
                name_lists = name_lists[1:]
    
            for (movie, name_list) in zip(movie_lists, name_lists):
                # 会存在数据为空的情况
                if name_list.text is None:
                    continue
                print(name_list.text)
                names = name_list.text.split('/')
    
                # 判断导演是否为指定的director
                if names[0].strip() == director and movie.text not in flags:
                    # 将第一个字段设置为电影名称
                    names[0] = movie.text
                    flags.append(movie.text)
                    csv_write.writerow(names)
    
            if num >=14:   # 有可能一页会有14个电影
                # 继续下一页
                return True
            else:
                # 没有下一页
                return False
        
        # 开始的ID为0, 每页增加15个
        base_url = 'https://movie.douban.com/subject_search?search_text='+director+'&cat=1002&start='
        start = 0
        while start < 10000:  # 最多抽取10000部电影
            request_url = base_url + str(start)
    
            # 下载数据,并返回是否有下一页
            flag = download(request_url)
            if flag:
                start = start + 15
            else:
                break
        out.close()
        print('finished')
    
    """调用上面的函数"""
    directorname = '宁浩'
    dowloaddata(directorname)
    

    下面进行关联规则挖掘,用第二种方式:

    director = '宁浩'
    file_name = './'+director+'.csv'
    lists = csv.reader(open(file_name, 'r', encoding='utf-8-sig'))
    
    # 数据加载
    data = []
    for names in lists:
        name_new = []
        for name in names:
            # 去掉演员数据中的空格
            name_new.append(name.strip())
        data.append(name_new[1:])
    
    # 挖掘频繁项集和关联规则
    itemsets, rules = apriori(data, min_support=0.3,  min_confidence=0.8)
    print(itemsets)
    print(rules)
    

    结果如下:
    在这里插入图片描述
    你能看出来,宁浩导演喜欢用徐峥和黄渤,并且有徐峥的情况下,一般都会用黄渤。你也可以用上面的代码来挖掘下其他导演选择演员的规律。

    六、总结

    今天用了一天的时间,学习了一下关联规则挖掘,这里的知识浅层的不是太多,上面的这些足够用,但是只能够入门的,apriori和FPgrowth的原理希望能理解。 如果想深层次的学习这块,请查阅其他资料吧。关联规则可以用到推荐系统的相关方向。

    最后就是感谢一下陈旸老师,听了他的《数据分析实战45讲》之后,感觉不仅让之前学习的算法理论变得更加的真实,并且还能够活学活用,还能get到认知和思维,哈哈,推荐。

    参考资料:

    什么,还没看够? 哈哈,可以看看其他的系列,也同样有趣又能学习到知识

    展开全文
  • 外键 、操作关联


    外键

    在实际的项目开发中,一个健壮的数据库一定有很好的参照完整性。为了保证多个表之间能够建立正确的连接关系,因此引入外键的概念。


    什么是外键

    外键是指引用另一个表的一列或多列,被引用的列应该具有主键约束或唯一性约束外键用于建立和加强两个表数据之间的连接,接下来我们来通过两张表来讲解什么是外键。

    首先创建两个表,一个班级表(grade)和一个学生表(student),具体语句如下:

    CREATE DATABASE test;
    
    use test;
    
    CREATE TABLE grade(id int(4) NOT NULL PRIMARY KEY,
                      name varchar(36));
    
    CREATE TABLE student(sid int(4) NOT NULL PRIMARY KEY,
                      sname varchar(36),
                      gid int(4) NOT NULL );
    

    学生表(student)中的 gid 是学生所在的班级 id ,是引入的班级表(grade)中的主键id,那么gid就可以作为表student的外键。

    被引用的表,即班级表(grade)是主表引用外键的表,即学生表(student)是从表,两个表是主从关系。表 student 用 gid 可以连接表grade中的信息,从而建立了两个数据表之间的连接。

    引入外键后,外键列只能插入参照列的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性。


    为表添加外键约束

    我们已经知道了什么是外键,想要真正连接两个表的数据,就需要为表添加外键约束。为表添加外键约束的语法格式如下:

    alter table 表名 add constraint FK_ID
    foreign key(外键字段名) REFERENCES 外表表名(主键字段名);
    

    接下来,为表studnet添加外键约束

    alter table student add constraint FK_ID
    foreign key(gid) REFERENCES grade(id);
    

    语句执行成功后,使用DESC来查看两张表:

    从查询结果可以看出,两张表都创建成功了,并且grade表的中id为主键student表中的gid为外键,但上表还不能看出两个表之间的关系。在MySQL中可以使用下述语句来查看表的详细结构:

    从查询结果可以看出,gid为student的外键,并且gid外键依赖于grade表的id主键,这样两张表就通过外键关联起来了

    为表添加外键约束时,有些地方需要注意:

    • 建立外键约束的表的存储引擎必须是InnoDB,不能是临时表。因为在MySQL中只有InnoDB类型的表才支持外键。
    • 定义外键名时,不能加引号,如constraint ‘FK_ID’ 或 constraint "FK_ID"都是错误的。

    另外MySQL可以在建立外键时添加 ON DELETE 或 ON UPDATE 子句告诉数据库,避免产生垃圾数据

    alter table 表名 add constraint FK_ID 
    foreign key(外键字段名) REFERENCES 外表表名(主键字段名);
    [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
    [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
    

    参数的具体含义如下:

    参数名称 功能描述
    CASCADE 删除包含与已删除键值有参照关系的所有记录
    SET NULL 删除包含与已删除键值有参照关系的所有记录,使用NULL值替换(不能用于设置NOT NULL的字段)
    NO ACTION 不进行任何操作
    RESTRICT 拒绝主表删除或修改外键关联列(在不定义上述两个子句时,这是默认设置,也是最安全的设置)

    删除外键约束

    在实际开发中,根据业务逻辑的需求,需要解除两个表之间的关联关系时,就需要删除外键约束。语法格式如下:

    alter table 表名 drop foreign key 外键名;
    

    接下来,将表student中的外键全部删除:

    alter table student drop foreign key FK_ID;
    

    执行后,我们再来查看表student的详细结构如下:

    从上述结果可以看出,表student的外键约束已经成功被删除。


    操作关联表

    在实际开发中,需要根据实体的内容设计数据表,实体间会有各种关联关系。所以根据实体设计的数据表之间也存在着各种关联关系,MySQL中数据表的关联关系有三种:

    • 多对一
    • 多对多
    • 一对一

    多对一

    多对一是数据表中最常见的一种关系。比如,员工与部门之间的关系,一个部门可以有多个员工,而一个员工不能属于多个部门,也就是说部门表中的一行在员工表中可以有许多匹配行,但员工表中的一行在部门表中只能有一个匹配行。

    通过之前的讲解,我们知道表之间的关系是通过外键建立的在多对一的表关系中,应该将外键建在多的一方,否则会造成数据的冗余


    多对多

    多对多也是数据表中的一种关系。比如学生与课程之间的关系,一个学生可以选择多门课程,当然一门课程也供多个学生选择,也就是说学生表中的一行在课程表中可以有许多匹配行,课程表中的一行在学生表中也有许多匹配行。

    通常情况下,为了实现这种关系需要定义一张中间表(称为连接表),该表会存在两个外键,分别参照课程表和学生表。在多对多的关系中,需要注意的是,连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键。


    —对一

    一对一关系在实际生活中比较常见,例如人与身份证之间就是一对一的关系,一个人对应一张身份证,一张身份证只能匹配一个人。那么,一对一关系的两张表如何建立外键?

    首先,要分清主从关系从表需要主表的存在才有意义,身份证需要人的存在才有意义。因此人为主表,身份证为从表。要在身份证表中建立外键。由实际经验可知,身份证中的外键必须是非空唯一的,因此通常会直接用从表(表身份证)中的主键作为外键。


    设计表

    题目描述:
    设计合理的表结构,模拟实现网上商城销售数据库。
    具有以下三个实体:商品、用户、订单

    第一步:分析实体

    商品product:

    • 商品ID(pid)
    • 商品名称(pname)
    • 商品价格(pprice)
    • 商品库存(pamount)

    用户user:

    • 用户ID(uid)
    • 用户名称(uname)
    • 用户密码(upwd)

    订单order:

    • 订单ID
    • 订单送货地址
    • 订单的商品信息

    第二步:找到实体和实体之间的关系

    • 用户和商品之间没有关系
    • 用户和订单之间是一对多的关系
    • 商品和订单之间是多对多的关系(要产生中间表)

    最终我们设计出的表结构如下:


    添加数据

    在实际开发中,最常见的关联关系就是多对一的关系。接下来,在表student中和表grade中添加外键约束来建立两个关系表的关联关系。

    alter table student add constraint 
    FK_ID foreign key(gid) REFERENCES grade(id);
    

    语句执行成功后,查看外键约束是否成功添加,查询结果如下:

    从查询结果可以看出,student表的外键约束已经成功添加。此时表student和表grade之间是多对一的关系因为外键列只能插入参照列已存在的值,所以我们先向主表grade添加数据:

    INSERT INTO grade(id, name) VALUES(1,'软件一班'),
    (2,'软件2班');
    

    在上述语句中,添加的主键id为1和2,由于student表的外键与grade表的主键关联,因此向student中添加数据时,gid的值只能是1或2,不能使用其他的值:

    INSERT INTO student(sid, sname, gid) VALUES(1,'王红',1),
    (2,'李强',1),
    (3,'赵四',2),
    (4,'郝娟',2);
    

    上述语句执行成功后,两个表之间的数据就具有关联性

    假如要查询软件一般有哪些学生,首先需要查询出班级名称为 “软件一班” 的id:

    SELECT id FROM grade WHERE name='软件一班';
    

    然后在student表中,查询 gid = 1 的学生,即为软件一班的学生:

    SELECT name FROM student WHERE gid=1;
    

    删除数据

    由于我们上述的的 grade 和 student 表之间具有关联关系,参照列被参照的值是不能被删除的,因此在删除"软件一班"时,一定要现在student表中删除该班级的所有学生,然后再删除班级。

    首先在student表中删除软件一班的所有学生:

    DELETE FROM student where gid=1;
    

    在grade表中删除软件一班:

    DELETE FROM grade where id=1;
    

    上述语句执行成功后,可以使用SELECT语句查询,结果如下:

    从查询结果可以看出,软件一班被成功删除了。这样就删除了关联表中的数据。

    接下来我们不修改从表student,直接删除表grade中的"软件二班":

    DELETE FROM grade where id=2;
    

    结果如下:
    在这里插入图片描述
    由上述运行结果可以看出,在两个具有关联关系的表中删除数据时,一定要先删除从表的数据,然后再删除主表中的数据,否则会报错。

    注意:在实际情况中,我们想要删除"软件一班",并不需要删除"软件一班"的学生,可以将表student中的软件一班学生的gid改为NULL,只要主表中该列没有被从表参照就可以删除

    在这里插入图片描述

    展开全文
  • 一、Case-Control 关联分析模型 (第一部分主要是在人类中) 卡方检验 举例 逻辑回归 逻辑混合模型 二、(动植物)数量性状关联分析模型 ...

    一、Case-Control 关联分析模型 (第一部分主要是在人类中)

    卡方检验

    举例



    逻辑回归

    逻辑混合模型

    二、(动植物)数量性状关联分析模型



    加性模型(GAM)
    当线性模型的种种条件不能满足时,就要考虑用平滑性模型来替代。平滑性模型可以对非线性关系建模,也被称之作加性模型。加性模型是一般加性模型(GAM)的一类,是具有高斯分布的一般加性模型。
    参考网址https://www.jianshu.com/p/54595077f142

    非连锁相关的影响:
    1,人工填补的位点
    2,群体结构,材料亚群分化会有一定的特异性位点,就可能导致结果跟群体相关,但是跟性状无关的位点被关联出来,需要提前在群体结构那部分就检测一下,如果存在群体结构的影响就要把群体结构当成协方差,把这种位点校正掉。
    但是会存在一些问题,比如你的性状刚好跟群体结构有关,如果去掉了就关联不到想要的位点了。
    3,亲缘关系,材料间的共祖关系也会导致非连锁相关。这样的话就要加上kinship作为随机效应(也就是误差项)。

    GLM

    GLM 模型里面只有固定效应,没有随机效应。
    Y ,表型
    SNP ,固定效应(就是我们要的基因型)这个是我们要检测的
    Q or PCs ,固定效应,去校正群体结构(二者选一,都可以,没有哪一个更好的说法) 这个是作为一个背景控制
    e ,残差,系统误差,测量误差

    MLM

    MLM 相较于 GLM 多了一个随机效应,Kinship 。

    MLMM

    QTN ,数量性状SNP,就是控制 QTL 的 SNP
    然后就是不停的进行迭代

    关联分析模型

    综述文章

    模型评价

    t-test 模型最差
    FarmCPU 模型最优,最贴合期望值(实线部分)。这个如果理解 QQ plot 的应该很容易理解这个图

    三、关联分析常用软件介绍

    plink

    这里一定要注意在平常动植物中,不使用plink 进行关联分析,可以在数据过滤处理的时候使用,但是在关联分析的时候不使用。一般是在人类 GWAS 才会使用 plink 进行关联分析。因为它没办法实现复杂模型,就是 MLM 那些。

    tassel

    在动植物中关联分析 tassel 使用的最多。
    上百万标记,几百个样本要几十G 上百G 内存。

    gapit

    主要是基于 R 软件

    emmax

    在 gapit 中可以实现

    gemma

    主要是多了一个 BSLMM(贝叶斯稀疏线性混合模型)

    其他软件

    比如现在常见的 GCTA(全基因组复杂性状分析)(主要用在人类中)等等其他的

    eQTL

    首先 QTL 是数量性状位点,比如身高是一个数量性状,其对应的控制基因的位点就是一个数量性状位点,而eQTL就是控制数量性状表达位点,即能控制数量性状基因(如身高基因)表达水平高低的那些基因的位点。
    数量性状基因座:控制数量性状的基因在基因组中的位置称数量性状基因座。常利用DNA分子标记技术对这些区域进行定位,与连续变化的数量性状表型有密切关系

    表达数量性状基因座(expression Quantitative Trait Loci,eQTL)是对上述概念的进一步深化,它指的是染色体上一些能特定调控mRNA和蛋白质表达水平的区域,其mRNA/蛋白质的表达水平量与数量性状成比例关系。eQTL可分为顺式作用eQTL和反式作用eQTL,顺式作用eQTL就是某个基因的eQTL定位到该基因所在的基因组区域,表明可能是该基因本身的差别引起的mRNA水平变化;反式作用eQTL是指某个基因的eQTL定位到其他基因组区域,表明其他基因的差别控制该基因mRNA水平的差异。

    eQTL就是把基因表达作为一种性状,研究遗传突变与基因表达的相关性: 就好像研究遗传突变与身高的相关性一样。
    早年可以通过同时做一个个体的SNP芯片和cDNA芯片, 在全基因组尺度研究突变与表达的相关性, 这种研究需要较多个体(例如1000个); 现在随着深度测序的出现,很多人开始用RNA-Seq在较少量个体中研究allele-specific expression,本质上就是eQTL。
    简单地说, 遗传学研究经常发现一些致病或易感突变, 这些突变怎样导致表型有时候不太直观; 所以用某个基因的差异表达作为过渡: 突变A-->B基因表达变化-->表型;

    这部分主要能掌握 tassel 就可以了 !!

    展开全文
  • 《机器学习实战》的最后的两个算法对我来说有点陌生,但学过后感觉蛮好玩,了解了一般的商品数据关联分析和搜索引擎智能提示的工作原理。先来看看关联分析(association analysis)吧,它又称关联规则学习...
  • 灰色系统理论及其应用 (一) :灰色系统概论、关联分析、与传统统计方法的比较 灰色系统理论及其应用 (二) :优势分析 灰色系统理论及其应用 (三) :生成数 灰色系统理论及其应用 (四) :灰色模型 GM 灰色系统...
  • 1. 引例——购物篮分析 ...策略二:强关联商品可以摆放在商品的两端,可能诱发顾客一路挑选其他商品,如硬件和软件。 2. 基本概念 频繁模式:频繁地出现在数据集中的模式(如项集、子序列、子结构)。
  • %y返回一个反映关联度的列向量 [a,b]=size(compare); if(nargin < 3 ) p =0.5; end if(nargin) rank =ones(a,1); end %参考数列,比较数列初始化 refer =refer/refer(1); for i =1:a if(rank(i) ==1) ...
  • 关联规则

    千次阅读 2017-11-13 20:15:55
    1. 算法简介关联规则最初提出...1994年,他们建立了项目集格空间理论,并依据上述两个定理,提出了著名的Apriori算法,至今Apriori仍然作为关联规则挖掘的经典算法被广泛讨论,以后诸多的研究人员对关联规则的挖掘问题
  • 一、主要结果 二、结果可视化与后续分析建议 置换检验(Permutation test) bonferroni threshold 和 FDR 看我之前的简书文章有解释 可视化 ...问题结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,506
精华内容 67,402
关键字:

关联理论下