上一篇我们介绍了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
sam
train_data
sam
test_data
qd
pr
(tab
cat('正确率:',sum(diag(tab))/length(test_data[,1]))
分类结果如下:
Python
这里和前一篇线性判别相似,我们使用sklearn包中的discriminant_analysis.QuadraticDiscriminantAnalysis来进行二次判别,依旧是对鸢尾花数据进行分类,这里和前一篇一样采用留出法分割训练集与验证集,具体代码如下:
'''Fisher线性判别分析'''
importnumpy as npfrom sklearn importdatasetsfrom sklearn.discriminant_analysis importQuadraticDiscriminantAnalysisfrom sklearn.model_selection importtrain_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)))
以上就是关于二次判别的简要内容,如有笔误之处望指出。