Python28-7.1降维算法之LDA线性判别分析

线性判别分析(Linear Discriminant Analysis, LDA)是一种用于模式识别机器学习的分类和降维技术。LDA通过找到能最大化类别间方差和最小化类别内方差的投影方向,实现样本的降维和分类。

LDA的基本思想

LDA的核心思想是通过线性变换将数据投影到一个新的空间中,使得同一类别的样本尽可能地紧凑在一起,而不同类别的样本尽可能地分开。具体来说,LDA的目标是找到一个或多个线性判别向量,使得类内散度矩阵(within-class scatter matrix)最小化,而类间散度矩阵(between-class scatter matrix)最大化。

LDA的数学公式

  1. 类内散度矩阵(Within-class scatter matrix):

其中,(S_i) 表示第 (i) 类的散度矩阵,计算方式为:

(mu_i) 是第 (i) 类的均值向量,(C_i) 是第 (i) 类的样本集合。

  1. 类间散度矩阵(Between-class scatter matrix):

    其中,(N_i) 是第 (i) 类的样本数量,(mu_i) 是第 (i) 类的均值向量,(mu) 是所有样本的全局均值向量。

  2. 线性判别准则: 通过求解以下特征值问题来找到投影向量:

    其中,(w) 是判别向量,(\lambda) 是对应的特征值。最大的特征值对应的特征向量是最佳投影方向。

LDA的步骤

  1. 计算每个类别的均值向量

  2. 计算类内散度矩阵和类间散度矩阵

  3. 求解特征值和特征向量,找到最佳投影方向。

  4. 将数据投影到新的空间,进行分类或降维。

LDA的应用

  • 分类问题:LDA可以用于二分类或多分类问题,常用于人脸识别文本分类等领域。

  • 降维问题:LDA可以用于数据降维,特别是当类别标签已知时,通过LDA可以实现有监督的降维

LDA的优缺点

优点

  • 考虑类别信息,适合用于分类任务。

  • 计算效率高,适用于高维数据。

缺点

  • 适用于线性可分的情况,对于非线性数据效果不好。

  • 对数据的均值和协方差矩阵的假设较强,要求数据符合高斯分布。

基于Python的LDA可视化实例

我们使用 Wine 数据集进行 LDA 降维并进行可视化。这里是一个完整的代码示例,包括数据加载、标准化、LDA降维和降维前后的可视化。

Wine 数据集是一个经典的机器学习数据集,常用于分类和降维任务。它包含了不同化学分析数据,用于识别葡萄酒的三个不同类别。这个数据集最早由 Riccardo Leardi 和 Michelangelo Grillo 在 1991 年介绍,广泛用于机器学习和数据挖掘研究。

数据集概述

Wine 数据集中的样本是从意大利某个地区生长的葡萄酿造的葡萄酒中提取的,涉及 13 种化学成分分析。数据集包含 178 个样本,每个样本有 13 个特征。

数据集的特征

Wine 数据集的特征及其含义如下:

  1. Alcohol:酒精含量

  2. Malic acid:苹果酸

  3. Ash:灰分

  4. Alcalinity of ash:灰分的碱度

  5. Magnesium:镁含量

  6. Total phenols:总酚含量

  7. Flavanoids:类黄酮

  8. Nonflavanoid phenols:非类黄酮酚

  9. Proanthocyanins:原花青素

  10. Color intensity:颜色强度

  11. Hue:色调

  12. OD280/OD315 of diluted wines:稀释酒的OD280/OD315

  13. Proline:脯氨酸

类别

数据集中的目标变量(label)有三个类别,分别代表三个不同的葡萄酒品种:

  1. 类别 0:葡萄酒品种 1

  2. 类别 1:葡萄酒品种 2

  3. 类别 2:葡萄酒品种 3

数据集结构

数据集共有 178 个样本,具体分布如下:

  • 类别 0:59 个样本

  • 类别 1:71 个样本

  • 类别 2:48 个样本

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.preprocessing import StandardScaler
import open3d as o3d

# 加载 Wine 数据集
wine = load_wine()
X = wine.data
y = wine.target
target_names = wine.target_names

# 数据标准化
scaler = StandardScaler()
X_std = scaler.fit_transform(X)

# 使用 Open3D 进行降维前的三维可视化
def visualize_3d(X, y, target_names):
    colors = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=float)  # red, green, blue
    point_colors = colors[y]
    
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(X[:, :3])  # 仅使用前 3 个特征进行三维可视化
    pcd.colors = o3d.utility.Vector3dVector(point_colors)
    
    vis = o3d.visualization.Visualizer()
    vis.create_window()
    vis.add_geometry(pcd)
    vis.run()
    vis.destroy_window()

# 可视化降维前的三维数据
visualize_3d(X_std, y, target_names)

# 进行 LDA 降维
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X_std, y)

# 可视化降维后的数据
plt.figure(figsize=(8, 6))
colors = ['red', 'green', 'blue']
markers = ['o', 's', 'D']

for color, marker, i, target_name in zip(colors, markers, [0, 1, 2], target_names):
    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], alpha=0.8, color=color, marker=marker, label=target_name)
    
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA of Wine Dataset')
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.show()

原始点云:

图片

使用LDA降维到二维平面的结果:

图片

由上述结果可知,对于Wine 数据集,LDA 可以很好地区分数据,其主要原因包括:

  1. 类别间的可分性:Wine 数据集的三个类别在特征空间中有明显的分布差异,LDA 可以通过投影最大化这些差异。

  2. 线性判别:LDA 寻找的特征线性组合能够最大化类别间的差异,利用化学特征间的线性关系实现有效分类。

  3. 数据分布:数据在特征空间中的分散和类别间的显著差异使得 LDA 能够找到最佳的投影方向。

  4. 类别标签的利用:LDA 使用类别标签信息,有助于更好地了解数据的类别结构,实现有效降维和分类。

代码说明

  1. 加载数据集和标准化

    • 使用 load_wine 函数加载 Wine 数据集。

    • 使用 StandardScaler 进行数据标准化。

  2. 使用 Open3D 进行降维前的三维可视化

    • 定义一个 visualize_3d 函数,该函数接受数据和标签,并使用 Open3D 进行三维可视化。

    • 在函数中,创建一个点云对象并将前 3 个特征作为点云的三维坐标。根据标签设置不同的颜色。

    • 使用 Open3D 的可视化工具显示三维点云。

  3. LDA 降维

    • 使用 LinearDiscriminantAnalysis 进行降维,将数据降到二维。

    • 使用 Matplotlib 绘制降维后的二维散点图,不同颜色和标记代表不同的类别。

LDA 的核心是通过最大化类间散度与最小化类内散度的比值,找到最优的投影方向,从而在降维后的空间中显著分离不同类别的数据。


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker学习笔记(一)概念理解

一、什么是docker容器 Docker容器是一种轻量级、可移植的软件封装技术,它允许开发者将应用程序及其依赖、配置文件、运行环境等打包到一个独立的、自包含的执行单元中。容器与虚拟机相似,都提供了隔离的运行环境,但容器更加轻量级&#xff0c…

Echarts折线+柱状图的多y轴

实现效果&#xff1a; 代码&#xff1a; <template><div class"test-echart"><div id"barLineChart" ref"barLineChart" :style"barLineStyle"></div></div> </template> <script> // imp…

MySQL之MHA高可用集群及故障切换

一、MHA概述 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的mysql高可用环境下故障切换和主从复制的软件。MHA的出现就是为了解决mysql单点故障。Mysql故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障性切换操作。MHA能在故障切换的过程中最大程度…

【路由交换技术】Cisco Packet Tracer基础入门教程(五)

这一期我们来学习端口聚合&#xff0c;这是针对交换机的技术 前言 不知道大家有没有注意到&#xff0c;我们之前的实验在交换机与交换机之间只用一条线连接&#xff0c;像这样 通过今天的学习&#xff0c;我们要用两条线来连接交换机&#xff0c;就像这样&#xff08;为了能…

3D问界—法线空间与应用举例

问题提出&#xff1a;什么是法线空间&#xff0c;有哪些应用的场景&#xff1f; 法线空间&#xff08;Normal Space&#xff09;在计算机图形学中是一个重要的概念&#xff0c;特别是在处理表面法线&#xff08;Normal&#xff09;时常被提及。 1. 法线空间的分类 法线空间是相…

“工控机”是什么?和普通电脑有区别嘛!

在现代工业生产中,有一种特殊的计算机,它不像普通电脑那样被放置于明亮的办公室内,而是常常藏身于机器轰鸣、环境恶劣的工厂车间里,这就是工控机——工业控制计算机的简称。作为工业自动化领域不可或缺的核心设备,工控机不仅承载着监控与数据采集(SCADA)、过程控制、数据…

python 实现docx指定语言翻译(不丢失格式)

我这边有个需求需要把一份docx翻译成指定语言的文档并且保存&#xff0c;研究了下&#xff0c;记录。 首先先安装依赖 pip install python-docx1.1.2 googletrans4.0.0rc1 python-docx是用来读取docx的&#xff0c;googletrans使用来翻译的。 googletrans PyPI 这个是官方文…

【大语言模型系列之Transformer】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

什么是YUV和IPB,PTS和DTS,视频编码解码过程

YUV 是一种在视频处理和压缩中常用的颜色空间。 它将图像的亮度 (Y) 与色度 (U 和 V) 成分分开。 这种分离对视频压缩和广播非常有益&#xff0c; 因为人眼对亮度变化比对颜色变化更敏感。 YUV 组件简介 Y (亮度)&#xff1a;表示图像的亮度或灰度信息。U (色度)&#xff1a;…

每日一练:攻防世界:Hidden-Message

追踪UDP数据流&#xff0c;没有任何隐藏信息&#xff1a; WP&#xff1a; 观察流量包 每个流的唯一的区别就是UDP的源地址srcport的最后一位在变化 都提取出来就是二进制序列 用tshark提取一下 //使用tshark过滤出源端口&#xff0c;使用cut裁取端口的最后一位 tshark -r 8…

[C/C++] -- gdb调试与coredump

1.gdb调试 GDB&#xff08;GNU 调试器&#xff09;是一个强大的工具&#xff0c;用于调试程序。 安装 1. wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz 2. tar -zxvf gdb-8.1.1.tar.gz 3. cd gdb-8.1.1 4. ./configure 5. make 6. make install 基础用法 …

git上传文件

git init git add . git commit -m " " git remote add origin 仓库的地址 git push -u origin master 如果出现以下问题 可以用这一句强制上传 git push -f origin master

BME688 环境传感器

型号简介 BME688是博世&#xff08;bosch-sensortec&#xff09;的一款首款具有人工智能 (AI) 和集成高线性度和高精度压力、湿度和温度传感器的气体传感器。它采用坚固而紧凑的 3.0 x 3.0 x 0.9 mm 封装&#xff0c;专为移动和联网应用而开发&#xff0c;在这些应用中&#xf…

C++之boost智能指针

1、boost智能指针 资源获取即初始化&#xff1a;在构造函数中对资源进行初始化&#xff0c;在析构函数中释放。 智能指针的本质思想是&#xff1a;将堆对象的生存期&#xff0c;用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候&#xff0c;立刻用智能指针…

共享拼购:创新商业模式引领小用户基数下的销售奇迹“

在瞬息万变的商业蓝海中&#xff0c;一个新颖且深具潜力的策略正悄然改变着游戏规则&#xff0c;它巧妙地避开了传统路径的束缚&#xff0c;以微妙却深远的调整&#xff0c;开辟出了一条通往成功的独特航道。我的一位合作伙伴&#xff0c;正是这一策略的实践者&#xff0c;他在…

Blender渲染慢?那是你还不知道这5个技巧

Blender是一款功能强大且用途广泛的软件&#xff0c;可帮助 3D 艺术家和动画师创作出色的视觉内容。如果您使用过 Blender&#xff0c;您就会知道渲染可能非常耗时。渲染时间过长可能会令人烦恼并限制创造力。 在这篇文章中&#xff0c;我们将提供一些专家提示和想法以加快 Bl…

交换机需要多大 buffer

有点违背直觉&#xff0c;但是真事儿&#xff0c;交换机过境的流越多&#xff0c;所需 buffer 越小&#xff0c;这是为什么&#xff1f; 范氏(范雅各布森&#xff0c;van jacobson)管道的 aimd 流建议 buffer_size 为 bdp&#xff0c;这很容易理解&#xff0c;因为 aimd 流最小…

OpenCV库Windows端编译方法

编译前提 &#xff08;1&#xff09;下载好所需版本的OpenCV源码&#xff0c;点击进入下载地址&#xff0c;此处以OpenCV-2.4.13.6为例&#xff0c;下载页面截图如下图所示&#xff1a; 解压后如下图所示&#xff1a; &#xff08;2&#xff09;安装好CMake软件&#xff0c;点…

规则·理解·成长:与自闭症儿童共绘记忆蓝图

在星贝育园&#xff0c;作为专注于自闭症儿童康复的专业教育者&#xff0c;我们常常遇到家长的疑惑&#xff1a;“为什么我的孩子总是记不清楚规则&#xff1f;”这个问题触及了自闭症谱系障碍&#xff08;ASD&#xff09;儿童在理解与遵守规则方面面临的独特挑战。下面&#x…

软考中级系统集成项目管理工程师备考笔记

目录 一&#xff0c;通用内容 &#xff08;一&#xff09;信息与信息化 1.1&#xff0c;信息 信息基本概念 信息的传输模型 信息的质量属性 1.2&#xff0c;信息系统 信息系统的基本概念 信息系统定义 信息系统集成 1.3&#xff0c;信息化 信息化层次 信息化的核心…