scikit-learn 学习 (六) 线性和二次判别分析

线性判别分析 (discriminant_analysis.LinearDiscriminantAnalysis) 和二次判别分析 (discriminant_analysis.QuadraticDiscriminantAnalysis) 是两种经典分类器, 分别有线性和二次的决策平面.

这些分类器是吸引人的是他们有闭形式解并容易计算, 多分类并且在实际中应用好, 不需要调整超参数.

上图展示了线性判别分析和二次判别分析的决策边界. 下面一行说明线性判别分析只能学习线性边界, 二次判别分析可以学习二次边界因此更灵活.

Examples:

这个例子绘制了LDA和QDA学习的每个类别的协方差椭球和决策边界。 椭球显示每类的双重标准偏差。 对于LDA,所有类别的标准差是相同的,而每个类别与QDA有其自己的标准偏差。

使用线性判别分析降维

discriminant_analysis.LinearDiscriminantAnalysis 可以进行监督学习降维, 通过投影输入的数据到一个线性子空间包括最大化类的分隔的方向, 输出的维数少于类的数目, 所以这通常是一个相当强的维度降低,只能在多类别的环境中有意义。

通过 discriminant_analysis.LinearDiscriminantAnalysis.transform 实现. 目标维数使用 n_components 参数. 这个参数对 discriminant_analysis.LinearDiscriminantAnalysis.fit or discriminant_analysis.LinearDiscriminantAnalysis.predict 没有影响.

Examples:

应用于此数据的主成分分析(PCA)标识了占据数据差异最大的属性(主要成分或特征空间中的方向)的组合。 在这里,我们绘制了2个第一主成分上的不同样本。

线性判别分析(LDA)尝试识别占各类之间差异最大的属性。 具体而言,与PCA相比,LDA是使用已知类别标签的监督方法。

1
2
3
4
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
1
2
3
4
5
6
7
8
9
10
11
12
13
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)

# Percentage of variance explained for each components
print('explained variance ratio (first two components): %s' % str(pca.explained_variance_ratio_))
explained variance ratio (first two components): [ 0.92461621  0.05301557]
1
2
3
4
5
6
7
8
9
10
%matplotlib inline
plt.figure()
colors = ['navy', 'turquoise', 'darkorange']
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=0.8,
lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS dataset')
Text(0.5,1,'PCA of IRIS dataset')

png

1
2
3
4
5
6
plt.figure()
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=0.8, color=color,
label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA of IRIS dataset')
Text(0.5,1,'LDA of IRIS dataset')

png

LDA 与 QDA 分类器数学推导

LDA 与 QDA 都可以通过简单的概率模型导出. 每一类 k 有条件分布

使用贝叶斯规则可得

我们选择最大化条件概率的 k.

特别地, 线性或者二次判别分析

为了使用这个模型, 我们需要从训练数据中估计先验 P(y = k).(通过类k的实例的比例),类的均值(通过经验样本类的均值) 和协方差矩阵(或者由经验样本类协方差矩阵,或者由正则化估计量:参见下面的收缩部分)。

在LDA中, 每一类的高斯函数假定共享同一个协方差阵. 这产生了一个线性决策面

QDA 中没有对协方差矩阵的假设, 因此有二次决策面

LDA 降维数学公式

为了理解在降维中使用LDA,从上面解释的LDA分类规则的几何变换开始是有用的。 我们记K为目标类的总数。 由于在LDA中,我们假设所有类别具有相同的估计协方差Σ,我们可以重新调整数据以便这个协方差是同一:

那么可以表明,在缩放之后对数据点进行分类相当于找到距离欧式距离中的数据点最近的估计类别均值. 但是,在所有类别的所有均值生成的K-1仿射子空间H_K上投影之后,也可以这样做。 这表明,在LDA分类器中隐含着通过线性投影到K-1维空间上的降维.

收缩

收缩是一种改进协方差矩阵估计的工具,其中训练样本的数量与特征的数量相比较小。 在这种情况下,经验样本协方差是一个不好的估计量。 可以通过将discriminant_analysis.LinearDiscriminantAnalysis 类的收缩参数设置为“auto”来使用收缩LDA

收缩参数也可以手动设置在0和1之间。特别地,值0对应于没有收缩(这意味着将使用经验协方差矩阵),并且值1对应于完全收缩(这意味着对角线 方差矩阵将被用作协方差矩阵的估计)。 将此参数设置为这两个极值之间的值将估计协方差矩阵的缩小版本。

Examples:

分享到