精华内容
下载资源
问答
  • 判别分析

    2018-11-27 23:53:17
    简要介绍了判别分析中的DISCRIM过程、STEPDISC过程和CANDISC过程。

    根据已有的数据分类知识,建立一个判别准则,使其错判率最低,进而基于这个判别准则实现对未知样本所属类别进行判断。

    一般判别分析

    DISCRIM过程

    格式:

    proc discrim data=数据集名;
    class 变量; *此语句必需的,指定判别分析用的分类变量名;
    var 变量列表;*指定判别分析中使用的变量;
    run;
    

    注:
    1.proc过程选项:
    I.list:显示已知分类的数据集重分类的结果;
    ii.testlist:在结果窗口中显示对检验未知样本的所有分类结果;
    iii.testdata=待分析数据集名

    根据下面第一张表对经济发达水平的判别,对第二张表进行经济发达水平的判别分析。


    代码:

    data test1;        /*创建判别分析数据*/
    input area$ x1-x7 type;
    cards;
    西城区 1.96  18.85 19.34 198.49 89.11 59.88 2.34  2
    崇文区 0.94  6.49  10.98 61.95 32.9  39.3  1.1  1
    宣武区 0.33  12.04 58.8  586.48 458.73 167.29 6.78  2
    石景山区 1.01  16.14 74.26 483.57 209.81 250.16 3.91  2
    海淀区 201.26 69.5  125.01 640.38 373.06 448.59 36.5  3
    门头沟区 0.97  4.32  8.67  44.31 27.02 18.91 0.59  2
    房山区 4.17  1.42  43.88 293.31 163.33 305.44 0.03  2
    通州区 5.46  10.71 14.99 86.64 54.18 48.65 1.06  2
    顺义区 10.33 135.15 42.91 231.81 131.43 229.14 14.25 3
    昌平区 9.1  10.37 17.45 103.33 61.94 52.28 2.39  2
    大兴区 14.15 94.62 56.59 199.47 102.55 140.28 13.64 3
    平谷县 6.99  8.17  9.58  49.42 37.22 30.96 1.6  1
    怀柔县 10.59 17.84 21.48 80.42 47.75 75.95 4.25  1
    密云县 2.92  17.52 14.32 42.99 24.89 37.44 1.79  1
    ;
    run;
    data test2;        /*创建待判别分析数据*/
    input area$ x1-x7; 
    cards;
    东城区 2.46  42.33 24.6  178.96 77.67 87.86 6.39
    朝阳区 52.08 313.41 124.83 836.01 473.35 581.38 30.3
    丰台区 14.33 32.01 30.38 202.38 125.29 116.2 3.83
    延庆县 0.44  0.58  1.24  7.64  5.66  5.05 - 0.09
    ;
    run;
    proc discrim data=test1 testdata=test2 list testlist;
    class type;
    var x1-x7;
    run;
    

    结果:
    一些基本信息:
    以下是对已知分类的数据重分类后的结果:

    以下是对未知分类数据进行分类的结果:

    典型判别分析

    即通常的Fisher判别分析。

    CANDISC过程

    类似于主成分分析,通过数据降维,找一些变量,其为已存在变量的线性组合,使得依据这些变量可以很好地对数据进行分类判别。若要获得完整的判别分析结果,还需要将CANDISC过程的输出结果作为DISCRIM过程的输入,进行一般判别分析。
    格式:

    proc candisc data=数据集名 outstat=数据集名;
    class 变量;
    var 变量;
    run;
    

    注:
    1.proc过程的选项:
    a.outstat指定一个数据集,包含典型判别分析各种统计量;

    逐步判别分析

    思想类似于逐步回归分析

    STEPDISC过程

    用于在判别分析之前筛选出对数据的判别具有显著影响的变量,凭借这些结果(var var1 ... varm)再使用Discrim过程进行一般判别分析。
    格式:

    proc stepdisc data=数据集名;
    class 分类变量;
    var 指标变量; *逐步分析判别中使用的变量;
    

    注:
    1.proc stepdisc选项:
    a.method:指定筛选变量的方法,包括forward、backward、stepwise;

    根据下面第一张表对评价等级的判别,对第二张表进行经济发达水平的判别分析。


    代码:

    data test;      /*创建判别分析数据*/
    input x1-x5 type;
    cards;
    195 119 1815 43 28 3
    386 12 1908 202 32 1
    225 131 1516 115 36 2
    369 228 1537 150 21 2
    212 240 1851 174 38 2
    211 276 2088 248 38 2
    208 254 1483 205 32 2
    191 116 1552 299 25 3
    406 190 1773 288 37 1
    12 222 1735 27 30 4
    140 66 1931 114 34 3
    31 272 1664 69 28 4
    314 175 2009 85 39 2
    296 193 1636 183 21 2
    442 77 1241 24 31 2
    ;
    run;
    data test2;       /*创建待判别分析的数据集*/
    input x1-x5;
    cards;
    253 169 1910 175 25
    186 280 2277 213 37
    97 107 2048 89 26
    285 200 1914 227 33
    332 223 1630 224 21
    ;
    proc stepdisc data=test stepwise;
    class type;
    var x1-x5;
    run;
    proc discrim data=test testdata=test2 list testlist;
    class type;
    var x1 x2 x4;
    run; 
    

    结果:
    先进行stepdisc过程,结果显示x1、x2、x4选入的逐步回归模型:
    以下是根据判别变量x1、x2、x4对未知数据进行分类的结果:

    展开全文
  • 关于LDA可以移步Frank Tian:用线性回归的方式打开LDA​zhuanlan.zhihu.com那么让我们补充学习一下kernel Fisher判别分析是什么。这个Fisher,是个人:Sir Ronald Aylmer Fisher FRS (17 February 1890 – 29 July ...

    关于LDA可以移步

    Frank Tian:用线性回归的方式打开LDAzhuanlan.zhihu.com

    那么让我们补充学习一下kernel Fisher判别分析是什么。

    这个Fisher,是个人:

    Sir Ronald Aylmer Fisher FRS (17 February 1890 – 29 July 1962) was a British statistician and geneticist. For his work in statistics, he has been described as "a genius who almost single-handedly created the foundations for modern statistical science" and "the single most important figure in 20th century statistics". In genetics, his work used mathematics to combine Mendelian genetics and natural selection; this contributed to the revival of Darwinism in the early 20th-century revision of the theory of evolution known as the modern synthesis. For his contributions to biology, Fisher has been called "the greatest of Darwin’s successors".

    名字怪怪的。

    不过看这个介绍,这个Fisher还是蛮强的。

    然后kernel Fisher判别分析Kernel Fisher discriminant analysis自然是这个叫做Fisher提出来的判别分析方法,然后又用了核技巧,于是就叫kernel Fisher判别分析了。

    我在这里简单的介绍一下所谓的“核方法”和“核技巧”,但是具体推导和常见的“核”都不展开讲。


    首先,什么是“核”呢?

    我们先不看它的定义,单纯的思考一个问题:我们怎么将线性不可分的数据分开?

    我想只要是学习过机器学习的人都曾经思考过这个问题,毕竟线性模型作用有限,我们有理由相信大多数 分布都不是线性可分的。

    我们有两种基本思路:

    1. 改变模型,构造出一个非线性的模型,让模型有足够的复杂度将数据分开。
    2. 改变数据,将数据从线性不可分的形式转换为线性可分的形式。

    当年,马文明斯基一本《感知机》差点把联结主义写死了,就是因为线性不可分的问题。而前人们也想到了这两种解决方法。

    我们的核技巧就是根据第二种来的。

    我们来思考第二种方法到底该怎么操作。

    cee13c19e1b81153594181b971d63eda.png
    来自维基百科Kernel method词条

    看上图的左半部分,可以看出这是一个二分类,而两个类别的数据显然是线性不可分的。如何让它线性可分呢?

    右图给出了一种方法,即将他们投影到三维空间中,这样就实现了将线性不可分转变为线性可分。

    问题是,这个映射关系怎么找呢?映射后对应的特征空间应该是几维比较合适呢?

    这是相当头疼的问题。

    好在前辈们发现可以不显式的写出这个函数

    ,而是可以用两个不同的数据映射后的
    内积表示这个函数:

    这里的

    就是
    核函数了。使用核函数代替具体的
    的方法,也就被成为核技巧。

    值得一提的是,核技巧之所以被称为“技巧”,是因为选择合适的核函数某种意义上只一个绝活,往往要看工程师的经验。

    还有就是,为什么我们这里只需要内积呢?要知道核技巧正是因为假设了我们只需要内积才有效的较少了模型的复杂度,减小了我们的工作量。

    这是因为,很多模型中最后的表达式都有“向量内积“这一项,而除了内积之外有不单独要求样本的特征,例如支持向量机的分离超平面可以表示为:

    通过核技巧之间转化为:

    我们在下面的Kernel Fisher Discriminant Analysis也会看到这样的情况。


    Kernel Fisher Discriminant Analysis和Linear Discriminant Analysis大致相同,都是打算用超平面将数据投影在上面然后用投影分类。

    Kernel Fisher Discriminant Analysis使用了核技巧,让原本不能线性可分的数据转变为线性可分了。注意这个核技巧没有体现在超平面上,而是体现在数据上。

    在LDA中,我们要优化的目标为:

    而在KFD中,我们的目标变成了:

    是映射后数据的类间散度矩阵between-class covariance matrix ,
    是映射后数据的类内散度矩阵within-class covariance matrix。

    值得注意的是,在LDA中,给定了数据集,

    就已经确定下来了,优化过程只是让广义瑞利商最大的过程。而在KFDA中,如果我们可以确定下来
    映射函数
    就也可以确定下来,但是我们运用核函数的技巧,不显式的写出映射函数,所以我们需要进一步推导。

    展开后分别是:

    代表均值:

    到这里和LDA都还没有什么区别,接下来,我们的目标是把所有的

    都凑成
    的形式,然后用核函数替代。

    在LDA中,我们的目标是求出合适的

    ,在KFDA中我们的目标也是一样的,但是可以换一种表示形式:

    所以我们现在的目标是求出上面的

    ,当然其实和求出
    是等价的,因为
    都是已知的。

    重写:

    其中

    那么,现在我们可以重写

    其中

    现在,

    是已知的,我们下一阶段的目标是把
    表示为
    ,其中
    也是一个已知的矩阵(这里的已知使之核函数给定的情况下)

    接下来就是一大串推导:

    其中

    , 其中
    是一个单位矩阵,
    是一个每一个元素都为
    的矩阵,
    满足

    上面的推导过程比较跳跃,注意倒数第四行到倒数第三行

    变成了

    这是因为

    无关,对
    的求和之间变成了

    同时把下角标

    换成

    就可以合并后两项了。

    至此,我们就成功的把KFDA化简成了LDA的形式,之后只要拉格朗日乘数法就可以了。

    另外注意

    常常是奇异的,因此加上一个小的单位矩阵:


    参考:

    Kernel method-wikipedia

    Kernel Fisher discriminant analysis-wikipedia

    Benyamin Ghojogh, Fakhri Karray, Mark Crowley:"Fisher and Kernel Fisher Discriminant Analysis: Tutorial".2019

    展开全文
  • 线性判别分析(Fisher判别分析) Python编程 线性判别分析(Fisher判别分析) 线性判别分析(LDA)是一种经典的线性学习方法。 LDA的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的...
    
    
    
    

    线性判别分析(Fisher判别分析)

    线性判别分析(LDA)是一种经典的线性学习方法。
    LDA的思想非常朴素:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。

    “+”、“_” 分别代表正例和反例,椭圆表示数据簇的外轮廓,虚线表示投影,红色实心圆和实心三角形分别表示两类样本投影后的中心点。

    D={(xi,yi)}i=1mD = \left \{ \left ( x_{i} ,y_{i}\right ) \right \}_{i=1}^{m},yi={0,1}y_{i}=\in \left \{ 0,1 \right \},令XiX_{i}muimu _{i}SigmaiSigma i分别表示第i{0,1}i\in \left \{ 0,1 \right \}类示例的集合、均值向量、协方差矩阵。若将数据投影到直线ω\omega上,则两类样本的中心在直线上的投影分别为ωTμ0\omega ^{T}\mu _{0}ωTμ1\omega ^{T}\mu _{1};若将所有样本点都投影到直线上,则两类样本的协方差分别为ωTΣ0ω\omega ^{T}\Sigma _{0}\omegaωTΣ1ω\omega ^{T}\Sigma _{1}\omega由于直线是一维空间,因此均为实数。
    类内散度矩阵:
    Sω=Σ0+Σ1S_{\omega }= \Sigma _{0}+\Sigma _{1}
    =xX0(xμ0)(xμ0)T+sumxX1(xμ1)(xμ1)T\sum_{x\in X_{0}}^{}\left ( x-\mu _{0} \right )\left ( x-\mu _{0} \right )^{T}+sum_{x\in X_{1}}^{}\left ( x-\mu _{1} \right )\left ( x-\mu _{1} \right )^{T}
    类间散度矩阵:
    Sb=(μ0μ1)(μ0μ1)TS_{b}=\left ( \mu _{0}-\mu _{1} \right )\left ( \mu _{0}-\mu _{1} \right )^{T}
    最大化目标:
    J=ωTSbωωTSωωJ=\frac{\omega ^{T}S_{b}\omega }{\omega ^{T}S_{\omega }\omega}
    确定ω\omega
    ωTSωω=1\omega ^{T}S_{\omega }\omega=1
    J=ωTSbωωTSωωJ=\frac{\omega ^{T}S_{b}\omega }{\omega ^{T}S_{\omega }\omega}等价于
    minω\underset{\omega}{min} ωTSbω-\omega ^{T}S_{b}\omega
    s.t.s_{.}t_{.} ωTSωω=1\omega ^{T}S_{\omega }\omega=1
    由拉格朗日乘子法,上式等价于
    Sbω=λSωωS_{b}\omega=\lambda S_{\omega }\omega
    Sbω=λ(μ0μ1)S_{b}\omega =\lambda \left ( \mu _{0}-\mu _{1} \right )
    ω=Sω1(μ0μ1)\omega =S_{\omega }^{-1}\left ( \mu _{0}-\mu _{1} \right )

    Python编程

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt 
    import seaborn as sns
    # 读取数据
    path=r'Iris.csv'
    df = pd.read_csv(path, header=0)
    Iris1=df.values[0:50,0:4]
    Iris2=df.values[50:100,0:4]
    Iris3=df.values[100:150,0:4]
    # 类均值向量
    m1=np.mean(Iris1,axis=0)
    m2=np.mean(Iris2,axis=0)
    m3=np.mean(Iris3,axis=0)
    # 各类内离散度矩阵
    s1=np.zeros((4,4))
    s2=np.zeros((4,4))
    s3=np.zeros((4,4))
    for i in range(0,30,1):
        a=Iris1[i,:]-m1
        a=np.array([a])
        b=a.T
        s1=s1+np.dot(b,a)    
    for i in range(0,30,1):
        c=Iris2[i,:]-m2
        c=np.array([c])
        d=c.T
        s2=s2+np.dot(d,c) 
    for i in range(0,30,1):
        a=Iris3[i,:]-m3
        a=np.array([a])
        b=a.T
        s3=s3+np.dot(b,a) 
    # 总类内离散矩阵
    sw12=s1+s2
    sw13=s1+s3
    sw23=s2+s3
    a=np.array([m1-m2])
    sw12=np.array(sw12,dtype='float')
    sw13=np.array(sw13,dtype='float')
    sw23=np.array(sw23,dtype='float')
    # 转置矩阵
    a = np.array([m1-m2]).T
    b = np.array([m1-m3]).T
    c = np.array([m2-m3]).T
    # 投影方向
    w12=(np.dot(np.linalg.inv(sw12),a)).T
    w13=(np.dot(np.linalg.inv(sw13),b)).T
    w23=(np.dot(np.linalg.inv(sw23),c)).T
    # 判别函数以及阈值T
    T12=-0.5*(np.dot(np.dot((m1+m2),np.linalg.inv(sw12)),a))
    T13=-0.5*(np.dot(np.dot((m1+m3),np.linalg.inv(sw13)),b))
    T23=-0.5*(np.dot(np.dot((m2+m3),np.linalg.inv(sw23)),c))
    kind1=0
    kind2=0
    kind3=0
    newiris1=[]
    newiris2=[]
    newiris3=[]
    for i in range(30,49):
        x=Iris1[i,:]
        x=np.array([x])
        g12=np.dot(w12,x.T)+T12
        g13=np.dot(w13,x.T)+T13
        g23=np.dot(w23,x.T)+T23
        if g12>0 and g13>0:
            newiris1.extend(x)
            kind1=kind1+1
        elif g12<0 and g23>0:
            newiris2.extend(x)
        elif g13<0 and g23<0 :
            newiris3.extend(x)
    for i in range(30,49):
        x=Iris2[i,:]
        x=np.array([x])
        g12=np.dot(w12,x.T)+T12
        g13=np.dot(w13,x.T)+T13
        g23=np.dot(w23,x.T)+T23
        if g12>0 and g13>0:
            newiris1.extend(x)
        elif g12<0 and g23>0:
            newiris2.extend(x)
            kind2=kind2+1
        elif g13<0 and g23<0 :
            newiris3.extend(x)
    for i in range(30,49):
        x=Iris3[i,:]
        x=np.array([x])
        g12=np.dot(w12,x.T)+T12
        g13=np.dot(w13,x.T)+T13
        g23=np.dot(w23,x.T)+T23
        if g12>0 and g13>0:
            newiris1.extend(x)
        elif g12<0 and g23>0:     
            newiris2.extend(x)
        elif g13<0 and g23<0 :
            newiris3.extend(x)
            kind3=kind3+1
    correct=(kind1+kind2+kind3)/60
    print("样本类内离散度矩阵S1:",s1,'\n')
    print("样本类内离散度矩阵S2:",s2,'\n')
    print("样本类内离散度矩阵S3:",s3,'\n')
    print('-----------------------------------------------------------------------------------------------')
    print("总体类内离散度矩阵Sw12:",sw12,'\n')
    print("总体类内离散度矩阵Sw13:",sw13,'\n')
    print("总体类内离散度矩阵Sw23:",sw23,'\n')
    print('-----------------------------------------------------------------------------------------------')
    print('判断出来的综合正确率:',correct*100,'%')
    
    
    样本类内离散度矩阵S1: [[4.084080000000003 2.9814400000000005 0.5409999999999995
      0.4941599999999999]
     [2.9814400000000005 3.6879200000000028 -0.025000000000000428
      0.5628800000000002]
     [0.5409999999999995 -0.025000000000000428 1.0829999999999995 0.19]
     [0.4941599999999999 0.5628800000000002 0.19 0.30832000000000004]] 
    
    样本类内离散度矩阵S2: [[8.316120000000005 2.7365199999999987 5.568960000000003
      1.7302799999999998]
     [2.7365199999999987 3.09192 2.49916 1.3588799999999999]
     [5.568960000000003 2.49916 6.258680000000002 2.2232399999999997]
     [1.7302799999999998 1.3588799999999999 2.2232399999999997
      1.3543200000000004]] 
    
    样本类内离散度矩阵S3: [[14.328471470220745 3.1402832153269435 11.94600583090379
      1.3147563515201988]
     [3.1402832153269435 3.198721366097457 2.239650145772593
      1.2317617659308615]
     [11.94600583090379 2.239650145772593 11.600816326530618
      1.4958892128279884]
     [1.3147563515201988 1.2317617659308615 1.4958892128279884
      1.6810578925447726]] 
    
    -----------------------------------------------------------------------------------------------
    总体类内离散度矩阵Sw12: [[12.4002   5.71796  6.10996  2.22444]
     [ 5.71796  6.77984  2.47416  1.92176]
     [ 6.10996  2.47416  7.34168  2.41324]
     [ 2.22444  1.92176  2.41324  1.66264]] 
    
    总体类内离散度矩阵Sw13: [[18.41255147  6.12172322 12.48700583  1.80891635]
     [ 6.12172322  6.88664137  2.21465015  1.79464177]
     [12.48700583  2.21465015 12.68381633  1.68588921]
     [ 1.80891635  1.79464177  1.68588921  1.98937789]] 
    
    总体类内离散度矩阵Sw23: [[22.64459147  5.87680322 17.51496583  3.04503635]
     [ 5.87680322  6.29064137  4.73881015  2.59064177]
     [17.51496583  4.73881015 17.85949633  3.71912921]
     [ 3.04503635  2.59064177  3.71912921  3.03537789]] 
    
    -----------------------------------------------------------------------------------------------
    判断出来的综合正确率: 91.66666666666666 %
    

    参考文献

    周志华 《机器学习》
    http://bob0118.club/?p=266

    展开全文
  • 统计方法判别分析: 判别分析在已知研究对象分成若干类型并已取得各种类型的一批已知样品的观测数据在此基础上根据某些准则建立判别式然后对未知类型的样品进行判别分类 距离判别法首先根据已知分类的数据分别计算...
  • 判别分析包括可用于分类和降维的方法。线性判别分析(LDA)特别受欢迎,因为它既是分类器又是降维技术。二次判别分析(QDA)是LDA的变体,允许数据的非线性分离。最后,正则化判别分析(RDA)是LDA和QDA之间的折衷。...

    原文链接:http://tecdat.cn/?p=5689

     

    判别分析包括可用于分类和降维的方法。线性判别分析(LDA)特别受欢迎,因为它既是分类器又是降维技术。二次判别分析(QDA)是LDA的变体,允许数据的非线性分离。最后,正则化判别分析(RDA)是LDA和QDA之间的折衷。

    本文主要关注LDA,并探讨其在理论和实践中作为分类和可视化技术的用途。由于QDA和RDA是相关技术,我不久将描述它们的主要属性以及如何在R中使用它们。

    线性判别分析

    LDA是一种分类和降维技术,可以从两个角度进行解释。第一个是解释是概率性的,第二个是更多的程序解释,归功于费舍尔。第一种解释对于理解LDA的假设是有用的。第二种解释可以更好地理解LDA如何降低维数。

      

    Fisher的LDA优化标准

    Fisher的LDA优化标准规定组的质心应尽可能分散。这相当于找到一个线性组合ž= aŤX,使得aT相对于类内方差的类间方差最大化。 

     

    LDA模型的复杂性

    LDA的有效参数的数量可以通过以下方式导出。协方差矩阵不需要额外的参数,因为它已经由质心定义。由于我们需要估计K判别函数(以获得判定边界),这就产生了涉及p个元素的KK计算。因此,有效LDA参数的数量是Kp+K-1。 

    LDA摘要

    在这里,我总结了LDA的两个观点,并总结了该模型的主要特性。

    概率论

    LDA使用贝叶斯规则来确定观察样本属于k类的后验概率。由于LDA的正常假设,后验由多元高斯定义,其协方差矩阵假定对于所有类是相同的。新的点通过计算判别函数分类δk(后验概率的枚举器)并返回类k具有最大概率δk。判别变量可以通过类内和类间方差的特征分解来获得。

    费舍尔的观点

    根据Fisher,LDA可以理解为降维技术,其中每个连续变换是正交的并且相对于类内方差最大化类间方差。此过程将特征空间转换为具有K−1维度的投射空间。在对输入数据进行扩展之后,可以通过在考虑类先验的情况下确定投射空间中的最接近的质心来对新点进行分类。

    LDA的特性

    LDA具有以下属性:

    • LDA假设数据是高斯数据。更具体地说,它假定所有类共享相同的协方差矩阵。
    • LDA在K−1维子空间中找到线性决策边界。因此,如果自变量之间存在高阶相互作用,则不适合。
    • LDA非常适合于多类问题,但是当类分布不平衡时应该小心使用,因为根据观察到的计数来估计先验。因此,观察很少被分类为不常见的类别。
    • 与PCA类似,LDA可用作降维技术。请注意,LDA的转换本质上与PCA不同,因为LDA是一种考虑结果的监督方法。

    数据集

    为了举例说明线性判别分析,我们将使用语音识别数据集。该数据集对于展示判别分析很有用,因为它涉及五种不同的结果。

    library(RCurl)
    f <- getURL('phoneme.csv')
    df <- read.csv(textConnection(f), header=T)
    print(dim(df))
    ## [1] 4509  259

     

    为了以后评估模型,我们将每个样本分配到训练或测试集中:

    #logical vector: TRUE if entry belongs to train set, FALSE else
    train <- grepl("^train", df$speaker)
    # remove non-feature columns
    to.exclude <- c("row.names", "speaker""g")
    feature.df <- df[, !colnames(df) %<strong>in</strong>% to.exclude]
    test.set <- subset(feature.df, !train)
    train.set <- subset(feature.df, train)
    train.responses <- subset(df, train)$g
    test.responses <- subset(df, !train)$g

    在R中拟合LDA模型

    我们可以通过以下方式拟合LDA模型:

    library(MASS)
    lda.model <- lda(train.set, grouping = train.responses)

     

    LDA作为可视化技术

    我们可以通过在缩放数据上应用变换矩阵将训练数据转换为规范坐标。要获得与predict.lda函数返回的结果相同的结果,我们需要首先围绕加权平均数据居中:

    ## [1] TRUE

    我们可以使用前两个判别变量来可视化数据:

     

    绘制两个LDA维度中的数据显示三个集群:

    • 群集1(左)由aaao音素组成
    • 群集2(右下角)由dcliy音素组成
    • 群集3(右上角)由sh音素组成

    这表明两个维度​​不足以区分所有5个类别。然而,聚类表明可以非常好地区分彼此充分不同的音素。

    我们还可以使用plot.lda函数绘制训练数据到所有判别变量对的映射,其中dimen参数可用于指定所考虑的维数:

     

    为了可视化组的质心,我们可以创建自定义图:

     

    解释后验概率

    除了将数据转换为由分量x提供的判别变量之外,预测函数还给出后验概率,其可以用于分类器的进一步解释。例如:

    ## [1] "Posterior of predicted class 'sh' is: 1"
    ##        aa    ao   dcl    iy    sh
    ## aa  0.797 0.203 0.000 0.000 0.000
    ## ao  0.123 0.877 0.000 0.000 0.000
    ## dcl 0.000 0.000 0.985 0.014 0.002
    ## iy  0.000 0.000 0.001 0.999 0.000
    ## sh  0.000 0.000 0.000 0.000 1.000

    各个班级的后验表格表明该模型对音素aaao最不确定,这与我们对可视化的期望一致。

     

    LDA作为分类器

    如前所述,LDA的好处是我们可以选择用于分类的规范变量的数量。在这里,我们仍将通过使用多达四个规范变量进行分类来展示降级LDA的使用。

    ##   Rank Accuracy
    ## 1    1     0.51
    ## 2    2     0.71
    ## 3    3     0.86
    ## 4    4     0.92

    正如从变换空间的视觉探索所预期的那样,测试精度随着每个附加维度而增加。由于具有四维的LDA获得最大精度,我们将决定使用所有判别坐标进行分类。

    为了解释模型,我们可以可视化 分类器的性能:

     

    在图中,预期的音素以不同的颜色显示,而模型预测通过不同的符号显示。具有100%准确度的模型将为每种颜色分配单个符号。

    二次判别分析

    QDA是LDA的变体,其中针对每类观察估计单个协方差矩阵。如果事先知道个别类别表现出不同的协方差,则QDA特别有用。QDA的缺点是它不能用作降维技术。

    由于QDA估计每个类的协方差矩阵,因此它具有比LDA更多的有效参数。我们可以通过以下方式得出参数的数量。

    因此,QDA参数的有效数量是ķ- 1 + K.p + K.p (p + 1 )2K−1+Kp+Kp(p+1)2。

    由于QDA参数的数量在pp是二次的,因此当特征空间很大时,应小心使用QDA。

    QDA在R

    我们可以通过以下方式执行QDA:

    的QDA和LDA对象之间的主要区别是,QDA具有p×pp×p的变换矩阵对于每个类k∈{1,…,K}k∈{1,…,K}。这些矩阵确保组内协方差矩阵是球形的,但不会导致子空间减小。因此,QDA不能用作可视化技术。

    让我们确定QDA在音素数据集上是否优于LDA:

    ## [1] "Accuracy of QDA is: 0.84"
    
    QDA的准确度略低于全级LDA的准确度。这可能表明共同协方差的假设适合于该数据集。

     

    规范的判别分析

    由于RDA是一种正则化技术,因此当存在许多潜在相关的特征时。现在让我们评估音素数据集上的RDA。

     

    R中的RDA

     

    rda.preds <- predict(rda.model, t(train.set), train.responses, t(test.set))
    
    # determine performance for each alpha
    rda.perf <- vector(, dim(rda.preds)[1])
    for(i in seq(dim(rda.preds)[1])) {
        <span style="color:#888888"># performance for each gamma</span>
        res <- apply(rda.preds[i,,], 1, function(x) length(which(x == as.numeric(test.responses))) / length(test.responses))
        rda.perf[[i]] <- res
    }
    rda.perf <- do.call(rbind, rda.perf)
    rownames(rda.perf) <- alphas

    结论

    判别分析对于多类问题特别有用。LDA非常易于理解,因为它可以减少维数。使用QDA,可以建模非线性关系。RDA是一种正则化判别分析技术,对大量特征特别有用。

     

     如果您有任何疑问,请在下面发表评论。 

    展开全文
  • 通用线性判别分析

    2021-03-16 02:53:28
    通用线性判别分析
  • 稀疏指数判别分析

    2021-03-06 19:10:37
    稀疏指数判别分析
  • 线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的线性学习方法,在二分类问题.上因为最早由[Fisher, 1936]提出,亦称“Fisher判别分析”。 LDA的基本思想:给定训练样例集,设法将样例投影到一条直线上...
  • 一、定义判别分析又称“分辨法”,是在分类确定的条件下,根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法。二、判别分析的一般形式y=a1x1+a2x2+……+anxn(a1为系数,Xn为变量)。事先非常...
  • 1.Discriminant Analysis判别分析主对话框 如图 1-1 所示图 1-1 Discriminant Analysis 主对话框(1)选择分类变量及其范围在主对话框中左面的矩形框中选择表明已知的观测量所属类别的变量(一定是离散变量),按上面的...
  • Note: 将 Fisher 判别分析放入非参这一部分框架来讲,原因是在Fisher判别分析里同样没有假设数据的分布形式,而是以基于投影后的数据形态的Fisher指标作为优化线性模型的依据。 1. Background and Motivation 在统计...
  • 在《判别分析概述》中,我们提到Fisher判别一般用于指标为定量资料的两类判别,Bayes判别多用于指标为定量资料的多类判别;最大似然判别和Bayes公式判别适用于指标为定性资料的两类或多类判别。本期我们要学习的是...
  • 1.Discriminant Analysis判别分析主对话框如图 1-1 所示图 1-1 Discriminant Analysis 主对话框(1)选择分类变量及其范围在主对话框中左面的矩形框中选择表明已知的观测量所属类别的变量(一定是离散变量),按上面的...
  • 判别分析包括可用于分类和降维的方法。线性判别分析(LDA)特别受欢迎,因为它既是分类器又是降维技术。二次判别分析(QDA)是LDA的变体,允许数据的非线性分离。最后,正则化判别分析(RDA)是LDA和QDA之间的折衷。...
  • spss进行判别分析步骤_spss判别分析结果解释_spss判别分析案例详解 1.Discriminant Analysis判别分析主对话框 如图 1-1 所示 图 1-1 Discriminant Analysis 主对话框 (1)选择分类变量及其范围 在主对话框中...
  • 判别分析数据

    2018-05-10 09:15:39
    判别分析数据可用于进行教育技术学专业学生进行教育信息处理课程的实验。
  • 原标题:R语言线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)原文链接:http://tecdat.cn/?p=5689判别分析包括可用于分类和降维的方法。线性判别分析(LDA)特别受欢迎,因为它既是分类器又是降维技术。二...
  • spss进行判别分析步骤spss 进行判别分析步骤1.Discriminant Analysis 判别分析主对话框 如图 1-1 所示图 1-1DiscriminantAnalysis 主对话框(1)选择分类变量及其范围在主对话框中左面的矩形框中选择表明已知的观测量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,114
精华内容 2,445
关键字:

判别分析