t-分布随机邻域嵌入和多维尺度分析

news2024/12/28 18:29:43

t-分布随机邻域嵌入 (t-Distributed Stochastic Neighbor Embedding, t-SNE)

t-SNE 是一种非线性降维方法,主要用于高维数据的可视化。它能够将高维数据映射到低维空间,同时保留数据的局部结构。

原理

t-SNE 通过将高维空间中的相似度分布与低维空间中的相似度分布进行匹配,从而实现降维。高维空间中的相似度使用高斯分布建模,低维空间中的相似度使用t分布建模。

公式推理
  1. 高维空间相似度: 给定高维数据点 xi 和 xj,高维空间中的相似度 pij 定义为:

其中,σi 是与数据点 xi 相关的高斯分布的标准差。

  1. 低维空间相似度: 给定低维数据点 yi 和 yj,低维空间中的相似度 qij 定义为:

  1. 优化目标: 最小化高维空间相似度分布和低维空间相似度分布之间的Kullback-Leibler散度:

经典案例

案例:t-SNE在手写数字识别数据集上的应用

我们将使用经典的MNIST数据集,它包含了大量的手写数字图片,每张图片是28x28像素的灰度图像,共有10个类别(0到9)。通过t-SNE将MNIST数据集从784维降到2维,并可视化不同数字在降维空间的分布。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1,parser='liac-arff')
X = mnist.data.astype('float64')
y = mnist.target.astype('int64')

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

# 使用t-SNE进行降维到2维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)

# 可视化
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', edgecolor='k', s=20)
plt.colorbar(scatter, label='Digit', ticks=range(10))
plt.title('t-SNE of MNIST Dataset')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.grid(True)
plt.show()
代码解析
  1. 加载MNIST数据集:使用 fetch_openml 函数加载MNIST数据集,包括特征矩阵 X 和目标向量 y
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用t-SNE进行降维:创建 t-SNE 对象并将数据降到 2 维。
  4. 可视化:绘制降维后的数据分布,不同颜色表示不同数字类别。

代码展示了如何利用t-SNE对高维数据进行降维,并通过可视化直观地展示了降维后数据的分布情况,有助于理解数据集的结构与特征之间的关系。

多维尺度分析 (Multidimensional Scaling, MDS)

MDS 是一种非线性降维方法,通过保留样本点之间的距离关系将高维数据嵌入低维空间,主要用于数据的可视化和相似性分析。

原理

MDS 试图在低维空间中表示高维空间中的数据点,同时尽可能保留原始数据点之间的距离关系。MDS 的目标是找到一个低维嵌入,使得低维空间中的距离与高维空间中的距离尽可能相似。

公式推理
  1. 距离矩阵: 给定一个 n×n 的距离矩阵 D,其中 Dij表示数据点 xi 和 xj 之间的距离。
  2. 嵌入坐标: MDS 寻找一个 n×d 的低维坐标矩阵 Y,使得:

其中,dij(Y) 表示低维空间中数据点 yi 和 yj 之间的欧氏距离。

  1. 双中心化距离矩阵: 将距离矩阵 D 进行双中心化,得到矩阵 B:

其中,J=I−1/n(11T),I 是单位矩阵,1 是元素全为 1 的向量。

  1. 特征分解: 对矩阵 B 进行特征值分解,得到特征值和特征向量:

其中,Λ是特征值构成的对角矩阵,V 是特征向量构成的矩阵。

  1. 低维嵌入: 选择前 d 个最大的特征值及其对应的特征向量,构建低维嵌入:

经典案例

案例:MDS在手写数字识别数据集上的应用

我们将使用经典的MNIST数据集,它包含了大量的手写数字图片,每张图片是28x28像素的灰度图像,共有10个类别(0到9)。通过MDS将MNIST数据集从784维降到2维,并可视化不同数字在降维空间的分布。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.manifold import MDS
from sklearn.preprocessing import StandardScaler

# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data.astype('float64').values  # 确保转换为numpy数组
y = mnist.target.astype('int64').values

# 减少数据集大小
# 随机选择5000个样本
np.random.seed(42)
indices = np.random.choice(X.shape[0], 5000, replace=False)
X_subset = X[indices]
y_subset = y[indices]

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_subset)

# 使用MDS进行降维到2维
mds = MDS(n_components=2, random_state=42)
X_mds = mds.fit_transform(X_scaled)  # X_mds 的形状应该是 (5000, 2)

# 可视化
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_mds[:, 0], X_mds[:, 1], c=y_subset, cmap='tab10', edgecolor='k', s=20)
plt.colorbar(scatter, label='Digit', ticks=range(10))
plt.title('MDS of MNIST Dataset (Subset)')
plt.xlabel('Component 1')
plt.ylabel('Component 2')
plt.grid(True)
plt.show()
代码解析
  1. 加载MNIST数据集:使用 fetch_openml 函数加载MNIST数据集,包括特征矩阵 X 和目标向量 y
  2. 标准化数据:使用 StandardScaler 对数据进行标准化处理,使得每个特征具有零均值和单位方差。
  3. 使用MDS进行降维:创建 MDS 对象并将数据降到 2 维。
  4. 可视化:绘制降维后的数据分布,不同颜色表示不同数字类别。

代码展示了如何利用MDS对高维数据进行降维,并通过可视化直观地展示了降维后数据的分布情况,有助于理解数据集的结构与特征之间的关系。

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

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

相关文章

KVM——安装桌面版本Rocky_linux9.4

安装桌面版本Rocky_linux9.4 一些配置见图

超级会员卡积分商城小程序多功能源码系统 带完整的安装代码包以及部署教程

源码系统概述 超级会员卡积分商城小程序多功能源码系统是一款集合了多种功能于一体的会员积分商城小程序源码系统。该系统采用先进的技术架构,支持多门店统一管理,提供丰富的会员信息和商品管理服务,支持多种支付方式和营销活动,同…

【css】3d柱状图-vue组件版

创建一个响应式圆柱形进度条组件 在现代网页设计中,圆柱形进度条是一种非常流行的视觉元素,用于展示数据的进度或状态。本文将介绍如何使用Vue.js和LESS创建一个响应式的圆柱形进度条组件。 组件结构 我们的组件由两部分组成:一个圆柱形的…

【密码学】聚合签名

聚合签名是一种高级的数字签名技术,这种技术在多种场景下都非常有用,特别是在区块链、多方计算、分布式系统等领域中。下面让我来对它的基本概念、主要类型、实现步骤等来进行介绍。 一、聚合签名的基本概念 聚合签名到底是什么?有那么多数字…

四个开源的模拟人类记忆开源库

✨ 1: Memary Memary 是一个模拟人类记忆、增强AI代理的开源Python库。 Memary 是一个模拟人类记忆来提升人工智能代理性能的工具。其核心是通过集成多个模型(如本地运行的 Llama 和 GPT 模型)以及使用知识图谱、记忆流和实体知识存储来推进 AI 代理的…

前端(HTML + CSS)学成在线项目(仿)

头部区域 banner区域 精品推荐区域,这三个区域都是版心居中 头部区域分为:logo 导航 搜索 用户四个小块 鼠标悬停 :hover效果 banner区域分为:左侧导航 背景图 右侧课程表 鼠标悬停 :hover效果 精品推荐区域 鼠标悬停 :hover效果 精…

基于MATLAB车牌图像识别的设计与实现

摘 要 车牌图像识别系统是现代智能交通管理的重要组成部分之一。车牌识别系统使车辆管理更智能化,数字化,有效提升了交通管理的方便性和有效性。 车牌识别系统主要包括了图像采集、图像预处理、车牌定位、字符分割、字符识别等五大核心部分。本文主要介绍…

顺序表-数据结构

一、结构定义 顺序表是通常是数组&#xff0c;要求数据连续存储。顺序表又分为定长顺序表和变长顺序表&#xff0c;本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…

五种创建springBoot项目的方法(本质上是三种)

文章目录 1. 使用https://start.aliyun.com/的服务器URL2. 使用https://start.spring.io/3. https://start.spring.io/使用官网4. 使用https://start.aliyun.com/5. 使用maven构建springboot项目5.1 点击maven&#xff0c;什么也不选&#xff0c;点击下一步5.2 修改名称和组ID&…

c语言第十天笔记

函数的概述 函数&#xff1a; 实现一定功能的&#xff0c;独立的代码模块。我们的函数一定是先定义&#xff0c;后使用。 使用函数的优势&#xff1a; 1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数&#xff0c;减少代码量。 2. 借助函数可以…

《学会 SpringMVC 系列 · 参数解析器 ArgumentResolvers》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

HQChart实战教程76-自定义Y轴刻度线

HQChart实战教程76-自定义Y轴刻度线 Y轴刻度线效果图HQChart插件源码地址步骤1. 注册事件2.回调事件eventdataobj数据说明完整实例源码Y轴刻度线 在K线图上,通过绘制一些特殊的刻度线来标识状态。我们可以通过SetOption里面设置,也可以通过回调函数动态设置。本教程是使用回…

微服务之SpringAMQP详解

目录 前言 1. 概述 2. Basic Queue简单队列模型 2.1 消息发送 2.2 消息接收 2.3 总结 3. WorkQueue模型 3.1 消息发送 3.2 消息接收 3.3 测试 3.4 消费预取限制 3.5 总结 4. 发布、订阅 5. Fanout 5.1 声明队列和交换机 5.2 消息发送 5.3 消息接收 5.4 测试 5…

SpringBoot集成阿里百炼大模型(初始demo) 原子的学习日记Day01

文章目录 概要下一章SpringBoot集成阿里百炼大模型&#xff08;多轮对话&#xff09; 原子的学习日记Day02 整体架构流程技术名词解释集成步骤1&#xff0c;选择大模型以及获取自己的api-key&#xff08;前面还有一步开通服务就没有展示啦&#xff01;&#xff09;2&#xff0c…

遗传算法与深度学习实战——生命模拟与进化论

遗传算法与深度学习实战——生命模拟与进化论 0. 前言1. 模拟进化1.1 代码实现1.2 代码改进 2. 达尔文进化论3. 自然选择和适者生存3.1 适者生存3.2 进化计算中的生物学 小结系列链接 0. 前言 生命模拟通过计算机模拟生物体的基本特征、遗传机制、环境互动等&#xff0c;试图模…

KMZ格式详解,javascript写入读取KMZ示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

myeclipse 2020 下载 安装 汉化

1&#xff0c;解压 myeclipse 2020 压缩包到当前目录下&#xff1a; 点击此处蓝色字体下载压缩包 提取码 k3x9 2&#xff0c;鼠标右键 点击 myeclipse 2020.exe 选择 以管理员身份运行 &#xff1a; 3&#xff0c;等待加载&#xff1a; 4&#xff0c;点击 Next &#xff1a; 5…

【数学建模】2024华数杯A题思路(已完成)

视频预览&#xff1a; 2024华数杯A题已完成 作品连接&#xff1a;https://mbd.pub/o/bread/ZpmWmJxu 文章目录 一、题目二、分析三、代码示例 一、题目 机器臂是一种自动化装置&#xff0c;广泛应用于工业生产、精密操作、危险环境作业和物流等领域。关节角路径的优化设计对于…

Transformer在生成细胞数据上的应用

来自&#xff1a;scTranslator: A pre-trained large generative model for translating single-cell transcriptome to proteome 工程地址&#xff1a;https://github.com/TencentAILabHealthcare/scTranslator 在scTranslator中&#xff0c;有3个阶段&#xff1a;paired bu…

【xilinx】XCZU1CG-1SBVA484I FPGA 的 VCC_PSBATT 引脚的正确电压范围是多少?

我正在做一个涉及 XCZU1Cg-1SBVA484I FPGA IC 的项目。对于 PSBATT 部分&#xff0c;根据 DS925 文档&#xff0c;提到 VCC_PSBATT 电压范围为 1.2V ~ 1.5V。但在同一文档中&#xff0c;注释部分规定&#xff1a;Vcc_psbatt 最高可接受 1.89V。 根据 UG1085 文档&#xff0c;使…