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

news2024/12/23 19:54:41

线性判别分析(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 的核心是通过最大化类间散度与最小化类内散度的比值,找到最优的投影方向,从而在降维后的空间中显著分离不同类别的数据。


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据库原理]事务

如有错误,欢迎指正!!! 期末考了冲突可串行化

qt6 获取百度地图(一)

需求分析: 要获取一个地图, 需要ip 需要根据ip查询经纬度 根据经纬度查询地图 另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘ 最后,要渲染地图 上面这这些动作,要进行http查询: 为此要有三个QNet…

科比老大职业生涯数据预测(基于随机森林模型)

1.实验背景 科比布莱恩特,作为NBA历史上最伟大的篮球运动员之一,他的职业生涯充满了无数精彩瞬间。 科比于1996年以13顺位的选秀身份进入联盟,一生都效力于洛杉矶湖人队。于2016年宣布退役,职业生涯获奖无数,5次NBA总…

暑假学习DevEco Studio第2天

学习目标: 掌握页面跳转 学习内容: 跳转页面 创建页面: 在“project”窗口。打开“entry>src>main>ets”,右击“pages”,选择“New>ArkTS File”,命名“Second”,点击回车键。 在页面的路由&#xff0…

8.ApplicationContext常见实现

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件来创建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

c++类模板及应用

文章目录 为什么要有函数模板一般实现举例类模板举例 继承中类模板的使用特殊情况 友元函数模板类和静态成员类模板实践 为什么要有函数模板 项目需求: 实现多个函数用来返回两个数的最大值&#xff0c;要求能支持char类型、int类型、double 一般实现举例 类模板举例 继承中类…

MySQL之备份与恢复(四)

备份与恢复 存储引擎和一致性 3.复制 从备库中备份最大的好处是可以不干扰主库&#xff0c;避免在主库上增加额外的负载。这是一个建立备库的好理由&#xff0c;即使不需要用它做负载均衡或高可用。如果钱是个问题&#xff0c;也可以把备份用的备库用于其他用户&#xff0c;…

Linux_进程池

目录 1、进程池基本逻辑 2、实现进程池框架 3、文件描述符的继承 4、分配任务给进程池 5、让进程池执行任务 6、回收子进程 7、进程池总结 结语 前言&#xff1a; 在Linux下&#xff0c;进程池表示把多个子进程用数据结构的方式进行统一管理&#xff0c;在任何时候…

代码随想录——无重叠区间(Leetcode435)

题目链接 贪心 排序 class Solution {public int eraseOverlapIntervals(int[][] intervals) {int res 0;if(intervals.length 1 || intervals.length 0){return res;}// 按左边界排序Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] …

面试突击指南:Java基础面试题3

1.介绍下进程和线程的关系 进程:一个独立的正在执行的程序。 线程:一个进程的最基本的执行单位,执行路径。 多进程:在操作系统中,同时运行多个程序。 多进程的好处:可以充分利用CPU,提高CPU的使用率。 多线程:在同一个进程(应用程序)中同时执行多个线程。 多线程…

学习率调度器简明教程

学习率是神经网络训练中最重要的超参数之一&#xff0c;影响学习过程的速度和有效性。学习率过高会导致模型在最小值附近震荡&#xff0c;而学习率过低会导致训练过程非常缓慢甚至停滞。本文直观地介绍了学习率调度程序&#xff0c;它是用于在训练期间调整学习率的技术。 NSDT工…

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时&#xff0c;我遇到了一个写入S3文件的报错问题。通过深入调试和分析&#xff0c;找到了问题所在&#xff0c;并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向&#xff0c;希望对大家有帮助&#xff01; 一、…

江门雅图仕职业技术学校领导一行莅临泰迪智能科技参观调研

7月2日&#xff0c;江门雅图仕职业技术学校总校长肖胜阳、校长许昌、办公室主任任志娟等莅临广东泰迪智能科技股份有限公司产教融合实训中心参观调研。泰迪智能科技董事长张良均、副总经理施兴、产品中心总监周东平、校企合作经理吴桂锋进行热情接待&#xff0c;双方就学校专业…

Python用于处理 DNS 查询库之Dnspython 使用详解

概要 Dnspython 是一个开源的 Python 库,专门用于处理 DNS 查询。它被设计为既简单易用又功能强大,可以满足从简单到复杂的各种 DNS 相关需求。无论是进行基础的 DNS 查询还是进行高级的 DNS 服务器管理,dnspython 都能提供相应的功能。 这个库支持包括 A、AAAA、MX、TXT …

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理

基本参数&#xff1a; 机器型号&#xff1a;HGLM2200N 产品名称&#xff1a;A4黑白激光多功能一体机 基础功能&#xff1a;打印、扫描、复印 打印速度&#xff1a;22页/分钟 纸张输入容量&#xff1a;150-249页 单面支持纸张尺寸&#xff1a;A4、A5、A6 产品尺寸&#x…

拓展欧几里得和裴蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff09;说明了对任何整数a、b和它们的最大公约数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且gcd(a,b)d&#xff0c;那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…

pytorch中的contiguous()

官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为&#xff1a; Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…

音乐发行平台无加密开源源码

适用于唱片公司&#xff0c;用于接收物料&#xff0c;下载物料功能&#xff1a;个人或机构认证&#xff0c;上传专辑和歌曲&#xff0c;版税结算环境要求php7.4Nginx 1、导入数据库 2、/inc/conn.php里填写数据库密码等后台路径/admin&#xff08;可自行修改任意入口名称&…

Java中子类继承和方法重写_java重写父类方法参数变了怎么改

public(非私有)private私有()构造方法不能继承不能继承成员变量能继承能继承成员方法能继承不能继承 1.也不能继承父类的有参构造方法,具体看构造函数继承特点 2.私有的成员变量相当于从父类拷贝一份拿过来用的,不能直接用,需要get/set方法 继承特点 继承中 成员变量访问特点:如…

重参数化技巧

Q&#xff1a;标准正态分布 P&#xff1a;预期的分布&#xff08;假设符合正态分布&#xff09; 学习与 - 手推 Diffusion Model (DDPM) 1/3 &#xff1a;数学原理推导_哔哩哔哩_bilibili