日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R 实现线性判别分析教程

發(fā)布時間:2023/12/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 R 实现线性判别分析教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文介紹線性判別分析概念,并通過示例介紹R的實現(xiàn)過程。

介紹線性判別分析模型

線性判別分析用于基于一組變量把響應(yīng)變量分為倆類或更多的算法。但線性判別算法對數(shù)據(jù)有一些要求:

  • 響應(yīng)變量必須是類別變量。線性判別是分類算法,因此響應(yīng)變量應(yīng)該是類別變量。

  • 預(yù)測變量應(yīng)遵循正太分布。首先檢查每個預(yù)測變量是否大致符合正太分布,如果不滿足,需要選擇轉(zhuǎn)換算法使其近似滿足。

  • 每個預(yù)測變量有相同的標(biāo)準(zhǔn)差。現(xiàn)實中很難能夠滿足該條件,但我們可以對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化,讓變量統(tǒng)一為標(biāo)準(zhǔn)差為1,均值為0.

  • 檢查異常值。在用于LDA之前要檢查異常值。可以簡單通過箱線圖或散點圖查進(jìn)行檢測。

LDA模型在現(xiàn)實中應(yīng)用廣泛,下面簡單舉例:

  • 市場營銷

零售公司經(jīng)常使用LDA將購物者分為幾類。然后利用建立LDA模型來預(yù)測特定購物者是低消費者、中等消費者還是高消費者,使用預(yù)測變量如收入、年度總消費額和家庭人數(shù)等變量。

  • 醫(yī)學(xué)領(lǐng)域

醫(yī)院或醫(yī)療機(jī)構(gòu)的研究人員通常利用LDA預(yù)測給定一組異常細(xì)胞是否會導(dǎo)致輕微、中度或嚴(yán)重疾病。

  • 產(chǎn)品研發(fā)

一些公司會利用LDA模型預(yù)測消費者屬于每天、每周、每月或年使用他們的產(chǎn)品,基于預(yù)測變量有性別、年度收入、使用類似產(chǎn)品的頻率。

  • 生態(tài)領(lǐng)域

研究者利用LDA模型預(yù)測是否給定珊瑚礁的健康狀況:好、中等、壞、嚴(yán)重。預(yù)測變量包括大小、年度污染情況、年份。

加載實現(xiàn)庫

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個變量150個觀察記錄。下面通過線性判別分析模型對給定鳶尾花進(jìn)行分類。

我們使用下面四個預(yù)測變量:

  • Sepal.length
  • Sepal.Width
  • Petal.Length
  • Petal.Width

預(yù)測響應(yīng)變量為Species,分別包括三類:

  • setosa
  • versicolor
  • virginica

數(shù)據(jù)標(biāo)準(zhǔn)化

線性判別算法其中一個關(guān)鍵假設(shè)為每個預(yù)測變量具有相同的標(biāo)準(zhǔn)差。一種簡單辦法可以對預(yù)測變量進(jìn)行標(biāo)準(zhǔn)化,這樣預(yù)測變量統(tǒng)一為均值為0、方差為1。

我們使用內(nèi)置的scale函數(shù),并利用apply函數(shù)進(jì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)練和測試數(shù)據(jù)集

接下來我們把數(shù)據(jù)分為訓(xùn)練集和測試集:

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ù)實現(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

下面我們解釋上面的輸出:

  • 每組的先驗概率

這些表示訓(xùn)練集數(shù)據(jù)中每組的概率。如:所有訓(xùn)練集中35.8%的觀測值屬于virginica類別。

  • 組均值

這些數(shù)據(jù)顯示每類每個預(yù)測變量的均值。

  • 線性判別系數(shù)

這里展示了LDA模型的判別規(guī)則,每個預(yù)測變量的線性組合情況:

  • LD1: .792Sepal.Length + .571Sepal.Width – 4.076Petal.Length – 2.06Petal.Width
  • LD2: .529Sepal.Length + .713Sepal.Width – 2.731Petal.Length + 2.63Petal.Width
  • 分離百分比

這些展示了每個線性判別函數(shù)實現(xiàn)的分離百分比。

使用模型進(jìn)行預(yù)測

我們已經(jīng)使用訓(xùn)練數(shù)據(jù)擬合了模型,下面使用模型對測試數(shù)據(jù)進(jìn)行預(yù)測:

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

我們看到輸出列表中包括三個變量:

  • class 預(yù)測類型
  • posterior 每個類別對應(yīng)的后驗概率
  • x 線性判別

下面我們來看LDA模型正確預(yù)測類型的百分比:

mean(predicted$class == test$Species) # [1] 1

輸出顯示模型預(yù)測正確率100%。在現(xiàn)實世界中模型很少能夠預(yù)測每個類別都完全正確,因內(nèi)置iris數(shù)據(jù)集比較簡單,預(yù)測結(jié)果比較好。

可視化結(jié)果

最后,我們創(chuàng)建LDA圖形觀察線性判別模型,通過圖示方式展示三種類型區(qū)分情況:

library(ggplot2) lda_plot <- cbind(train, predict(model)$x)ggplot(lda_plot, aes(LD1, LD2)) + geom_point(aes(color=Species))

總結(jié)

以上是生活随笔為你收集整理的R 实现线性判别分析教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。