详解 LDA

article/2025/11/10 14:18:51

详解 LDA

  • 详解 LDA
    • 基本概念
      • 什么是LDA
      • LDA 核心思想
      • LDA 简单二分类实例
    • 实现步骤(python)
      • 第一步 标准化处理
      • 第二步 计算每一类别特征的均值向量
      • 第三步 计算类间散布矩阵S(B)和类内散布矩阵S(W)
      • 第四步 计算矩阵S(W)^(-1)S(B)的特征值和对应的特征向量
      • 第五步 选取前k个特征和对应的特征向量,构造一个d×k维的转换矩阵W,其中特征向量以列的形式排列
      • 第六步 将训练样本通过转换矩阵W映射到新的特征空间
    • 使用scikit-learn实现LDA分析

详解 LDA

基本概念

什么是LDA

线性判别分析(LDA)是一种有监督算法,同时经常来数据进行降维,

相比于 PCA , LDA 可以作为一种有监督的降维算法 。在 PCA 中 ,算法没有考虑数据的标签(类别) , 只是把原数据映射到一些方差比较大的方向上而已。

看一个实例:
在这里插入图片描述
在这里插入图片描述
可以看出,如果是PCA的话,为了方差最大化,会选择投影到左边,而LDA则会选择投影到下面。

LDA 核心思想

LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。也就是说,要将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大:
在这里插入图片描述

LDA 简单二分类实例

假设有两类数据,分别为红色和蓝色,如下图所示,这些数据特征是二维的,希望将这些数据投影到一维的一条直线,让每一种类别数据的投影点尽可能的接近,而红色和蓝色数据中心之间的距离尽可能的大。
在这里插入图片描述
上图中提供了两种投影方式,哪一种能更好的满足我们的标准呢?

从直观上可以看出,右图要比左图的投影效果好,因为右图的黑色数据和蓝色数据各个较为集中,且类别之间的距离明显。左图则在边界处数据混杂。

以上就是LDA的主要思想了,当然在实际应用中,数据是多个类别的,我们的原始数据一般也是超过二维的,投影后的也一般不是直线,而是一个低维的超平面。

实现步骤(python)

第一步 标准化处理

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_splitif __name__ == "__main__":# 获取葡萄酒的数据data = pd.read_csv("G:/dataset/wine.csv")# 将数据分为x和yx,y = data.ix[:,1:],data.ix[:,0]# 将数据分为训练集和测试集train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=1)#对数据进行标准化处理std = StandardScaler()train_x_std = std.fit_transform(train_x)test_x_std = std.fit_transform(test_x)

第二步 计算每一类别特征的均值向量

  #用来存放不同类别特征的平均值向量mean_vecs = []#葡萄酒数据集一共有3个类别1,2,3for label in range(1,4):mean_vecs.append(np.mean(train_x_std[label==train_y],axis=0))

第三步 计算类间散布矩阵S(B)和类内散布矩阵S(W)

在这里插入图片描述

计算类内散布矩阵S(W)

   #定义每行数据的大小,每条数据有13个特征d = 13#定义类内散布矩阵S_W = np.zeros((d,d))# 计算类内的散布矩阵for label, mv in zip(range(1, 4), mean_vecs):class_scatter = np.zeros((d, d))# 计算各个类别的散布矩阵for row in train_x_std[train_y == label]:row, mv = row.reshape(d, 1), mv.reshape(d, 1)class_scatter += (row - mv).dot((row - mv).T)S_W += class_scatter# print(np.bincount(train_y)[1:])

我们需要对不同类别的散布矩阵S(i)做缩放处理,对各个类别的散布矩阵除以该类别内样本数量N(i),发现计算散布矩阵的方式与计算协方差矩阵的方式是一样的,协方差矩阵可以看作是归一化的散布矩阵
在这里插入图片描述

 #计算类内的散布矩阵for label,mv in zip(range(1,4),mean_vecs):class_scatter = np.cov(train_x_std[train_y == label].T)S_W += class_scatter

计算类间散布矩阵S(B)
在这里插入图片描述

 #计算全局均值mmean_overall = np.mean(train_x_std,axis=0)S_B = np.zeros((d,d))for i,mean_vec in enumerate(mean_vecs):N = train_x_std[train_y == i+1,:].shape[0]mean_vec = mean_vec.reshape(d,1)mean_overall = mean_overall.reshape(d,1)S_B += N * (mean_vec - mean_overall).dot((mean_vec - mean_overall).T)

第四步 计算矩阵S(W)^(-1)S(B)的特征值和对应的特征向量

 #获取特征值和对应的特征向量eigen_vals,eigen_vecs = np.linalg.eig(np.linalg.inv(S_W).dot(S_B))#获取特征对,并根据特征值的大小进行排序eigen_pairs = [(np.abs(eigen_vals[i]),eigen_vecs[:,i]) for i in range(len(eigen_vals))]eigen_pairs = sorted(eigen_pairs,key=lambda k : k[0],reverse=True)for eigen in eigen_pairs:print(eigen[0])

第五步 选取前k个特征和对应的特征向量,构造一个d×k维的转换矩阵W,其中特征向量以列的形式排列

下面我们通过图像来判断,特征向量的个数对于不同类别的区分能力

 #计算所有特征值的和tot = sum(eigen_vals.real)#获取特征值占总特征值的比率discr = [(i / tot) for i in sorted(eigen_vals.real,reverse=True)]cum_discr = np.cumsum(discr)plt.bar(range(1,14),discr,alpha=0.5,align="center",label="单个特征区分")plt.step(range(1,14),cum_discr,where="mid",label="累计区分")plt.xlabel("线性判别(LDA)")plt.ylabel("区分率")plt.ylim([-0.1,1.1])plt.legend(loc="best")plt.show()

在这里插入图片描述
通过上面的特征值和图可以发现,只存在两个特征值不为0(其余的特征值接近于0),前两个特征值累计已经接近于100%,所以我们选取前两个特征向量来构造转换矩阵W。

第六步 将训练样本通过转换矩阵W映射到新的特征空间

 #将样本映射到新的特征子空间train_x_std_lda = train_x_std.dot(W)colors = ["r","b","g"]markers = ["s","x","o"]for l,c,m in zip(np.unique(train_y),colors,markers):plt.scatter(train_x_std_lda[train_y == l,0],train_x_std_lda[train_y == l,1],c=c, label=l,marker=m)plt.xlabel("LD1")plt.ylabel("LD2")plt.legend(loc="upper right")plt.show()

在这里插入图片描述

使用scikit-learn实现LDA分析


import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.linear_model import LogisticRegressionif __name__ == "__main__":# 获取葡萄酒的数据data = pd.read_csv("G:/dataset/wine.csv")# 将数据分为x和yx, y = data.ix[:, 1:], data.ix[:, 0]# 将数据分为训练集和测试集train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.3, random_state=0)# 对数据进行标准化处理std = StandardScaler()train_x_std = std.fit_transform(train_x)test_x_std = std.fit_transform(test_x)#设置LDA的维度lda = LinearDiscriminantAnalysis(n_components=2)#将X通过LDA进行转换train_x_std_lda = lda.fit_transform(train_x_std,train_y)test_x_std_lda = lda.fit_transform(test_x_std,test_y)logistic = LogisticRegression()logistic.fit(train_x_std_lda,train_y)print("训练集上的准确率:",logistic.score(train_x_std_lda,train_y))print("测试集上的准确率:",logistic.score(test_x_std_lda,test_y))
训练集上的准确率: 0.991935483871
测试集上的准确率: 1.0

http://chatgpt.dhexx.cn/article/QnQQdWpR.shtml

相关文章

LDA 指南

『本文转自:https://wdxtub.com/2017/05/03/lda-guide/』 LDA 作为文本分析中非常有用的算法,无论是在学术界还是工业界都已被广泛运用。本文是写给自己的 LDA 理解指南。 更新历史 2017.05.03: 完成初稿 关于 LDA 算法,网上的资料不胜枚举…

LDA

关于降维算法 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表…

LDA详解

【几个问题待解决:1.LDA的先计算联合概率体现在哪里 2.对于theta 的采样的理解,下文中的theta1 ,theta2等其实是指theta向量中的第一个,第二个等,也就是不同文章的不同单词的主题,固定其他,分别…

LDA的通俗理解

1.PLSA模型 在讲解LDA模型之前,与LDA模型最为接近的便是下面要阐述的这个pLSA模型,给pLSA加上贝叶斯框架,便是LDA。 1.1什么是pLSA模型 我们假定一篇文档只由一个主题生成,可实际中,一篇文章往往有多个主题&#xff…

LDA模型详解

LDA是自然语言处理中非常常用的一个主题模型,全称是隐含狄利克雷分布(Latent Dirichlet Allocation),简称LDA。作用是将文档集中每篇文档的主题以概率分布的形式给出,然后通过分析分到同一主题下的文档抽取其实际的主题…

机器学习——LDA(线性判别分析)与人脸识别

忆如完整项目/代码详见github:https://github.com/yiru1225(转载标明出处 勿白嫖 star for projects thanks) 目录 系列文章目录 一、LDA的概念与原理 1.LDA简介 2.LDA算法模型 3.LDA的不足与优化 二、LDA运用于人脸识别 1.预处理 1…

线性判别分析(LDA)详解

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。 目录 一、LDA简介 二、数学原理(以二分类为例子) 1、设定 2、每一类的均值和方差 3、目标函数 4、目标…

LDA算法——线性判别

目录 一、前言 二、什么是LDA? 三、LDA原理 1.二分类问题 2.多分类问题 3.几点说明 四、算法实现 一、前言 之前我们已经介绍过PCA算法,这是一种无监督的降维方法,可以将高维数据转化为低维数据处理。然而,PCA总是能适用吗&…

主题模型:LDA原理详解与应用

LDA算法简介: LDA是一种基于贝叶斯思想的无监督的聚类算法,广泛用于文本聚类,文本分析,文本关键词等场景。具体的,算法 的输入是一个文档的集合D{d1, d2, d3, ... , dn},同时还需要主题Topic的类别数量m&a…

LDA主题模型简介及Python实现

一、LDA主题模型简介 LDA主题模型主要用于推测文档的主题分布,可以将文档集中每篇文档的主题以概率分布的形式给出根据主题进行主题聚类或文本分类。 LDA主题模型不关心文档中单词的顺序,通常使用词袋特征(bag-of-word feature)来…

制作属于自己的个人博客-超详细教程

SpringBoot个人博客 一.博客效果预览 博客首页预览 博客详情预览 博客评论区预览 博客底部栏预览 关于页面预览 二.博客效果在线预览 http://blog.ShaoxiongDu.top 三.项目技术 后端SpringBoot框架 分为控制层(Controller) 业务层(Service) 数据持久层(Dao) 按照Spring…

如何搭建个人博客

新的安装方式:(强烈推荐,简单方便) 利用dockernginx配置halo博客 先碎碎念一下,最近在学习springboot项目,在b站跟着up主研究如何写一个简易的博客来着,后来发现可以直接简易的搭建一个博客(都不用写代码&a…

使用 nodejs 搭建个人博客

"使用nodejs搭建自己的个人博客" 说明运行后端 node 模块后端框架采用的是 express 框架进行接口构建,具体解释如下:数据库参数配置评论邮箱提示付费文件下载配置(支付宝)评论语句检测 关于跨域问题的解决 说明 使用no…

超详细图解:如何使用 WordPress搭建一个个人博客?

前两天我用WordPress 给自己搭建了一个网站,整个过程非常的顺利,体验非常地好,于是我就整个过程、以及其中的一些搭建心得,记录下来。 如果你也正好有搭建个人网站的想法,那么本文会给你一个参考,也许看了这…

个人博客网站的设计与实现

/ 前话 / 纯手工敲代码,代码结构简单,divcss布局html静态个人博客首页网页设计,dreamwaver和hb都可以编辑,文件结构包含了css、fonts、images、js和html,运用html5技术,包括nav标签、header标签和footer标签…

个人博客系统毕业设计开题报告

本文给出的是本科生个人博客系统的毕业设计开题报告,仅供参考!(具体模板和要求按照自己学校给的要求) 毕业设计开题报告 一、选题意义二、博客系统概述三 、毕业设计研究方案四、功能结构图五、进度安排六、参考文献 一、选题意义…

基于HTML个人博客网站项目的设计与实现——个人博客作品展示6页 HTML+CSS

Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 个人博客网站 | 个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业 HTML:结构 CSS&…

HTML制作个人网页制作(简单静态HTML个人博客网页作品)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)

HTML5CSS大作业——清新春暖花开个人博客网站(6页) 常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄…

如何使用HTML制作个人网站(如何搭建个人博客)

📂文章目录 一、👨‍🎓网站题目二、✍️网站描述三、📚网站介绍四、🌐网站演示五、⚙️ 网站代码🧱HTML结构代码💒CSS样式代码 六、🥇 如何让学习不再盲目七、🎁更多干货…