【R分享|實戰】LDA 線性判別分析

2022-01-06 科白君的土壤世界

 No one konws everything, and you don't have to.」   --科白君之前我們分享了不少降維相關的分析方法,例如PCoA,NMDS,PCA分析,它們都是無監督學習。無監督學習指我們事先沒有任何訓練樣本,直接對數據進行建模。無監督學習的主要算法是聚類,聚類目的在於把相似的東西聚在一起,主要通過計算樣本間和群體間距離得到。與之相對的便是有監督學習,它通過已有的訓練樣本得到一個最優模型,再利用這個模型將所有的輸入映射為相應的輸出,對輸出進行簡單的判斷從而實現預測和分類。在這一期我們將與大家分享有監督學習中LDA分析的基本知識,以及如何在R語言中實現LDA分析與預測

本期內容提到的LDA分析全稱是Linear discriminant Analysis,即線性判別分析。最早由Fisher在1936年提出,多用於數據降維以及分類預測,例如:①根據給出的性狀指標,區分物種類別。②判斷一個人信用標準的好壞,③判斷學生是否能被高校錄取。LDA與回歸分析類似,但它的解釋變量是分類的而不是連續的。LDA的中心思想可以用一句話概括:"投影后類內方差最小,類間方差最大",換句話說就是我們將不同種類的高維數據投影到低維度上,希望投影結果中相同種類數據的投影點儘可能接近,而不同種類數據的中心點儘可能遠離。

如下圖所示的藍紅兩類數據,我們試圖將他們投影到一維上,保證同類相近,不同類分離。仔細觀察兩種投影方案,我們可以發現第二種方案的投影效果要比第一種好,因為它不僅將兩類數據完全分離開,且二者在自己的位置更為集中。以上就是LDA的主要思想了,在實際應用中,我們的數據是多個類別的,我們的原始數據一般也是超過二維的,投影后的也一般不是直線,而是一個低維的超平面。

相比於DA(判別分析),LDA突出的是「Linear(線性)」,它試圖按預先分類找到能夠分離總體樣本的最佳線性組合(函數)

Z便是上文中提到最佳線性函數。

作為常用的線性降維方法,LDA與PCA有很多異同點。LDA是有監督的降維方法,在降維時它會考慮已知的分類關係,通過線性判別式區分出一系列類別間的差異,而PCA是無監督的降維方法,它在降維時不關注數據的分組,目的是找到代表數據集方差最大化方向的一系列正交的主成分軸。可能有點抽象,我們可以根據以下圖像來評估在不同分布的數據中LDA與PCA的表現。

LDA傾向於分類性能最好的投影方向,而PCA選擇樣本點投影具有最大方差的方向。當兩組數據方差大小相近時,LDA的分類性能優於PCA。


在某些方面,如每類數據中涉及的對象數量相對較少或是均值相近時,PCA的性能反而優於LDA。

在使用LDA分析之前,我們得清楚它的幾點假設:

1) 樣本量容量:樣本量應該超過自變量的數目。根據經驗,對於少數(4或5)個自變量,樣本量應該超過20。假如樣本容量為n,那自變量數目應小於n-2。雖然這種低樣本量可能有效,但通常不鼓勵這樣做,最好有4~5倍的樣本量。

2) 正態分布:測試數據最好符合多元正態分布。你可以用頻率分布的直方圖或者mshapiro.test()函數對測試數據進行檢驗。對於LDA來說,正態分布並不是必須的,如果非正態性並不是由異常值引起的,那麼結果仍然是可靠的。

3) 方差齊次:LDA對方差-協方差矩陣的異質性非常敏感。在接受一項重要研究的最終結論之前,最好回顧一下組內方差和相關性矩陣。可以用散點圖來檢驗方差齊性,使用數據轉換方式來修正非其次。

我將從機器學習的角度介紹LDA的功能,首先將數據集分為兩部分,一部分作為訓練集構建LDA分類預測模型,一部分作為測試集評估預測模型的精確性。我們使用R中自帶的iris數據集,數據集內包含 3 類共 150 條記錄,每類各 50 個數據,每條記錄都有 4 項特徵:花萼(Sepal)長度、花萼寬度、花瓣(Petal)長度、花瓣寬度,可以通過這4個特徵預測鳶尾花卉屬於(setosa, versicolour, virginica)中的哪一品種。而LDA可以通過預先提供的品種分類,對特徵數據進行降維投影。

library(MASS)
library(ggplot2)
#iris <- scale(iris[,1:4]) #對數據進行標準化
set.seed(1)#設置種子保證(包含隨機函數的)代碼結果可重複
trainset<- sample(rownames(iris),nrow(iris)*0.7) #隨機抽取訓練集
traindata<- subset(iris, rownames(iris) %in% trainset) #區分訓練級與測試集數據
testdata<- subset(iris, !rownames(iris) %in% trainset)

ldamodel<- lda(traindata, Species~.)
ldamodel


①:Coefficents of linear discriminants 是每個分類變量的線性判別係數,可以根據線性函數表達式Z=b1x1+b2x2+ b3x3+ b4x4生成得到用於LDA分類決策的線性回歸組合。例如LD1 = 0.828*Sepal.Length + 1.438*Sepal.Width - 2.179*Petal.Length - 2.656*Petal.Width,可在降維後預測訓練集的分類

②:Proportion of trace,類似於PCA中的「方差解釋率」,可用於評估LDA各軸的重要性。

graphset<- cbind(trainset, predict(ldamodel)$x)#通過predict函數獲得數據集通過LDA的投影點坐標並構建繪圖數據集
ggplot(graphset, aes(LD1,LD2)+
geom_point+
theme_bw()+
theme(panel.grid.major = element_blank(),
      panel.grid.minor = element_blank())+
stat_ellipse(level = 0.95)+
xlab("LDA1(99.2%)")+ ylab("LDA2(0.8%)")#Proportion of trace

根據圖片可以看出,LDA投影的第一軸將訓練數據集區分的效果最好,接下來讓我們來檢驗模型對訓練集和測試集分類的精確度。

predictions <- predict(ldamodel, traindata)
mean(predictions$class == traindata$Species)

Predictions<- predict(ldamodel, testdata)
mean(predictions$class == testdata$Species)

在沒有對模型進行優化的情況下,訓練集97%的對象能被分類到正確的類別中,而測試集中所有的對象都匹配到正確的類別中,說明LDA分類模型的精確度是相當可靠的。我們證明了LDA分類的可信度,現在就可以試著用它來對數據集進行降維分類了。

library(tidyverse)
lda<- lda(Species~.,iris) %>%
    predict()
cbind(iris,lda$x) %>%
    ggplot(.,aes(LD1, LD2,color=Species)) +
    geom_point()+
    theme_bw()+
    theme(panel.grid.major = element_blank(),
          panel.grid.minor = element_blank())+
stat_ellipse(level = 0.95)+
xlab("LDA1(99.12%)")+ ylab("LDA2(0.88%)")

既然知道了LDA可以根據預先提供的分類信息準確地對數據集進行分類,那我們是否可以用a數據集中的分類特徵訓練機器學習模型,再使用模型去預測具有相同分類特徵的b數據集呢?

library(mlr)
test<- makeClassifTask(data=iris, target = "Species") #訓練lda機器學習模型
lda <- makeLearner("classif.lda")
ldaModel <- train(lda, test)
LdaModelResult <- getLearnerModel(ldaModel)

#LdaPreds <- predict(LdaModelResult)$x
#head(LdaPreds) #正常的lda降維分
kFold <- makeResampleDesc(method = "RepCV", folds = 10, reps = 50,
                          stratify = TRUE)
ldaCV <- resample(learner = lda, task = test, resampling = kFold,
                  measures = list(mmce, acc))#10倍交叉檢驗,檢驗模型精確度


交叉驗證的結果顯示模型的準確度達到98%

newcase<- tibble(Sepal.Length= runif(50,min=4,max=8),
                 Sepal.Width= runif(50,min=2,max=4.5),
                 Petal.Length= runif(50,min=1,max=7),
                 Petal.Width= runif(50,min=0,max=2.5))#創建新的待測數據集

case<- predict(ldaModel,newdata = newcase)#預測數據集結果
case$data

參考連結:

https://blog.sciencenet.cn/blog-661364-961033.html

https://mp.weixin.qq.com/s/nhfF70wiJHBw0IvYevcrfQ

https://mp.weixin.qq.com/s/Wsst2nLKu1xGNi0XN7iSBA

https://www.cnblogs.com/pinard/p/6244265.html

https://zhuanlan.zhihu.com/p/25595297

如果有什麼問題想要討論可以加群交流。

方法如下:

獲得途徑1,關注本公眾號,後臺回復 「客服微信」,小編將邀請您進群和我們一起交流和學習~

獲得途徑2,添加小編微信,小編將拉你進群



期待您的"分享"點讚"在看"

相關焦點

  • 運用sklearn進行線性判別分析(LDA)代碼實現
    基於sklearn的線性判別分析(LDA)代碼實現一、前言及回顧本文記錄使用sklearn庫實現有監督的數據降維技術——線性判別分析(LDA)。在上一篇LDA線性判別分析原理及python應用(葡萄酒案例分析),我們通過詳細的步驟理解LDA內部邏輯實現原理,能夠更好地掌握線性判別分析的內部機制。
  • 線性判別分析(LDA)及其在R中實現
    線性判別分析(Linear Discriminant Analysis,LDA)是一種用於數據降維以及分類預測的機器學習方法,由RA Fisher(1936)提出,也稱為Fisher判別式。最初的LDA只能處理兩種分類問題,Rao(1948)拓展了「多類別線性判別分析」或稱「多元判別分析」,將LDA推廣至適用於多分類的情形。
  • LDA線性判別分析
    問題線性判別分析(二分類情況)PCA和LDALDA降維實例小結  參考資料問題之前我們討論的 PCA降維,對樣本數據來言,可以是沒有類別標籤 y 的。如果我們做回歸時,如果特徵太多,那麼會產生不相關特徵引入、過度擬合等問題。我們可以使用PCA 來降維,但 PCA 沒有將類別標籤考慮進去,屬於無監督的。
  • 線性判別分析LDA
    線性判別分析是一種線性降維的方法,和之前ARGO提及的PCA(見文章主成分分析(PCA)入門)目的一樣,都是為了降低海量特徵以實現降維,但兩者又有顯著的不同。全文分成如下四個部分:PCA 回顧線性判別分析(LDA)多類別的線性判別分析使用LDA的限制一  PCA回顧介紹LDA之前,簡單的回顧一下之前講到的PCA。
  • 機器學習算法系列(十)-線性判別分析算法(一)(Linear Discriminant Analysis Algorithm)
    (3)使用S_b、S_w來代替中間部分,得到新的代價函數(4)其中S_b 被稱為"類間散度矩陣"(between-class scatter matrix)(5)其中S_w 被稱為"類內散度矩陣"(within-class
  • 線性判別分析LDA(Linear Discriminant Analysis)
    線性判別分析(二類情況)回顧我們之前的logistic回歸方法,給定m個n維特徵的訓練樣例(i從1到m),每個x(i)對應一個類標籤。我們就是要學習出參數,使得(g是sigmoid函數)。現在只考慮二值分類情況,也就是y=1或者y=0。為了方便表示,我們先換符號重新定義問題,給定特徵為d維的N個樣例,,其中有個樣例屬於類別,另外個樣例屬於類別。
  • 線性判別分析(LDA)原理總結
    小白學視覺」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達線性判別分析(Linear Discriminant Analysis,以下簡稱LDA)是有監督的降維方法,在模式識別和機器學習領域中常用來降維。
  • 【數據分析】R語言實現常用的5種數據分析(主成分+因子+多維標度+判別+聚類)
    正交旋轉的流行方法是方差最大化,需要在principal中增加rotate='varimax'參數加以實現。也有觀點認為主成分分析一般不需要進行旋轉。4 計算主成分得分主成分得分是各變量的線性組合,在計算出主成分得分之後,還可以將其進行回歸等做進一步分析處理。但注意如果輸入數據不是原始數據時,則無法計算主成分得分。
  • R語言實現常用的5種分析方法(主成分+因子+多維標度+判別+聚類
    :判別分析 判別分析(discriminant analysis)是一種分類技術。它通過一個已知類別的「訓練樣本」來建立判別準則,並通過預測變量來為未知類別的數據進行分類。 判別分析的方法大體上有三類,即Fisher判別、Bayes判別和距離判別。Fisher判別思想是投影降維,使多維問題簡化為一維問題來處理。選擇一個適當的投影軸,使所有的樣品點都投影到這個軸上得到一個投影值。
  • R語言實現常用的5種分析方法(主成分+因子+多維標度+判別+聚類)
    EFA和PCA的區別在於:PCA中的主成分是原始變量的線性組合,而EFA中的原始變量是公共因子的線性組合,因子是影響變量的潛在變量,變量中不能被因子所解釋的部分稱為誤差,因子和誤差均不能直接觀察到。進行EFA需要大量的樣本,一般經驗認為如何估計因子的數目為N,則需要有5N到10N的樣本數目。雖然EFA和PCA有本質上的區別,但在分析流程上有相似之處。
  • 線性分類模型(一):線性判別模型分析
    ,線性分類模型分為判別式模型和生成式模型,本文首先簡單複習了與算法相關的數學基礎知識,然後分析各線性判別式分類算法,如最小平方法,Fisher線性判別法和感知器法,最後總結全文。目錄1、相關的數學知識回顧2、判別式模型和生成性模型3、最小平方法4、Fisher線性判別函數5、感知器算法6、總結1、直線方程和平面方程拓展到分類思想:
  • 經典分類:線性判別分析模型!
    作者:小雨姑娘,康乃狄克大學,Datawhale成員這幾天看了看SVM的推導,看的是真的頭疼,那就先梳理基礎的線性判別分析模型
  • Python文本挖掘——LDA模型實現
    、Jordan於2003年提出,用來推測文檔的主題分布。它可以將文檔集中每篇文檔的主題以概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題分布後,便可以根據主題分布進行主題聚類或文本分類。2、原理LDA模型它是一種典型的詞袋模型,即一篇文檔是由一組詞構成,詞與詞之間沒有先後順序的關係。此外,一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。
  • sklearn與機器學習系列專題之降維(二)一文弄懂LDA特徵篩選&降維
    這時候,就要線性判別分析降維(Linear discriminant Analysis,LDA)隆重登場啦!線性判別分析(也有叫做Fisher Linear Discriminant),是一種有監督的線性降維算法,與PCA算法尋找數據集中方差最大的方向作為主成分分量的軸不同,LDA是為了使得降維後的數據點儘可能地容易被區分。
  • 線性判別分析總覽
    該基因表達水平能較好地實現對腫瘤患者的分類,發現大部分反應者的該基因表達水平較低(左側),大分部非反應者的該基因表達水平較高(右側),但反應者與非反應者的該基於表達水平也有一定的重疊(中間)。②使用兩個基因的表達水平對患者進行分類。
  • R中常用數據挖掘算法包
    下面對常用的數據挖掘包做一個匯總:連續因變量的預測:stats包 lm函數,實現多元線性回歸stats包 glm函數,實現廣義線性回歸stats包 nls函數,實現非線性最小二乘回歸rpart包 rpart函數,基於CART算法的分類回歸樹模型RWeka包 M5P函數,模型樹算法,集線性回歸和CART算法的優點adabag包
  • 判別分析——注意事項
    通過前期的學習,我們已經知道判別分析是根據判別對象若干個指標的觀測結果判定其應屬於哪一類的數據統計方法;了解和鑑別四種常用判別方法的基本原理;掌握SPSS的Fisher判別和Bayes判別操作方法;學習判別分析效果評價的方法。判別分析的最後一期內容,檸檬精給大家準備的是判別分析的注意事項,以作補充。
  • 特徵工程總結:R與python的比較實現
    .cv <- cv.glmnet(iris.matrix, target, family = "multinomial", alpha = 1, nfolds = 10)plot(r2.cv)r2.min <- glmnet(iris.matrix, target, family = "multinomial", alpha = 1, lambda = r2.cv$lambda.min
  • 特徵錦囊:怎麼簡單使用LDA來劃分數據且可視化呢?
    LDA算法在數據挖掘中是很基礎的算法,簡單回顧一下定義:LDA的全稱為Linear Discriminant Analysis, 中文為線性判別分析,LDA是一種有監督學習的算法,和PCA不同。PCA是無監督算法,。
  • 分類分析之判別分析,SPSS判別分析實操
    判別分析是常用的一種分類分析方法。與聚類分析不同的是【聚類分析是直接比較各事物之間的性質,將性質相近的歸為一類,將性質差別較大的歸入不同的類。>定義:判別分析先根據已知類別的事物的性質(自變量),建立函數式(自變量的線性組合,即判別函數),然後對未知類別的新事物進行判斷以將之歸入已知的類別中。