1. 程式人生 > >Fisher線性判別及R語言實現

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%