线性鉴别分析(LDA):降维与分类的完善结合

打印 上一主题 下一主题

主题 1802|帖子 1802|积分 5406

在机器学习领域,线性鉴别分析(Linear Discriminant Analysis,简称LDA)是一种经典的算法,它在降维和分类任务中都表现出色。
LDA通过寻找特性空间中可以或许最大化类间方差和最小化类内方差的方向,实现数据的降维和分类。
本文主要介绍LDA的基本原理,展示其如何办理分类问题,以及在高维度数据降维中的应用。
1. 基本原理

简朴来说,线性鉴别分析(LDA)旨在找到一个线性组合,将数据投影到低维空间,使得不同种别的数据尽可能地分开,同一种别的数据尽可能地紧凑。
它通过寻找一个投影方向,使得投影后不同种别之间的方差最大,而同一种别内部的方差最小。
寻找投影方向时,LDA基于费舍尔鉴别准则,该准则通过最大化类间散度与类内散度的比值来寻找最佳投影方向。
LDA基本的盘算步骤如下:

  • 盘算类内散度矩阵:衡量同一种别内数据点的分布
  • 盘算类间散度矩阵:衡量不同种别之间的分布
  • 求解广义特性值问题:找到最大化类间间隔与类内间隔比值的投影方向
  • 选择最优投影方向:将数据投影到低维空间,同时保留分类信息
2. 如何有效降维数据

LDA在处理高维数据时具有显著上风,它通过将数据投影到低维空间,同时保持种别之间的分离度,来实现降维。
下面的示例演示如何使用LDA来实现数据的降维。
首先选择scikit-learn库中经典的鸢尾花数据集,这个数据集中每个数据有4个维度:花瓣的长度和宽度,花萼的长度和宽度。
整个数据集包含3个种别的鸢尾花。
下面通过LDA把数据集降低为2维,然后看看3个种别的鸢尾花在2维空间中是否能区分开来。
  1. from sklearn.datasets import load_iris
  2. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  3. import matplotlib.pyplot as plt
  4. # 加载鸢尾花数据集
  5. iris = load_iris()
  6. X = iris.data
  7. y = iris.target
  8. # 创建LDA模型,指定降维后的特征数量为2
  9. lda = LinearDiscriminantAnalysis(n_components=2)
  10. # 训练模型并降维
  11. X_lda = lda.fit_transform(X, y)
  12. # 绘制降维后的数据
  13. plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, cmap='viridis', edgecolors='k')
  14. plt.xlabel('LD1')
  15. plt.ylabel('LD2')
  16. plt.title('LDA 降低到2维')
  17. plt.show()
复制代码

从图中我们可以看出,虽然鸢尾花数据集从四个特性降维到两个维度。
但是,通过可视化降维后的数据,可以看到不同种别的数据点在新的二维空间中仍旧保持了良好的分离度。
下面再试试一个更高维度数据的降维,使用scikit-learn库中的手写数字数据集(MNIST)。
这个数据集中的每个数字图片是一个28x28的矩阵,也就是一个784维的数据。
我们将其降维到2维,看看结果如何。
  1. from sklearn.datasets import load_digits
  2. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  3. import matplotlib.pyplot as plt
  4. # 加载手写数字数据集
  5. digits = load_digits()
  6. X = digits.data
  7. y = digits.target
  8. # 创建LDA模型,降维到2维
  9. lda = LinearDiscriminantAnalysis(n_components=2)
  10. # 训练并投影数据
  11. X_lda = lda.fit_transform(X, y)
  12. # 可视化降维后的数据
  13. plt.figure()
  14. ten_colors = plt.get_cmap("tab10")(range(10))
  15. for c, i, target_name in zip(ten_colors, [0, 1, 2, 3, 4, 5, 6,7,8,9], ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']):
  16.     plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], color=c, label=target_name)
  17. plt.title('LDA降维后的手写数字数据')
  18. plt.xlabel('LDA 1')
  19. plt.ylabel('LDA 2')
  20. plt.legend()
  21. plt.show()
复制代码

从图中可以看出,0,2,3,4,6分离的还不错,但是1,5,8,9这几个数字映射到2维时重合的比较多。
不过,从784维降低到2维,还能有这样的区分度,LDA已经算是比较厉害了。
3. 如何处理分类问题

除了进行数据降维,LDA也可以处理分类问题,同样上面的鸢尾花数据集,这次不降维直接训练模型进行分类。
  1. import matplotlib.pyplot as plt
  2. from sklearn.datasets import load_iris
  3. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  4. from sklearn.model_selection import train_test_split
  5. from sklearn.metrics import accuracy_score
  6. # 加载数据集
  7. data = load_iris()
  8. X = data.data
  9. y = data.target
  10. # 划分训练集和测试集
  11. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  12. # 创建LDA模型
  13. lda = LinearDiscriminantAnalysis()
  14. # 训练模型
  15. lda.fit(X_train, y_train)
  16. # 预测
  17. y_pred = lda.predict(X_test)
  18. # 计算准确率
  19. accuracy = accuracy_score(y_test, y_pred)
  20. print(f"分类准确率: {accuracy:.2f}")
  21. ## 输出结果:
  22. # 分类准确率: 1.00
复制代码
从结果来看,LDA分类的正确率高达100%。
再试试高维度的手写数字数据集(MNIST)。
  1. from sklearn.datasets import load_digits
  2. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
  3. import matplotlib.pyplot as plt
  4. # 加载手写数字数据集
  5. digits = load_digits()
  6. X = digits.data
  7. y = digits.target
  8. # 划分训练集和测试集
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  10. # 创建LDA模型
  11. lda = LinearDiscriminantAnalysis()
  12. # 训练模型
  13. lda.fit(X_train, y_train)
  14. # 预测
  15. y_pred = lda.predict(X_test)
  16. # 计算准确率
  17. accuracy = accuracy_score(y_test, y_pred)
  18. print(f"分类准确率: {accuracy:.2f}")
  19. ## 输出结果:
  20. # 分类准确率: 0.95
复制代码
结果还不错,也有95%的正确率。
4.  总结

线性鉴别分析(LDA)是一种经典的线性模型,它在降维分类任务中都表现出色。
LDA的主要特点如下:

  • 监督学习:LDA是一种监督学习方法,它需要利用标签信息来训练模型。
  • 线性投影:LDA通过寻找特性空间中的线性组合,将数据投影到低维空间。
  • 最大化类间方差和最小化类内方差:LDA的目标是最大化不同种别之间的分离度,同时最小化同一种别内部的差异。
  • 适用于高维数据:LDA可以有效地处理高维数据,通过降维来降低盘算复杂度。
  • 分类降维双重功能:LDA不仅可以用于分类,还可以用于降维。
LDA在线性模型中具有重要的地位,它结合了降维和分类的优点,是一种非常实用的算法。
然而,LDA也有一些范围性,例如它假设数据服从正态分布,并且类内方差相称。
在实际应用中,我们需要根据数据的特点选择符合的算法。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表