LDA(思路和代码)
LDA的思路
LDA就是投影之后,类内的方差最小,但是不同类之间的方差最大。它是一种监督学习的降维技术。
LDA算法主要流程如下:
输入:数据集 𝐷={(𝑥1,𝑦1),(𝑥2,𝑦2),…,((𝑥𝑚,𝑦𝑚))}, 其中任意样本 𝑥𝑖 为n维向量,𝑦𝑖∈{𝐶1,𝐶2,…,𝐶𝑘}, 降维到的维度d。
输出:降维后的样本集𝐷′
1) 计算类内散度矩阵 𝑆𝑤
2) 计算类间散度矩阵 𝑆𝑏
3) 计算矩阵 𝑆−1𝑤𝑆𝑏
4) 计算 𝑆−1𝑤𝑆𝑏 的最大的d个特征值和对应的d个特征向量 (𝑤1,𝑤2,…𝑤𝑑), 得到投影矩阵𝑊
5) 对样本集中的每一个样本特征 𝑥𝑖,转化为新的样本 𝑧𝑖=𝑊𝑇𝑥𝑖
6) 得到输出样本集 𝐷′={(𝑧1,𝑦1),(𝑧2,𝑦2),…,((𝑧𝑚,𝑦𝑚))}
LDA算法的主要优点有:
1)在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。
2)LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优。
LDA算法的主要缺点有:
1)LDA不适合对非高斯分布样本进行降维,PCA也有这个问题。
2)LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。当然目前有一些LDA的进化版算法可以绕过这个问题。
3)LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。
4)LDA可能过度拟合数据。
代码
首先生成三维三类的数据
# 导入相关包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import *
# 生成三类三维特征的数据
X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
n_clusters_per_class=1,class_sep =0.5, random_state =10)
# 数据可视化
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)
把数据降维 降维到二维
# 导入相关包
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 使用LDA降维
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X,y)
X_new = lda.transform(X)
# 降维数据可视化
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
plt.show()