机器学习(第2版)
上QQ阅读APP看书,第一时间看更新

2.1.7 判别分析

判别分析是通过对类别已知的样本进行模型判别,来实现对新样本的类别进行判断。它包括线性判别分析(Linear Discriminant Analysis,LDA)和二次判别分析(Quadratic Discriminant Analysis,QDA)两种类型。其中LDA会在2.2节进行详细说明,下面介绍QDA。

QDA是针对那些服从高斯分布,且均值不同、方差也不同的样本数据而设计的。它对高斯分布的协方差矩阵不做任何假设,直接使用每个分类下的协方差矩阵,因为数据方差相同的时候,一次判别就可以。但如果类别间的方差相差较大时,就需要使用二次决策平面。

【例2.2】 通过实例比较LDA和QDA的区别和分类效果。基于sklearn开源库中discriminant_analysis模块内置的LDA和QDA算法类,对随机生成的高斯分布的样本数据集进行分类。数据集的样本数为50,生成的数据集中一半是具有相同协方差矩阵的,另一半的协方差矩阵不相同。

LDA和QDA的预测过程均很简单,核心代码如下所示。

#LDA预测
lda = LinearDiscriminantAnalysis(solver="svd", store_covariance=True)
y_pred = lda.fit(X, y).predict(X)
splot = plot_data(lda, X, y, y_pred, fig_index=2 * i + 1)
#QDA预测
qda = QuadraticDiscriminantAnalysis(store_covariances=True)
y_pred = qda.fit(X, y).predict(X)
splot = plot_data(qda, X, y, y_pred, fig_index=2 * i + 2)

其中 plot_data()方法为自定义可视化函数,主要用于绘制分类区域和显示样本的预测结果等,对于预测错误的样本用五角星显示。两种算法的效果比较如图2-6所示。第一行的样本数据具有相同协方差矩阵,对于这类数据,LDA和QDA两种算法都可以预测正确。

图2-6(c)和图2-6(d)是针对具有不同协方差矩阵的样本进行的分类,可见,LDA只能学习到线性边界,而QDA可以学到二次边界,因此更加灵活。

(a) (c)(b) (d)

图2-6 LDA和QDA的效果比较

QDA和LDA的算法相似,它们之间的区别主要受方差和偏差两个因素的影响。模型的预测值和实际值之间的差异可以分解为方差和偏差,方差较高、误差较低的模型通常比较灵敏,这种情况的模型并没有变化,只是样本数据改变,其预测结果会产生较大的变化。反之,误差较高、方差较低的模型一般会比较迟钝,即使模型发生变化,依然不会使预测值改变。因此在其中如何取舍,就成了一个很重要的问题。

LDA的结果中方差较低,而QDA算法的相对误差更低。因此,在协方差矩阵很难估计准确时(例如在样本集比较少的情况下)适合采用LDA算法。而当样本集很大,或者类间协方差矩阵差异比较大的时候,采用QDA更加合适。