在R語言中,線性判別分析(Liner Discriminant Analysis,簡稱LDA),依靠軟件包MASS中有線性判別函數lqa()來實現。該函數有三種調用格式:
1)當對象為數據框data.frame時
lda(x,grouping,prior = propotions,tol = 1.0e-4,method,CV = FALSE,nu,…)
2) 當對象為公式Formula時
lda(formula,data,…,subnet,na.action)
3) 當對象為矩陣Matrix時
lda(x,group,…,subnet,na.action)
對於第一種情況,grouping表示每個觀測樣本的所屬類別;
prior表示各類別的先驗概率,默認取訓練集中各樣本的比例;
tol表示篩選變量,默認取0.0001
對於第二種情況,formula表示判別公式,比如,y~x1 x2 x3,或者y~x1*x1
data表示數據集
subnet表示樣本
na.action表示處理缺失值的方法,默認為“如果樣本中有缺失值,則lda()函數無法運行”;如果設置為na.omit,則表示“自動刪除樣本中的缺失值,然后,進行計算”
對於第三種情況,x表示矩陣
data表示數據集
subnet表示樣本
na.action表示處理缺失值的方法,默認為“如果樣本中有缺失值,則lda()函數無法運行”;如果設置為na.omit,則表示“自動刪除樣本中的缺失值,然后,進行計算”

下面,舉一個例子,來說明線性判別分析。我們選用kknn軟件包中的miete數據集進行算法演示。miete數據集記錄了1994年慕尼黑的住房佣金標准中一些有趣變量,比如房子的面積、是否有浴室、是否有中央供暖、是否供應熱水等等,這些因素都影響着佣金的高低。
1.數據概況
首先,簡單了解一下,miete數據集。
> library(kknn) > data(miete) > head(miete)
nm wfl
1
2
3
4 1295.14
5
6 1285.64
nmqm rooms nmkat adr wohn
1 13.865800
2 10.522857
3 14.644600
4 23.548000
5
6 13.677021
> dim(miete)
[1] 1082
我們看到,該數據集一共有1082條樣本,和17個變量。下面,我們利用summary()來查看變量的信息。
> summary(miete)
nm
Min.
1st Qu.: 543.6
Median : 746.0
Mean
3rd Qu.:1030.0
Max.
badkach fenster
0:446
1:636
Median : 6.00
Mean
3rd Qu.:17.00
Max.
rooms
Min.
1st Qu.:2.000
Median :3.000
Mean
3rd Qu.:3.000
Max.
我們可以選擇nmkat(凈租金)作為 待判別變量—一是,由於該變量在含義上容易受其他變量影響,為被解釋變量;二是,nmkat自身就有5個等級類別,其相應的樣本量依次為 219、230、210、208、215,即每一類的樣本量都為200個左右,分布比較均勻。
2.數據預處理
下面,我們將miete數據集,分為訓練集和測試集。
為了提高判別效果,我們考慮采用分層抽樣的方式,由於miete數據集中,待判別變量nmkat的5個等級分布比較均勻,因此采用5個等級按等量抽取樣本。(如果分布不均勻,則采用按比例抽取樣本)。具體如下:
> library(sampling) > n = round(2/3*nrow(miete)/5) > n
[1] 144
可以看到,訓練集占總樣本的2/3,測試集占總樣本的1/3,從訓練集中nmkat變量的每一個等級抽取的樣本數是144個。
> #以nmkat變量的5個等級划分層次,進行分層抽樣 > sub_train = strata(miete,stratanames = "nmkat",size=rep(n,5),method="srswor") > head(sub_train)
#顯示訓練集抽取的情況,包括nmkat變量取值、該樣本在數據集中的序號、被抽取的概率、以及被抽取的層次。
nmkat ID_unit
1
2
3
16
20
22
>
> #獲取如上ID_unit所對應的樣本構成訓練集,並刪除變量1、3、12 > data_train = getdata(miete[,c(-1,-3,-12)],sub_train$ID_unit) > data_test = getdata(miete[,c(-1,-3,-12)],-sub_train$ID_unit) > dim(data_train); dim(data_test) #分別顯示訓練集、測試集的維度
[1] 720
[1] 362
> head(data_test)
wfl bad0 zh ww0 badkach fenster kueche mvdauer bjkat
7
8
9
10
11
17
adr wohn
7
8
9
10
11
17
至此,數據理解和數據預處理過程結束,得到可以直接使用的訓練集data_train和測試集data_test。
3.線性判別
這里使用公式formula格式,進行判別。首先要加載軟件包MASS,接着使用nmkat作為待判別變量,其他變量作為特征變量,根據公式nmkat~. (如果變量為y,則公式為y~.
> library(MASS) > fit_lda1 = lda(nmkat~., data_train) #以公式格式進行線性判別 > names(fit_lda1) > fit_lda1$prior
1
0.2 0.2 0.2 0.2 0.2
我們可以看到,各類別的先驗概率在5個等級中都為0.2,之和為1,即它們都相等,這與它們分別均勻對應。
> fit_lda1$means
wfl
1 54.87500 0.055555556 0.6041667 0.138888889 0.3888889 0.06944444 0.04166667
2 60.59722 0.013888889 0.8125000 0.027777778 0.5486111 0.08333333 0.04166667
3 66.76389 0.013888889 0.8194444 0.041666667 0.5208333 0.06944444 0.07638889
4 74.70833 0.013888889 0.8750000 0.041666667 0.6458333 0.03472222 0.07638889
5 90.10417 0.006944444 0.9375000 0.006944444 0.7708333 0.04166667 0.20833333
mvdauer
1 14.444444 -0.21580517 -0.104562739
2 11.923611 -0.12450298 -0.211398581 -0.002588042 0.20604313 -0.12642562
3 11.847222 -0.12782306 -0.145478593
4 10.347222 -0.08964215 -0.127293769 -0.035197366 0.12861291
5
nmqm
1
2 10.988627 2.416667 -0.034373246 -0.7569604 0.08838835 -0.4252586
3 12.495436 2.597222 -0.019641855 -0.7654655 0.11294067 -0.3487121
4 14.107342 2.861111
5 17.108865 3.250000
從上面的結果中,可以看到一些很能反映現實情況的數據特征。比如,住房面積wfl變量,它明顯隨着租金nmkat的升高而逐步提高。這與我們的常識“房子的面積越大,租金就越貴”是十分吻合的。
