• R语言中Fisher判别的使用方法


    最近编写了Fisher判别的相关代码时,需要与已有软件比照结果以确定自己代码的正确性,于是找到了安装方便且免费的R。这里把R中进行Fisher判别的方法记录下来。

    1. 判别分析与Fisher判别

    不严谨但是通俗的说法,判别分析(Discriminant Analysis)是一种多元(多个变量)统计分析方法,它根据样本的多个已知变量的值对样本进行分类的方法。一般来说,判别分析由两个阶段构成——学习(训练)和判别。在学习阶段,给定一批已经被分类好的样本,根据它们的分类情况和样本的多个变量的值来学习(训练)得到一种判别方法;在判别阶段用前一阶段得到的判别方法对其他样本进行判别。

    Fisher判别(Fisher Discrimination Method)又被称为线性判别(LDA,Linear Discriminative Analysis),是判别分析的一种,历史可以追溯到1936年。它的核心思想是将多维数据(多个变量)投影(使用线性运算)到一维(单一变量)上,然后通过给定阈值将样本根据投影后的单一变量进行分类。

    Fisher判别的学习(训练)阶段,就是找到合适的投影方式,使得对于已经被分类好的样本,同一类的样本被投影后尽量扎堆。具体的方法有一点点儿繁琐,有兴趣可以参考这里。学习阶段的结果是找到一系列的系数(Coeffcient),构成形如

    y=a1 * x1 + a2 * x2 + a3 * x3 + ... + an * xn
    
    其中:a1,a2,... an是系数,x1,x2,... ,xn是变量值。

    的判别式和阈值。而判别阶段可以根据这个判别式计算出y,并根据阈值将样本进行分类。

    2. 在R中使用Fisher判别

    R中使用Fisher判别说起来很简单,但是我当初也放狗搜索了不短的时间才搞明白如何使用。

    首先,它在R里不叫Fisher,用Fisher搜索多半误入歧途。在R中,它叫LDA(Linear Discriminative Analysis)。

    其次,它存在于一个叫MASS的包里。在Ubuntu 13.10中使用:

    sudo apt-get install r-base

    这样安装以后默认就有,然后使用下面语句引用这个包:

    > library(MASS)

    再次,引用了MASS包以后就可以使用lda命令了:

    > params <- lda(y~x1+x2+x3, data=d)

    其中,第一个参数是判别式的形式,第二个参数是用来训练的样本数据。lda命令执行后,会输出构成判别式的各个系数。

    最后,使用predict命令对未分类的样本进行判别。

    > predict(params, newdata)

    其中,第一个参数是上一阶段lda命令的结果,第二个参数是用来分类的样本数据。自此,整个fisher判别过程完成。

    3. 实例

    3.1 数据

    准备好两个csv文件,用来训练的已分类数据叫learn.csv,用来判别的未分类数据叫infer.csv。learn.csv共有六列构成,其第一行分别为Band1,Band2,Band3,Band4, Band5, Class,分别代表变量1、变量2、变量3和类别。infer.csv由六列构成:Band1, Band2, Band3, Band4, Band5。同样第一列包含列名。csv文件的字段间都用逗号分隔。

    3.2 操作步骤

    1. 读取learn.csv

    > d <- read.csv("~/data/learn.csv")
    > d2 <- read.csv("~/data/infer.csv")

    2. 训练

    > lda(Class ~ Band1+Band2+Band3+Band4+Band5, data=d)

    训练结果:

    > params
    Call:
    lda(Class ~ Band1 + Band2 + Band3 + Band4 + Band5, data = data)
    
    Prior probabilities of groups:
            0         1 
    0.4220068 0.5779932 
    
    Group means:
         Band1      Band2      Band3    Band4    Band5
    0 318.3189  0.0000000  0.0000000  0.00000  0.00000
    1 322.1881 -0.7703634 -0.2642972 33.92608 36.39715
    
    Coefficients of linear discriminants:
                  LD1
    Band1  0.02173212
    Band2 -0.08647688
    Band3 -0.01199366
    Band4  0.10619769
    Band5  0.10560976

    3. 判别

    > ret <- predict(params, d2)

    输出结果:

    > write.csv(d2, file="~/data/output.csv"

    打完收工!

  • 相关阅读:
    学习Python的体会 (1)
    李敖的管理经
    《inside the c++ object model》读书笔记 之五 构造,解构,拷贝语意学
    《inside the c++ object model》读书笔记 之四 Function 语意学
    《inside the c++ object model》读书笔记 之三:Data语意学
    《inside the c++ object model》读书笔记 之六 执行期语意学
    排序算法插入排序/冒泡排序
    《inside the c++ object model》读书笔记 之七 站在对象模型的尖端
    《inside the c++ object model》读书笔记 之二:构造函数
    《inside the c++ object model》读书笔记 之一:对象
  • 原文地址:https://www.cnblogs.com/Ricepig/p/LDA.html
Copyright © 2020-2023  润新知