(數據科學學習手札18)二次判別分析的原理簡介&Python與R實現


上一篇我們介紹了Fisher線性判別分析的原理及實現,而在判別分析中還有一個很重要的分支叫做二次判別,本文就對二次判別進行介紹:

二次判別屬於距離判別法中的內容,以兩總體距離判別法為例,對總體G1,,G2,當他們各自的協方差矩陣Σ1,Σ2不相等時,判別函數因為表達式不可化簡而不再是線性的而是二次的,這時使用的構造二次判別函數進行判別類別的方法叫做二次判別法,下面分別在R和Python中實現二次判別:

 

R

在R中,常用的二次判別函數qda(formula,data)集成在MASS包中,其中formula形式為G~x1+x2+x3,G表示類別變量所在列的名稱,~右端連接的累加式表示用來作為特征變量的元素對應的列名稱,data為包含前面所述各變量的數據框,下面對鳶尾花數據進行二次判別,這里因為樣本量較小,故采用bootstrap自助法進行抽樣以擴充訓練集與驗證集,具體過程如下:

rm(list=ls())
library(MASS)

#掛載鳶尾花數據
data(iris)
data <- iris

#bootstrap法產生訓練集
sam <- sample(1:length(data[,1]),10000,replace = T)
train_data <- data[sam,]

#bootstrap法產生測試集
sam <- sample(1:length(data[,1]),2000,replace = T)
test_data <- data[sam,]

#訓練二次判別模型
qd <- qda(Species~.,data=train_data)

#保存預測結果
pr <- predict(qd,test_data[,1:4])
#打印混淆矩陣
(tab <- table(test_data[,5],pr$class))
#打印分類正確率
cat('正確率:',sum(diag(tab))/length(test_data[,1]))

分類結果如下:

 

Python

這里和前一篇線性判別相似,我們使用sklearn包中的discriminant_analysis.QuadraticDiscriminantAnalysis來進行二次判別,依舊是對鳶尾花數據進行分類,這里和前一篇一樣采用留出法分割訓練集與驗證集,具體代碼如下:

'''Fisher線性判別分析'''
import numpy as np
from sklearn import datasets
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()

X = iris.data
y = iris.target

'''二次判別器'''

'''利用sklearn自帶的樣本集划分方法進行分類,這里選擇訓練集測試集73開'''
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)
'''搭建LDA模型'''
qda = QuadraticDiscriminantAnalysis()
'''利用分割好的訓練集進行模型訓練並對測試集進行預測'''
qd = qda.fit(X_train,y_train).predict(X_test)
'''比較預測結果與真實分類結果'''
print(np.array([qd,y_test]))
'''打印正確率'''
print('正確率:',str(round(qda.score(X_test,y_test),2)))

 

以上就是關於二次判別的簡要內容,如有筆誤之處望指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM