目录
LDA-原理解析_Nine-days的博客-CSDN博客_lda
(这一篇的原理讲的 比较容易懂)
LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。
LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。
也就是说,我们要将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
| 降维方法 | 思想 | 分布 | 监督方式 | 投影 | 维度 | 目的 |
|---|---|---|---|---|---|---|
| PCA | 数据降维,矩阵特征分解 | 假设数据符合高斯分布 | 无监督 | 投影的坐标系都是正交的 | 直接和特征维度相关,比如原始数据是d维,PCA之后,可以任意选取1~n维 | 去除原始数据集中冗余的维度,让投影子空间各个维度的方差尽可能大 |
| LDA | 数据降维,矩阵特征分解 | 假设数据符合高斯分布 | 有监督 | 根据类别的标注关注分类能力,不保证投影到的坐标系是正交的 | 与数据本身的维度无关,和类别个数C相关,LDA之后,在1~C-1维进行选择 | 找到具有区分的维度,使得原始数据在这些维度上的投影能尽可能区分不同类别 |
举例来说,假设我们有两类数据 分别为红色和蓝色,如下图所示,这些数据特征是二维的,我们希望将这些数据投影到一维的一条直线,让每一种类别数据的投影点尽可能的接近,而红色和蓝色数据中心之间的距离尽可能的大。

具体可以看上面引用文章的第二篇,算是看了这么多下来稍微让我能懂一点点的文章了

在scikit-learn中, 实现LDA的类是sklearn.discriminant_analysis.LinearDiscriminantAnalysis。这既可以用于分类又可以用于降维。
LinearDiscriminantAnalysis类的参数如下:
sklearn的make_classification函数生成随机的n类分类_爱打羽毛球的小怪兽的博客-CSDN博客_make_classification是什么
python绘图基础—scatter用法_xiaobaicai4552的博客-CSDN博客_ax.scatter
- #生成三类三维特征的数据
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- from sklearn.datasets._samples_generator import make_classification
-
- 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)
- '''
- print(X)
- print("----")
- print(y)
- '''
-
- fig = plt.figure()
- ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20)
- plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)
- plt.show()

- #使用PCA降维到二维,注意PCA无法使用类别信息来降维
- from sklearn.decomposition import PCA
- pca = PCA(n_components=2)
- pca.fit(X)
- print("两个主成分方差比:")
- print(pca.explained_variance_ratio_)
- print("两个主成分方差:")
- print(pca.explained_variance_)
- X_new = pca.transform(X)
- print("PCA降维效果图:")
- plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
- plt.show()

- #使用LDA降维到二维
- from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
- lda = LinearDiscriminantAnalysis(n_components=2)
- lda.fit(X,y)
- X_new = lda.transform(X)
- print("LDA降维效果图:")
- plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)
- plt.show()
