判別分析及R使用Part2-距離判別法

這部分筆記是MOOC課程《多元統(tǒng)計分析及R語言建模》第6章第二講“距離判別分析”。在判別分析及R使用-Part1中提到,確定性判別可用Fisher判別法,除此之外還可以用距離判別分析。

兩總體距離判別

老師在講課的時候畫了張圖,可以直觀的理解什么是距離判別法:

μ_1μ_2∑_1∑_2分別為兩個類G_1G_2的均值向量和協(xié)方差矩陣。

距離判別.jpeg

簡單來講,若想知道一個樣本x屬于哪個總體,可以計算并比較x到兩個總體的距離,距離誰近則屬于誰。距離計算方法用的是馬氏距離
D(X,G_i)=(X - μ_i)'(∑_i)^{-1}(X-μ_i),i=1,2
判別準則:

  • D(X,G_1) < D(X,G_2),則X ∈ G_1
  • D(X,G_1) > D(X,G_2),則X ∈ G_2
  • D(X,G_1) = D(X,G_2),待判。

按照∑_1∑_2是否相等,距離判別分析又可分為直線判別曲線判別

直線判別

∑_1=∑_2=∑時,就是直線判別。若想知道一個未知的點距離誰近,可以做減法:
W(X)=D(X,G_2)-D(X,G_1) \\=(X - μ_2)'∑^{-1}(X-μ_2)-(X - μ_1)'∑^{-1}(X-μ_1)\\=2X'∑^{-1}(μ_1-μ_2)-(μ_1+μ_2)∑^{-1}(μ_1-μ_2)\\=2[X-1/2(μ_1+μ_2)]'∑^{-1}(μ_1-μ_2)
然后把無傷大雅的2去掉,就可以把W(X)寫成b_0+b_1X,此時b_0=-1/2(μ_1+μ_2)'∑^{-1}(μ_1-μ_2)b_1=∑^{-1}(μ_1-μ_2)。這個b_1其實就是Fisher判別分析里的\alpha',換句話說,當兩總體協(xié)方差矩陣相等時,距離判別分析和Fisher判別分析是一樣的。

其實吧,上面公式是怎么推倒的,我還沒整的特別明白,先記錄下來,回頭再扣

曲線判別

曲線判別就是∑_1≠∑_2時的情況,不等則不能像相等時將∑代入展開:
W(X)=D(X,G_2)-D(X,G_1) \\=(X - μ_2)'∑^{-1}(X-μ_2)-(X - μ_1)'∑^{-1}(X-μ_1)

舉例說明

還是之前的天氣的例子,這回我們使用距離判別分析天氣數(shù)據(jù),在R語言中使用qda()函數(shù)即可:

> qd <- qda(G~x1+x2)
> qp<- predict(qd)
> G2 <- qp$class
> data.frame(G,G1,G2)##G1是使用Fisher判別法時預測的結果,不明白的可以去看上一張筆記的內容
  G G1 G2
1  1  1  2
2  1  1  1
3  1  1  1
4  1  1  1
5  1  1  1
6  1  2  1
7  1  1  1
8  1  1  1
9  1  1  1
10 1  1  1
11 2  2  2
12 2  2  2
13 2  2  2
14 2  2  2
15 2  1  1
16 2  2  1
17 2  2  2
18 2  2  2
19 2  2  2
20 2  2  2
##計算正確率
> sum(diag(prop.table( table(G,G2))))
[1] 0.85
##做天氣預測
> predict(qd,data.frame(x1=8.1,x2=2.0))
$class
[1] 1
Levels: 1 2

$posterior
          1           2
1 0.9939952 0.006004808

多總體距離判別

多總體時就不能像兩總體那樣做距離的減法了,需要帶著i對公式進行下變換,若協(xié)方差矩陣相同(直線判別):
D(X,G_i)=(X - μ_i)'∑^{-1}(X-μ_i)\\=X'∑^{-1}X- 2μ_i'∑^{-1}X+μ_i'∑^{-1}μ_i\\ =X'∑^{-1}X-2(b_iX+b_0)\\=X'∑^{-1}X-2Z_i
其中,Z_i=b_0+b_iX,當Z_i=max(Z_j),i≤j≤k,則X ∈ G_i
而協(xié)方差矩陣若不相等(非線性判別),則馬氏距離公式無法展開D(X,G_i)=(X - μ_i)'∑^{-1}(X-μ_i),此時是當D(x,G_i)=min D(X,G_i),i≤j≤k時,X ∈ G_i

舉例說明

表6.3.png

20個電視機,5種暢銷,8種平銷,7種滯銷,試建立判別函數(shù),當一新產品其質量評分為8.0,功能評分為7.5,銷售價格為65元,問該廠產品的銷售前景如何?
首先使用直線判別:

> d6.3 <- read.xlsx("/home/my/桌面/MOOC/多元統(tǒng)計分析/mvstats5.xlsx",sheet="d6.3")
> d6.3
     Q   C  P G3
1  8.3 4.0 29  1
2  9.5 7.0 68  1
3  8.0 5.0 39  1
4  7.4 7.0 50  1
5  8.8 6.5 55  1
6  9.0 7.5 58  2
7  7.0 6.0 75  2
8  9.2 8.0 82  2
9  8.0 7.0 67  2
10 7.6 9.0 90  2
11 7.2 8.5 86  2
12 6.4 7.0 53  2
13 7.3 5.0 48  2
14 6.0 2.0 20  3
15 6.4 4.0 39  3
16 6.8 5.0 48  3
17 5.2 3.0 29  3
18 5.8 3.5 32  3
19 5.5 4.0 34  3
20 6.0 4.5 36  3
> attach(d6.3)
> ld3 <- lda(G3~Q+C+P)
> ld3
Call:
lda(G3 ~ Q + C + P)

Prior probabilities of groups:
   1    2    3 
0.25 0.40 0.35 

Group means:
         Q        C      P
1 8.400000 5.900000 48.200
2 7.712500 7.250000 69.875
3 5.957143 3.714286 34.000

Coefficients of linear discriminants:
          LD1         LD2
Q -0.81173396  0.88406311
C -0.63090549  0.20134565
P  0.01579385 -0.08775636

Proportion of trace:
   LD1    LD2 
0.7403 0.2597 
> lp3<- predict(ld3)
> lG3 <- lp3$class
> data.frame(G3,lG3)
   G3 lG3
1   1   1
2   1   1
3   1   1
4   1   1
5   1   1
6   2   1
7   2   2
8   2   2
9   2   2
10  2   2
11  2   2
12  2   2
13  2   3
14  3   3
15  3   3
16  3   3
17  3   3
18  3   3
19  3   3
20  3   3
> ltab3 <- table(G3,lG3)
> ltab3
   lG3
G3  1 2 3
  1 5 0 0
  2 1 6 1
  3 0 0 7
> plot(lp3$x)
> text(lp3$x[,1],lp3$x[,2],lG3,adj=-0.8,cex=0.75)
lp3.png
> predict(ld3,data.frame(Q=8,C=7.5,P=65))
$class
[1] 2
Levels: 1 2 3

$posterior
          1        2           3
1 0.2114514 0.786773 0.001775594

$x
        LD1        LD2
1 -1.537069 -0.1367865

若協(xié)方差矩陣不等,使用pda()函數(shù):

> qd3 <- qda(G3~Q+C+P)
> qd3
Call:
qda(G3 ~ Q + C + P)

Prior probabilities of groups:
   1    2    3 
0.25 0.40 0.35 

Group means:
         Q        C      P
1 8.400000 5.900000 48.200
2 7.712500 7.250000 69.875
3 5.957143 3.714286 34.000
> qp3 <- predict(qd3)
> qG3 <- qp3$class
> data.frame(G3,lG3,qG3)
   G3 lG3 qG3
1   1   1   1
2   1   1   1
3   1   1   1
4   1   1   1
5   1   1   1
6   2   1   2
7   2   2   2
8   2   2   2
9   2   2   2
10  2   2   2
11  2   2   2
12  2   2   2
13  2   3   3
14  3   3   3
15  3   3   3
16  3   3   3
17  3   3   3
18  3   3   3
19  3   3   3
20  3   3   3
> qtab3<-table(G3,lG3)
> predict(qd3,data.frame(Q=8,C=7.5,P=6.5))
$class
[1] 2
Levels: 1 2 3

$posterior
              1 2             3
1 5.080497e-225 1 1.498709e-158

無論哪種方法,正確率大于0.8就是可以的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容