

LDA概述
LDA目的是將資料集投影到具有良好分類特徵的低維空間上,投影后類內方差最小、類間方差最大,用於表徵資料結構以及識別分類,因此它在高維資料集的分析中非常流行。
與其它機器學習演算法(例如神經網路、隨機森林等)相比,LDA的主要優點是可更好避免過擬合以及計算簡單。
LDA資料準備
已知分類
需要已知樣本的歸屬,支援兩組或多組情況。已知樣本分類將為降維過程提供監督,實現判別的目的。
刪除異常值
考慮從資料中刪除異常值,它們通常會對LDA的精度產生影響。
正態性與方差齊性
LDA最初是為多元正態分佈資料開發的,也就是LDA的前提假設資料滿足多元正態性。即便資料集整體不呈正態分佈,但也應至少滿足在每個分組內的子資料集均應呈正態分佈。
LDA對方差齊性沒有很嚴格的要求。這意味著如果以圖形展示資料,則每個分組內的資料分佈都可描述為一個橢圓體(取決於正態性),並允許橢圓體位置、形狀(代表了組間均值、方差)等有所不同。
LDA原理簡述
直觀理解,當代表每個分組的橢圓體具有如下所示的相似排列和形狀時(表徵了資料分佈模式),可選擇使用LDA;當橢圓體具有明顯不同的排列或形狀時,一種稱為二次判別分析(Quadratic Discriminant Analysis,QDA)的方法更為合適(因此通常QDA更靈活)。

本篇暫不討論QDA,以下是LDA的工作原理概述。
以包含2個變數,9個物件(其中5個屬於分組1,4個屬於分組2,即上圖示例)的資料矩陣為例。首先將物件投影到變數空間上,一個變數代表一個維度,這裡共2個變數所以就是二維變數空間。
考慮圖a中的代表兩組資料中物件分佈的橢圓,它們具有相似的結構,執行LDA。在圖上定義任意的直線,並將橢圓中心(代表變數集的均值位置)垂直投影到直線上(圖b),稱為正交投影。類似的過程,將所有變數也投影到直線上(圖c)。
由於各組內的資料均呈正態分佈,因此對於每個橢圓的投影資料也均為正態分佈(圖d),均值表示投影中心,並具有一定的方差,方差反映了離散程度。由於投影直線是任意指定的,因此可存在n種投影情況,具有不同的均值和方差。然後就需從中確定最佳投影直線,所謂最佳,即資料的投影能夠最大限度地區分組內和組間特徵。

這裡假設兩組資料在各個變數維度的均值分別為μ1和μ2,方差為σ21和σ22,則變數空間中存在點M,可在各個變數維度透過公式(μ1-M)2/σ21+(μ2-M)/σ22得到一個最小值,即獲得最小均值差。對於經過M點的直線,稱為分割線(separating line),最佳投影直線與分割線正交,且保證各物件在該直線上的投影具有更小的組內方差,以及更大的組間方差,使組內方差與組間方差之比最大化(圖e,兩組資料等方差時,M點在兩橢圓中心點的中間位置;或f,兩組資料不等方差時,M點靠近具有較小方差的橢圓)。
該投影直線也稱為超平面(hyperplane),最終實現降維的目的,並可根據物件點在超平面中投影位置進行分類。
如上簡單概括了由二維降維至一維的過程。LDA最終可獲得的維度k≤n-1,n為變數數量。對於多維情況,各維(LDA軸)計算的原理同上,且各軸之間正交。
再補充一點關於資料的正態性問題
由上述過程也不難看出,對於違反正態性的資料,理論上無法根據公式準確計算M點的位置,因此最終分類結果也不準確。
儘管如此,違反正態性假設的資料仍可嘗試執行LDA,有些情況下仍可以得到較好的效果。例如Duda等(2001)指出,LDA在人臉和物體識別的任務中經常取得良好的表現,儘管經常與正態性假設違背。
LDA與PCA
因此二者的主要區別在於,PCA屬於“無監督”演算法,它在降維時不關注資料的分組(類)關係,目標是找到代表資料集最大化方差方向的一系列正交的主成分(特徵向量);LDA則是“監督”演算法,考慮已知的類別關係,透過線性判別式定義一系列表示最大化類別之間距離的正交軸。

儘管聽起來很直觀,對於已知類別標籤的資料而言,LDA似乎優於PCA,但並非總是如此。Martinez等(2011)在比較PCA和LDA排序圖中展示的分組關係後表明,如果每類資料中涉及的物件數量相對較少,PCA的效能反而優於LDA。
R包MASS的LDA
接下來,展示R語言執行LDA的過程,以MASS包的方法為例。
資料集
iris資料集,記錄了150朵鳶尾花的花朵性狀測量值。
這些鳶尾花來自三種物種,分別為setosa(n=50)、versicolor(n=50)和virginica(n=50)。
包含四種性狀,分別為萼片長度(sepal length,cm)、萼片寬度(sepal width,cm)、花瓣長度(petal length,cm)和花瓣寬度(petal width,cm)。

#資料集,詳情 ?iris
data(iris)
head(iris)

接下來期望從中找到合適的“變數組合”,作為區分不同鳶尾花的代表特徵。
* 探索性分析
首先不妨檢視一下各變數的數值分佈,哪些花朵性狀在不同物種之間具有明顯的區別。
#變數分佈
library(ggplot2)
ggplot(reshape2::melt(iris, id = 'Species'), aes(x = value)) +
geom_histogram(aes(fill = Species), color = 'gray') +
facet_wrap(~variable, ncol = 2, scales = 'free')

直方圖清晰地表明,花瓣的長度和寬度似乎可以作為潛在特徵,用以區分三種鳶尾花物種。
#透過 PCA 降維資料,觀測資料特徵
pca <- princomp(iris[1:4])
plot(pca$scores[ ,1], pca$scores[ ,2], col = rep(c('red', 'green', 'blue'), summary(iris$Species)))

PCA顯示,第一主成分可作為區分不同鳶尾花物種花朵性狀的潛在特徵。
接下來接入本篇的方法部分,使用LDA實現資料降維,選擇代表性的變數組合特徵,以及實現分類。
正態性評估及變數標準化
#QQ-plot 檢驗多元正態性
qqplot(qchisq(ppoints(nrow(iris[1:4])), df = ncol(iris[1:4])), mahalanobis(iris[1:4], colMeans(iris[1:4]), cov(iris[1:4])))
abline(a = 0, b = 1)

QQ圖顯示了示例資料集滿足多元正態性。
如果正態性假設被拒絕,可嘗試轉化資料的方式(如log轉化,但要保證這種轉化方式是合理的),獲得正態分佈的資料。
儘管也可直接使用非正態性的資料直接執行LDA,如概述中提到的。
變數的標準化也是推薦的一步。
使標準化後的資料集保證方差齊性,對於消除變數間的量綱差異或者較大方差變數的權重時非常有效,可提高降維的精度。
#標準化資料,如標準化為均值 0,標準差 1 的結構
iris[1:4] <- scale(iris[1:4], center = TRUE, scale = TRUE)
LDA 降維及分類
為了更好地展示LDA的分類器功能,將示例資料集分為兩部分,一部分作為訓練集用於LDA降維及分類器構建,另一部分作為測試集進一步評估LDA預測分類的功效。
#將資料集隨機分為訓練集(80%)和測試集(20%)
set.seed(123)
training <- sample(rownames(iris), nrow(iris)*0.8)
train.data <- subset(iris, rownames(iris) %in% training)
test.data <- subset(iris, ! rownames(iris) %in% training)
經過幾個準備步驟後,執行LDA。
LDA演算法首先查詢使類別之間距離最大化的方向(即LDA軸),作為變數響應分類的最佳線性組合,並透過這種組合進一步預測分類。
library(MASS)
#擬合模型
model <- lda(Species~., data = train.data)
model

lda()確定各組資料的平均值並計算物件屬於不同組的機率,將物件劃分到機率最高的組中。
Prior probabilities of groups,各組的先驗機率,即已知分組中所含物件數量佔總數量的比例。例如在本示例中,隨機抽取的訓練集的setosa組中共含有40個物件(40個鳶尾花觀測個體),佔訓練集所有物件(總計120個鳶尾花觀測個體)的33.3%。
Group means,組均值,展示了每個分組中變數的平均值。
Coefficients of linear discriminants,線性判別係數,用於形成LDA決策規則的預測變數的線性組合。例如,LD1 = 0.828*Sepal.Length + 1.438*Sepal.Width – 2.179*Petal.Length – 2.656*Petal.Width。可在降維後根據線性判別係數所得表示式,預測訓練集的分類。
Proportion of trace,可以將它理解為各LDA軸的“方差解釋率”,以評估各LDA軸的重要程度,示例結果顯示LDA第一主軸是非常重要的。
#作圖觀測物件在前兩 LDA 軸中的投影
plot(model, col = rep(c('red', 'green', 'blue'), summary(train.data$Species)), dimen = 2)
#或者 ggplot2 作圖
ggplot(cbind(train.data, predict(model)$x), aes(LD1, LD2, color = Species)) +
geom_point() +
stat_ellipse(level = 0.95, show.legend = FALSE)

結果顯而易見了,LDA第一主軸承載了最能體現類間差異的特徵。
對比訓練集中物件的既定分組屬性和由LDA判別的分組屬性的一致性,結果可表徵LDA模型的擬合精度。
#模型擬合精度評估,訓練集
predictions <- predict(model, train.data)
#檢視訓練集物件的後驗機率,即根據機率劃分到高機率的類中
head(predictions$posterior)
#檢視對訓練集物件預測的分類
head(predictions$class)
#比較預測的分類和已知先驗分類屬性的差異,結果反映了準確度資訊
mean(predictions$class == train.data$Species)

結果顯示,98%以上的物件能夠被分類到正確的類別中。
現在更改為測試集,進一步評估LDA分類器精度。
#模型擬合精度評估,測試集
predictions <- predict(model, test.data)
mean(predictions$class == test.data$Species)

結果顯示,約97%以的物件能夠被分類到正確的類別中,LDA分類器的精度是相對可靠的。
參考資料



