R 实现线性判别分析教程
本文介紹線性判別分析概念,并通過(guò)示例介紹R的實(shí)現(xiàn)過(guò)程。
介紹線性判別分析模型
線性判別分析用于基于一組變量把響應(yīng)變量分為倆類或更多的算法。但線性判別算法對(duì)數(shù)據(jù)有一些要求:
-
響應(yīng)變量必須是類別變量。線性判別是分類算法,因此響應(yīng)變量應(yīng)該是類別變量。
-
預(yù)測(cè)變量應(yīng)遵循正太分布。首先檢查每個(gè)預(yù)測(cè)變量是否大致符合正太分布,如果不滿足,需要選擇轉(zhuǎn)換算法使其近似滿足。
-
每個(gè)預(yù)測(cè)變量有相同的標(biāo)準(zhǔn)差。現(xiàn)實(shí)中很難能夠滿足該條件,但我們可以對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化,讓變量統(tǒng)一為標(biāo)準(zhǔn)差為1,均值為0.
-
檢查異常值。在用于LDA之前要檢查異常值。可以簡(jiǎn)單通過(guò)箱線圖或散點(diǎn)圖查進(jìn)行檢測(cè)。
LDA模型在現(xiàn)實(shí)中應(yīng)用廣泛,下面簡(jiǎn)單舉例:
- 市場(chǎng)營(yíng)銷(xiāo)
零售公司經(jīng)常使用LDA將購(gòu)物者分為幾類。然后利用建立LDA模型來(lái)預(yù)測(cè)特定購(gòu)物者是低消費(fèi)者、中等消費(fèi)者還是高消費(fèi)者,使用預(yù)測(cè)變量如收入、年度總消費(fèi)額和家庭人數(shù)等變量。
- 醫(yī)學(xué)領(lǐng)域
醫(yī)院或醫(yī)療機(jī)構(gòu)的研究人員通常利用LDA預(yù)測(cè)給定一組異常細(xì)胞是否會(huì)導(dǎo)致輕微、中度或嚴(yán)重疾病。
- 產(chǎn)品研發(fā)
一些公司會(huì)利用LDA模型預(yù)測(cè)消費(fèi)者屬于每天、每周、每月或年使用他們的產(chǎn)品,基于預(yù)測(cè)變量有性別、年度收入、使用類似產(chǎn)品的頻率。
- 生態(tài)領(lǐng)域
研究者利用LDA模型預(yù)測(cè)是否給定珊瑚礁的健康狀況:好、中等、壞、嚴(yán)重。預(yù)測(cè)變量包括大小、年度污染情況、年份。
加載實(shí)現(xiàn)庫(kù)
library(MASS) library(ggplot2)載入數(shù)據(jù)
我們打算使用內(nèi)置的iris數(shù)據(jù),下面代碼展示如何載入查看數(shù)據(jù)。
str(iris)# 'data.frame': 150 obs. of 5 variables: # $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... # $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... # $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... # $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... # $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...我們看到共包括5個(gè)變量150個(gè)觀察記錄。下面通過(guò)線性判別分析模型對(duì)給定鳶尾花進(jìn)行分類。
我們使用下面四個(gè)預(yù)測(cè)變量:
- Sepal.length
- Sepal.Width
- Petal.Length
- Petal.Width
預(yù)測(cè)響應(yīng)變量為Species,分別包括三類:
- setosa
- versicolor
- virginica
數(shù)據(jù)標(biāo)準(zhǔn)化
線性判別算法其中一個(gè)關(guān)鍵假設(shè)為每個(gè)預(yù)測(cè)變量具有相同的標(biāo)準(zhǔn)差。一種簡(jiǎn)單辦法可以對(duì)預(yù)測(cè)變量進(jìn)行標(biāo)準(zhǔn)化,這樣預(yù)測(cè)變量統(tǒng)一為均值為0、方差為1。
我們使用內(nèi)置的scale函數(shù),并利用apply函數(shù)進(jìn)行驗(yàn)證:
iris[1:4] <- scale(iris[1:4])apply(iris[1:4], 2, mean) # Sepal.Length Sepal.Width Petal.Length Petal.Width # -3.219358e-18 -4.916405e-18 -1.440616e-17 -1.822508e-17 apply(iris[1:4], 2, sd) # Sepal.Length Sepal.Width Petal.Length Petal.Width # 1 1 1 1創(chuàng)建訓(xùn)練和測(cè)試數(shù)據(jù)集
接下來(lái)我們把數(shù)據(jù)分為訓(xùn)練集和測(cè)試集:
set.seed(1)sample <- sample(c(TRUE, FALSE), nrow(iris), replace = TRUE, prob = c(.7, .3))train <- iris[sample, ] test <- iris[!sample,]擬合LDA模型
下面我們利用MASS包中的lda函數(shù)實(shí)現(xiàn)LDA模型:
library(MASS) model <- lda(Species~., data=train) model# Call: # lda(Species ~ ., data = train) # # Prior probabilities of groups: # setosa versicolor virginica # 0.3207547 0.3207547 0.3584906 # # Group means: # Sepal.Length Sepal.Width Petal.Length Petal.Width # setosa -1.0397484 0.8131654 -1.2891006 -1.2570316 # versicolor 0.1820921 -0.6038909 0.3403524 0.2208153 # virginica 0.9582674 -0.1919146 1.0389776 1.1229172 # # Coefficients of linear discriminants: # LD1 LD2 # Sepal.Length 0.7922820 0.5294210 # Sepal.Width 0.5710586 0.7130743 # Petal.Length -4.0762061 -2.7305131 # Petal.Width -2.0602181 2.6326229 # # Proportion of trace: # LD1 LD2 # 0.9921 0.0079下面我們解釋上面的輸出:
- 每組的先驗(yàn)概率
這些表示訓(xùn)練集數(shù)據(jù)中每組的概率。如:所有訓(xùn)練集中35.8%的觀測(cè)值屬于virginica類別。
- 組均值
這些數(shù)據(jù)顯示每類每個(gè)預(yù)測(cè)變量的均值。
- 線性判別系數(shù)
這里展示了LDA模型的判別規(guī)則,每個(gè)預(yù)測(cè)變量的線性組合情況:
- LD1: .792Sepal.Length + .571Sepal.Width – 4.076Petal.Length – 2.06Petal.Width
- LD2: .529Sepal.Length + .713Sepal.Width – 2.731Petal.Length + 2.63Petal.Width
- 分離百分比
這些展示了每個(gè)線性判別函數(shù)實(shí)現(xiàn)的分離百分比。
使用模型進(jìn)行預(yù)測(cè)
我們已經(jīng)使用訓(xùn)練數(shù)據(jù)擬合了模型,下面使用模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè):
predicted <- predict(model, test)names(predicted)head(predicted$class) # [1] setosa setosa setosa setosa setosa setosa # Levels: setosa versicolor virginicahead(predicted$posterior)# setosa versicolor virginica # 4 1 2.425563e-17 1.341984e-35 # 6 1 1.400976e-21 4.482684e-40 # 7 1 3.345770e-19 1.511748e-37 # 15 1 6.389105e-31 7.361660e-53 # 17 1 1.193282e-25 2.238696e-45 # 18 1 6.445594e-22 4.894053e-41head(predicted$x)# LD1 LD2 # 4 7.150360 -0.7177382 # 6 7.961538 1.4839408 # 7 7.504033 0.2731178 # 15 10.170378 1.9859027 # 17 8.885168 2.1026494 # 18 8.113443 0.7563902我們看到輸出列表中包括三個(gè)變量:
- class 預(yù)測(cè)類型
- posterior 每個(gè)類別對(duì)應(yīng)的后驗(yàn)概率
- x 線性判別
下面我們來(lái)看LDA模型正確預(yù)測(cè)類型的百分比:
mean(predicted$class == test$Species) # [1] 1輸出顯示模型預(yù)測(cè)正確率100%。在現(xiàn)實(shí)世界中模型很少能夠預(yù)測(cè)每個(gè)類別都完全正確,因內(nèi)置iris數(shù)據(jù)集比較簡(jiǎn)單,預(yù)測(cè)結(jié)果比較好。
可視化結(jié)果
最后,我們創(chuàng)建LDA圖形觀察線性判別模型,通過(guò)圖示方式展示三種類型區(qū)分情況:
library(ggplot2) lda_plot <- cbind(train, predict(model)$x)ggplot(lda_plot, aes(LD1, LD2)) + geom_point(aes(color=Species))總結(jié)
以上是生活随笔為你收集整理的R 实现线性判别分析教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android .9图片制作
- 下一篇: 2017高中数学新课程标准