线性判别分析基本原理
线性判别分析(Linear Discriminant Analysis, LDA)是一种可作为特征提取的技术,它可以提高数据分析过程中的计算效率,同时,对于不适用于正则化的模型,它可以降低因维数灾难带来的过拟合。
LDA的基本概念与PCA非常相似,PCA试图在数据集中找到方差最大的正交的主成分分量的轴,而LDA的目标是发现可以最优化分类的特征子空间。LDA与PCA都是可用于降低数据集维度的线性转换技巧。其中,PCA是无监督算法,而LDA是监督算法。与PCA相比,LDA是一种更优越的用于分类的特征提取技术。
下图解释了二类别分类中的LDA概念。类别1、类别2中的样本分别用叉号和圆点来表示:
如上图所示,在 x 轴方向(LD1),通过线性判定,可以很好地将呈现正态分布的两个类分开。虽然沿 y 轴(LD2)方向的线性判定保持了数据集的较大方差,但沿此方向无法提供关于类别区分的任何信息,因此他不是一个好的线性判定。
一个关于LDA的假设就是数据呈正态分布,此外,还假定各类别中数据具有相同的协方差矩阵,且样本的特征从统计上来讲是相互独立的。不过,即使一个或多个假设没有满足,LDA仍旧可以很好地完成降维工作。
计算散布矩阵
分别构建类内散布矩阵和类间散布矩阵。均值向量 mi m i 存储了类别 i 中样本的特征均值 um u m :
葡萄酒数据集的三个类别对应三个均值向量:
import pandas as pd
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None)
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.fit_transform(X_test)
import numpy as np
np.set_printoptions(precision=4)
mean_vecs = []
for label in range(1, 4):
mean_vecs.append(np.mean(X_train_std[y_train == label], axis=0))
print('MV %s: %s\n' % (label, mean_vecs[label - 1]))
计算结果如下:
MV 1: [ 0.9259 -0.3091 0.2592 -0.7989 0.3039 0.9608 1.0515 -0.6306 0.5354
0.2209 0.4855 0.798 1.2017]
MV 2: [-0.8727 -0.3854 -0.4437 0.2481 -0.2409 -0.1059 0.0187 -0.0164 0.1095
-0.8796 0.4392 0.2776 -0.7016]
MV 3: [ 0.1637 0.8929 0.3249 0.5658 -0.01 -0.9499 -1.228 0.7436 -0.7652
0.979 -1.1698 -1.3007 -0.3912]
通过均值向量,计算类内散布矩阵