最近编写了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"

打完收工!

R语言中Fisher判别的使用方法的更多相关文章

  1. 掌握R语言中的apply函数族(转)

    转自:http://blog.fens.me/r-apply/ 前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是 ...

  2. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

  3. R语言中的factor

    对于初学者来说,R语言中的factor有些难以理解.如果直译factor为“因子”,使得其更加难以理解.我倾向于不要翻译,就称其为factor,然后从几个例子中理解: <span style=& ...

  4. R语言中的MySQL操作

    R语言中,针对MySQL数据库的操作执行其实也有很多中方式.本人觉得,熟练掌握一种便可,下面主要就个人的学习使用情况,总结其中一种情况-----使用RMySQL操作数据库. 1.下载DBI和RMySQ ...

  5. C语言中的const,free使用方法具体解释

    注意:C语言中的const和C++中的const是有区别的,并且在使用VS编译測试的时候. 假设是C的话.请一定要建立一个后缀为C的文件.不要是CPP的文件. 由于.两个编译器会有区别的. 一.C语言 ...

  6. C语言中malloc函数的使用方法

    C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...

  7. R语言中 fitted()和predict()的区别

    fitted是拟合值,predict是预测值.模型是基于给定样本的值建立的,在这些给定样本上做预测就是拟合.在新样本上做预测就是预测. 你可以找一组数据试试,结果如何. fit<-lm(weig ...

  8. R语言中的Apriori关联规则的使用

    1.下载Matrix和arules包 install.packages(c("Matrix","arules")) 2.载入引入Matrix和arules包 # ...

  9. R语言中abline和lines的区别

    函数lines()其作用是在已有图上加线,命令为lines(x,y),其功能相当于plot(x,y,type="1")函数abline()可以在图上加直线,其使用方法有四种格式.( ...

随机推荐

  1. springcloud(九) springboot Actuator + admin 监控

    前一章讲的都是Feign项目(调用方)的监控.接下来讲的是服务提供方的监控 一.springboot actuator + springboot admin Spring Boot Admin 是一个 ...

  2. Python Web框架——Flask

    简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理 ...

  3. urllib2 Handler处理器和自定义opener(六)

    Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...

  4. Shell 函数库

    1.为什么要定义函数库 经常使用的重复代码封装成函数文件 一般不直接执行,而是由其他脚本调用 2.编写一个函数库,该函数库实现以下几个函数. 1.加法函数:add 2.减法函数:reduce 3.乘法 ...

  5. linux下mysql的安装配置

    http://blog.csdn.net/xiagege3/article/details/41852895   (实战用的此文,要求mysql源码必须是未编译的,需依赖cmake编译) http:/ ...

  6. Android 包信息工具类

    /** AndroidInfoUtils:安卓游戏包信息工具类**/ 1 public class AndroidInfoUtils { @SuppressWarnings("uncheck ...

  7. 归纳整理Linux下C语言常用的库函数----内存及字符串控制及操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  8. PHP 文件处理(综合)

    1.获取远程文件大小:php获得远程文件大小的函数php获得远程文件大小的函数文件的大小函数为:filesize()文件是否存在的函数为:file_exits();但是这两个函数只针对本地那么:远程文 ...

  9. 利用WKWebView实现js与OC交互注意事项

    最近在写一些关于wkwebview的一些代码,发现了几点心得,记录一下. 1.js调用OC 我是利用wkwebview进行的开发实现,主要代码有三部分 1.向config注入OC对象 [config. ...

  10. Spring Boot 简单入门

    添加相关依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...