上一篇我們介紹了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)))
以上就是關於二次判別的簡要內容,如有筆誤之處望指出。