LinearDiscriminantAnalysis:用于降维的线性判别分析
用于降维的线性判别分析实现
from mlxtend.feature_extraction import LinearDiscriminantAnalysis
概览
线性判别分析 (LDA) 最常被用作模式分类和机器学习应用预处理步骤中的降维技术。其目标是将数据集投影到一个具有良好类可分离性的较低维度空间,以避免过拟合(“维度诅咒”)并降低计算成本。
Ronald A. Fisher 在 1936 年提出了 线性判别(多重测量在分类学问题中的应用),它也有一些作为分类器的实际用途。最初的线性判别是为 2 类问题描述的,后来在 1948 年由 C. R. Rao 推广为“多类线性判别分析”或“多重判别分析”(多重测量在生物分类问题中的应用)
一般的 LDA 方法与主成分分析非常相似,但除了寻找使数据方差最大化的分量轴 (PCA) 之外,我们还关注使多类别之间分离最大化的轴 (LDA)。
因此,简而言之,LDA 的目标通常是将一个特征空间(一个数据集的 n 维样本)投影到一个更小的子空间(其中),同时保持类别区分信息。
通常,降维不仅有助于降低给定分类任务的计算成本,还有助于通过最小化参数估计误差来避免过拟合(“维度诅咒”)。
总结 LDA 方法的 5 个步骤
下面列出了进行线性判别分析的 5 个一般步骤。
- 计算维均值向量,用于数据集中的不同类别。
- 计算散布矩阵(类间散布矩阵和类内散布矩阵)。
- 计算特征向量()和对应的特征值()用于散布矩阵。
- 按特征值降序排列特征向量并选择个具有最大特征值的特征向量形成一个维矩阵(其中每列代表一个特征向量)。
- 使用这个特征向量矩阵将样本转换到新的子空间。这可以用数学公式概括为(其中是一个维矩阵,代表个样本,并且是转换后的维样本在新子空间中的)。
参考资料
- Fisher, Ronald A. “多重测量在分类学问题中的应用。” Annals of eugenics 7.2 (1936): 179-188。
- Rao, C. Radhakrishna. “多重测量在生物分类问题中的应用。” Journal of the Royal Statistical Society. Series B (Methodological) 10.2 (1948): 159-203。
示例 1 - 在 Iris 数据集上使用 LDA
from mlxtend.data import iris_data
from mlxtend.preprocessing import standardize
from mlxtend.feature_extraction import LinearDiscriminantAnalysis
X, y = iris_data()
X = standardize(X)
lda = LinearDiscriminantAnalysis(n_discriminants=2)
lda.fit(X, y)
X_lda = lda.transform(X)
import matplotlib.pyplot as plt
with plt.style.context('seaborn-whitegrid'):
plt.figure(figsize=(6, 4))
for lab, col in zip((0, 1, 2),
('blue', 'red', 'green')):
plt.scatter(X_lda[y == lab, 0],
X_lda[y == lab, 1],
label=lab,
c=col)
plt.xlabel('Linear Discriminant 1')
plt.ylabel('Linear Discriminant 2')
plt.legend(loc='lower right')
plt.tight_layout()
plt.show()
示例 2 - 绘制类间方差解释比率
from mlxtend.data import iris_data
from mlxtend.preprocessing import standardize
from mlxtend.feature_extraction import LinearDiscriminantAnalysis
X, y = iris_data()
X = standardize(X)
lda = LinearDiscriminantAnalysis(n_discriminants=None)
lda.fit(X, y)
X_lda = lda.transform(X)
import numpy as np
tot = sum(lda.e_vals_)
var_exp = [(i / tot)*100 for i in sorted(lda.e_vals_, reverse=True)]
cum_var_exp = np.cumsum(var_exp)
with plt.style.context('seaborn-whitegrid'):
fig, ax = plt.subplots(figsize=(6, 4))
plt.bar(range(4), var_exp, alpha=0.5, align='center',
label='individual explained variance')
plt.step(range(4), cum_var_exp, where='mid',
label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal components')
plt.xticks(range(4))
ax.set_xticklabels(np.arange(1, X.shape[1] + 1))
plt.legend(loc='best')
plt.tight_layout()
API
LinearDiscriminantAnalysis(n_discriminants=None)
线性判别分析类
参数
-
n_discriminants
: int (默认值: None)用于转换的判别器数量。如果为
None
,则保留数据集的原始维度。
属性
-
w_
: 类似数组,形状=[特征数, 判别器数]投影矩阵
-
e_vals_
: 类似数组,形状=[特征数]按排序顺序排列的特征值。
-
e_vecs_
: 类似数组,形状=[特征数]按排序顺序排列的特征向量。
示例
有关使用示例,请参阅 https://mlxtend.cn/mlxtend/user_guide/feature_extraction/LinearDiscriminantAnalysis/
方法
fit(X, y, n_classes=None)
使用 X 拟合 LDA 模型。
参数
-
X
: {类似数组,稀疏矩阵},形状 = [样本数, 特征数]训练向量,其中 n_samples 是样本数,n_features 是特征数。
-
y
: 类似数组,形状 = [样本数]目标值。
-
n_classes
: int (默认值: None)一个正整数,用于声明类别标签的数量,如果部分训练集中未包含所有类别标签。如果为 None,则自动获取类别标签的数量。
返回值
self
: 对象
transform(X)
对 X 应用线性转换。
参数
-
X
: {类似数组,稀疏矩阵},形状 = [样本数, 特征数]训练向量,其中 n_samples 是样本数,n_features 是特征数。
返回值
-
X_projected
: np.ndarray,形状 = [样本数, 判别器数]投影后的训练向量。