基于sklearn的线性判别分析(LDA)代码实现

一、前言及回顾

本文记录使用sklearn库实现有监督的数据降维技术——线性判别分析(LDA)。在上一篇LDA线性判别分析原理及python应用(葡萄酒案例分析),我们通过详细的步骤理解LDA内部逻辑实现原理,能够更好地掌握线性判别分析的内部机制。当然,在以后项目数据处理,我们有更高效的实现方法,这篇将记录学习基于sklearn进行LDA数据降维,提高编码速度,而且会感觉更加简单。

LDA详细介绍与各步骤实现请看上回:LDA线性判别分析原理及python应用(葡萄酒案例分析)

学习之后可以对数据降维处理两种实现方法进行对比:

  1. 无监督的PCA技术:主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)
  2. 有监督的LDA技术:LDA线性判别分析原理及python应用(葡萄酒案例分析)

二、定义分类结果可视化函数

这个函数与上一篇文章 运用sklearn进行主成分分析(PCA)代码实现 里是一样的,plot_decision_region函数在分类结果区别决策区域中可以复用。

  1. def plot_decision_regions(x, y, classifier, resolution=0.02):
  2. markers = ['s', 'x', 'o', '^', 'v']
  3. colors = ['r', 'g', 'b', 'gray', 'cyan']
  4. cmap = ListedColormap(colors[:len(np.unique(y))])
  5.  
  6. x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
  7. x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
  8. xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
  9. z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
  10. z = z.reshape(xx1.shape)
  11. plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
  12.  
  13. for idx, cc in enumerate(np.unique(y)):
  14. plt.scatter(x=x[y == cc, 0],
  15. y=x[y == cc, 1],
  16. alpha=0.6,
  17. c=cmap(idx),
  18. edgecolor='black',
  19. marker=markers[idx],
  20. label=cc)

三、10行代码实现葡萄酒数据集分类

sklearn依然实现了LDA类方法,我们只需要直接调用而无需自己实现内部逻辑,这样显得更加方便。所以,10行代码实现也不为过,重点需要先理解内部逻辑原理。

关键代码如下:

  1. lda = LDA(n_components=2)
  2. lr = LogisticRegression()
  3. x_train_lda = lda.fit_transform(x_train_std, y_train) # LDA是有监督方法,需要用到标签
  4. x_test_lda = lda.fit_transform(x_test_std, y_test) # 预测时候特征向量正负问题,乘-1反转镜像
  5. lr.fit(x_train_lda, y_train)
  6. plot_decision_regions(x_train_pca, y_train, classifier=lr)
  7. plt.xlabel('LD1')
  8. plt.ylabel('LD2')
  9. plt.legend(loc='lower left')
  10. plt.show()

使用训练集拟合模型之后,分类效果如何呢?

可以看到模型对训练数据集精确地分类,比PCA效果好,因为LDA使用了数据集的标签,是有监督的学习。

更准确来说,我们要看模型在测试集上的效果,对比如下:

可见,经过逻辑回归分类器,提取了两个最具线性判别性的特征,将包含13个特征的葡萄酒数据集投影到二维子空间,实现了精确地分类。

四、完整代码

  1. from sklearn.linear_model import LogisticRegression
  2. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.model_selection import train_test_split
  5. from matplotlib.colors import ListedColormap
  6. import matplotlib.pyplot as plt
  7. import pandas as pd
  8. import numpy as np
  9.  
  10. def plot_decision_regions(x, y, classifier, resolution=0.02):
  11. markers = ['s', 'x', 'o', '^', 'v']
  12. colors = ['r', 'g', 'b', 'gray', 'cyan']
  13. cmap = ListedColormap(colors[:len(np.unique(y))])
  14. x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
  15. x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
  16. xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
  17. z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
  18. z = z.reshape(xx1.shape)
  19. plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
  20.  
  21. for idx, cc in enumerate(np.unique(y)):
  22. plt.scatter(x=x[y == cc, 0],
  23. y=x[y == cc, 1],
  24. alpha=0.6,
  25. c=cmap(idx),
  26. edgecolor='black',
  27. marker=markers[idx],
  28. label=cc)
  29.  
  30. def main():
  31. # load data
  32. df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加载
  33. # df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',
  34. # header=None) # 服务器加载
  35.  
  36. # split the data,train:test=7:3
  37. x, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values
  38. x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, stratify=y, random_state=0)
  39.  
  40. # standardize the feature 标准化单位方差
  41. sc = StandardScaler()
  42. x_train_std = sc.fit_transform(x_train)
  43. x_test_std = sc.fit_transform(x_test)
  44.  
  45. lda = LDA(n_components=2)
  46. lr = LogisticRegression()
  47. x_train_lda = lda.fit_transform(x_train_std, y_train) # LDA是有监督方法,需要用到标签
  48. x_test_lda = lda.fit_transform(x_test_std, y_test) # 预测时候特征向量正负问题,乘-1反转镜像
  49. lr.fit(x_train_lda, y_train)
  50. plt.figure(figsize=(6, 7), dpi=100) # 画图高宽,像素
  51. plt.subplot(2, 1, 1)
  52. plot_decision_regions(x_train_lda, y_train, classifier=lr)
  53. plt.title('Training Result')
  54. plt.xlabel('LD1')
  55. plt.ylabel('LD2')
  56. plt.legend(loc='lower left')
  57.  
  58. plt.subplot(2, 1, 2)
  59. plot_decision_regions(x_test_lda, y_test, classifier=lr)
  60. plt.title('Testing Result')
  61. plt.xlabel('LD1')
  62. plt.ylabel('LD2')
  63. plt.legend(loc='lower left')
  64. plt.tight_layout() # 子图间距
  65. plt.show()
  66.  
  67. if __name__ == '__main__':
  68. main()

五、降维压缩数据技术总结

至此,数据降维压缩的技术学习告一段落,经过这次学习,我感觉到一次比较系统的学习会收获更多,此次学习了主成分分析(PCA)和线性判别分析(LDA),这两种经典的数据降维技术各有特点。

前者是无监督技术,忽略分类标签,寻找最大化方差方向提取主成分;后者是有监督技术,训练时候考虑分类标签,在线性特征空间最大化类的可分性。应用场景也各有优势,PCA在图像识别应用好,LDA在特征提取方面更有优势。

这里列出这次学习过程的博文记录,方便查找:

  1. 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)
  2. 运用sklearn进行主成分分析(PCA)代码实现
  3. LDA线性判别分析原理及python应用(葡萄酒案例分析)
  4. 运用sklearn进行线性判别分析(LDA)代码实现

我的博客园:运用sklearn进行线性判别分析(LDA)代码实现

我的CSDN:https://blog.csdn.net/Charzous/article/details/108064317

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Charzous/article/details/108064317

运用sklearn进行线性判别分析(LDA)代码实现的更多相关文章

  1. 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA

    本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...

  2. 机器学习理论基础学习3.2--- Linear classification 线性分类之线性判别分析(LDA)

    在学习LDA之前,有必要将其自然语言处理领域的LDA区别开来,在自然语言处理领域, LDA是隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA),是一种处理文档的主题 ...

  3. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  4. 线性判别分析LDA详解

    1 Linear Discriminant Analysis    相较于FLD(Fisher Linear Decriminant),LDA假设:1.样本数据服从正态分布,2.各类得协方差相等.虽然 ...

  5. 线性判别分析 LDA

    点到判决面的距离 点\(x_0\)到决策面\(g(x)= w^Tx+w_0\)的距离:\(r={g(x)\over \|w\|}\) 广义线性判别函数 因任何非线性函数都可以通过级数展开转化为多项式函 ...

  6. 机器学习中的数学-线性判别分析(LDA)

    前言在之前的一篇博客机器学习中的数学(7)——PCA的数学原理中深入讲解了,PCA的数学原理.谈到PCA就不得不谈LDA,他们就像是一对孪生兄弟,总是被人们放在一起学习,比较.这这篇博客中我们就来谈谈 ...

  7. 主成分分析(PCA)与线性判别分析(LDA)

    主成分分析 线性.非监督.全局的降维算法 PCA最大方差理论 出发点:在信号处理领域,信号具有较大方差,噪声具有较小方差 目标:最大化投影方差,让数据在主投影方向上方差最大 PCA的求解方法: 对样本 ...

  8. LDA线性判别分析原理及python应用(葡萄酒案例分析)

    目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...

  9. 线性判别分析(LDA)准则:FIsher准则、感知机准则、最小二乘(最小均方误差)准则

    准则 采用一种分类形式后,就要采用准则来衡量分类的效果,最好的结果一般出现在准则函数的极值点上,因此将分类器的设计问题转化为求准则函数极值问题,即求准则函数的参数,如线性分类器中的权值向量. 分类器设 ...

随机推荐

  1. 2020JAVA最新应对各种OOM代码样例及解决办法

    引言 作者:黄青石 链接:https://www.cnblogs.com/huangqingshi/p/13336648.html?utm_source=tuicool&utm_medium= ...

  2. 最小割&网络流应用

    重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...

  3. C#串模板

    c# 6.0 的语言特性,功能类似string.formate,更方便的地方在于不要像format一样使用索引,可以直接使用变量. 使用方法如下: string name = "zhangs ...

  4. 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门

    百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...

  5. SQL语法入门

    SQL语句概述 ·SQL定义:是一种特定目的编程语言,用于管理关系数据库 ·GaussDB T是一种关系数据库,SQL语句包括 1.DDL 数据定义语言,用于定义或修改数据库中的对象(表,视图,序列, ...

  6. 题解 UVA1608 【不无聊的序列 Non-boring sequences】

    思路: 算法很显然: 一.在区间\([l,r]\)找到一个只出现一次的元素P(如果不存在,那么序列\(boring\)) 二.递归处理区间\([l,p-1]\)和区间\([p+1,r]\). 其关键在 ...

  7. 常用核心数据库查询sql

    一.查询账户信息 -- 查询数据量 /*{"xdb_comment":"1","table":"mb_tran_hist" ...

  8. ES Reindex用java来实现

    简单的: 核心代码 //发送请求 ReindexRequestBuilder builder=ReindexAction.INSTANCE.newRequestBuilder(client).sour ...

  9. linux下快速列出局域网中所有主机名(计算机名)的脚本

    最近有列出局域网中所有主机名的需求(SMB协议里的),但是findsmb命令总是列不全,搜了搜网上也没什么现成的解决方案,于是自己写了个python脚本 脚本会扫描局域网arp表中所有ip,并尝试解析 ...

  10. Python Tuple(元组) min()方法

    描述 Python 元组 min() 函数返回元组中元素最小值.高佣联盟 www.cgewang.com 语法 min()方法语法: min(tuple) 参数 tuple -- 指定的元组. 返回值 ...