Fisher线性判别及R语言实现

目录

判别分析

 线性判别分析

求Fisher线性判别函数

计算判别界值

数据如下

R代码

代码解释及结果分析


判别分析

discriminat analysis,是多变量统计中用于判别样品所属类别的一种统计分析方法。它所解决的问题是在一些已知研究对象已经用某种方法分成若干类的情况下,确定新的样品属于已知类别中的哪一类。

判别分析的主要方法如下:

 线性判别分析

R.A.Fisher最早提出将线性判别函数用于花卉分类,后来将这种方法称为Fisher线性判别。

假如有两类样品,分别包含n1,n2的数量,通过建立线性判别函数-linear discriminatory function为:Y = a1x1+a2x2+... = a'Y,通过指标值x计算Y值,然后根据临界值对Y进行分类。

当指标数量x为1时,两类判别分析类似于两样本均值t检验,只有当μ1 =! μ2时,两类才能进行判别分析。

求Fisher线性判别函数

Fisher判别准则要求各类之间的变异尽可能地大,而各类内部的变异尽可能的小。即是‘’高内聚,低耦合‘’,

变异用离均差平方和表示,分离度用λ来表示:

在这里,Sp^2为合并协方差矩阵,S1^2,S2^2,分别为各自的协方差矩阵

Fisher线性判别的目的是选择适当的x组合,使λ最大,且值为

证明:

其中:

于是:

计算判别界值

通过上述计算a,带入判别式即可得到判别函数,将目标参数x带入即可求得y

然后以两均数的中点作为两类的界点:

建立判别标准,对号入座即可:

数据如下

x1	x2	class
-1.9	3.2	1
-6.9	0.4	1
5.2	2	1
5	2.5	1
7.3	0	1
6.8	12.7	1
0.9	-5.4	1
-12.5	-2.5	1
1.5	1.3	1
3.8	6.8	1
0.2	6.2	2
-0.1	7.5	2
0.4	14.6	2
2.7	8.3	2
2.1	0.8	2
-4.6	4.3	2
-1.7	10.9	2
-2.6	13.1	2
2.6	12.8	2
-2.8	10	2

R代码

> d = read.table("clipboard",header = T)
> d
      x1   x2 class
1   -1.9  3.2     1
2   -6.9  0.4     1
3    5.2  2.0     1
4    5.0  2.5     1
5    7.3  0.0     1
6    6.8 12.7     1
7    0.9 -5.4     1
8  -12.5 -2.5     1
9    1.5  1.3     1
10   3.8  6.8     1
11   0.2  6.2     2
12  -0.1  7.5     2
13   0.4 14.6     2
14   2.7  8.3     2
15   2.1  0.8     2
16  -4.6  4.3     2
17  -1.7 10.9     2
18  -2.6 13.1     2
19   2.6 12.8     2
20  -2.8 10.0     2
> attach(d)
> plot(x1,x2);text(x1,x2,class,adj= -0.5)
> library(MASS)
> (ld = lda(class~x1+x2))
Call:
lda(class ~ x1 + x2)

Prior probabilities of groups:
  1   2 
0.5 0.5 

Group means:
     x1   x2
1  0.92 2.10
2 -0.38 8.85

Coefficients of linear discriminants:
          LD1
x1 -0.1035305
x2  0.2247957
> Z = predict(ld)
> newClass = Z$class
> cbind(class,Z$x,newClass)
   class         LD1 newClass
1      1 -0.28674901        1
2      1 -0.39852439        1
3      1 -1.29157053        1
4      1 -1.15846657        1
5      1 -1.95857603        1
6      1  0.94809469        2
7      1 -2.50987753        1
8      1 -0.47066104        1
9      1 -1.06586461        1
10     1 -0.06760842        1
11     2  0.17022402        2
12     2  0.49351760        2
13     2  2.03780185        2
14     2  0.38346871        2
15     2 -1.24038077        1
16     2  0.24005867        2
17     2  1.42347182        2
18     2  2.01119984        2
19     2  1.40540244        2
20     2  1.33503926        2
> (tab = table(class,newClass))
     newClass
class 1 2
    1 9 1
    2 1 9
> sum(diag(prop.table(tab)))
[1] 0.9

> plot(ld)

预测待分类值

> d2 = read.table("clipboard",header = T)
> M = predict(ld,d2)
> cbind(M$x,M$class)
         LD1  
1 -1.9964413 1
2 -1.6681151 1
3 -1.3397889 1
4 -1.0114626 1
5 -1.3125644 1
6  0.0247058 2
7  0.3530320 2
8  0.6813582 2
> 

代码解释及结果分析

第一行是输入数据,需要手动复制完整数据表,然后代码从剪切板中获取数据

接下来是解析数据的行列

plot绘图,x1,x2为轴,class分组,圆圈大小

调用科学计算类库,训练模型

结果显示1组和2组各占数据源的一半,然后是平均值矩阵,x1,x2最终值

我们获得的判别公式为

y = -0.1035305x1 + 0.2247957x2

接下来利用获得的公式对已有数据进行Fisher线性判别

可见两类错判的各有1列,判对的有18列,故合格率为90%

猜你喜欢

转载自blog.csdn.net/Da___Vinci/article/details/83504398