【小技巧】机器学习中可视化高维向量的两种方法PCA和t-SNE,以及其原理介绍和代码示例(附代码)

使用情景:比如说现在我有一批numpy的多维向量,比如说都是256维度的,X.shape(n, 256), 已知它们都是经过训练能够在256dim的超球面上实现分类或聚类的,现在我想把它们可视化出来看看各个簇在超球面上的分布是怎样的?
在这里插入图片描述

1. 可视化方法介绍(附代码)

为了可视化高维数据(比如你的256维向量)在低维空间(通常是2D或3D)的分布,常用的方法包括主成分分析(PCA)和t-SNE。这两种方法可以帮助我们理解数据在高维空间中的内在结构。

下面,我会展示如何使用Python的scikit-learn库和matplotlib来可视化这些向量。我将使用PCA和t-SNE两种方法来降维,并在3D平面上展示结果。如果你有标签数据,这将有助于我们看到不同簇的分布。

首先,确保你已经安装了必要的库:

pip install numpy matplotlib scikit-learn plotly

下面是一个示例脚本,展示如何将你的高维数据可视化:

# -*- coding: utf8 -*-
import os
import numpy as np
import matplotlib.pyplot as plt
plt.switch_backend('agg')
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import plotly.graph_objects as go


def visualize_data_3d_interactive_v0(X, save_path, labels=None):
    """
	X: shape(num, dim)
	"""
    save_path = os.path.splitext(save_path)[0]
    
    # 使用PCA将数据降到3维
    print('PCA is processing ...')
    pca = PCA(n_components=3)
    X_pca = pca.fit_transform(X)
    
    # 使用t-SNE将数据降到3维
    print('t-SNE is processing ...')
    tsne = TSNE(n_components=3, perplexity=30, learning_rate=200)
    X_tsne = tsne.fit_transform(X)
    
    # 为PCA结果创建一个3D散点图
    fig_pca = go.Figure(data=[go.Scatter3d(
        x=X_pca[:, 0], y=X_pca[:, 1], z=X_pca[:, 2],
        mode='markers',
        marker=dict(
            size=5,
            color=labels,                # 设置颜色为标签
            opacity=0.8
        )
    )])
    fig_pca.update_layout(title='PCA Results', scene=dict(
                    xaxis_title='Component 1',
                    yaxis_title='Component 2',
                    zaxis_title='Component 3'))
    fig_pca.write_html(save_path + '_pca.html')
    
    # 为t-SNE结果创建一个3D散点图
    fig_tsne = go.Figure(data=[go.Scatter3d(
        x=X_tsne[:, 0], y=X_tsne[:, 1], z=X_tsne[:, 2],
        mode='markers',
        marker=dict(
            size=5,
            color=labels,                # 设置颜色为标签
            opacity=0.8
        )
    )])
    fig_tsne.update_layout(title='t-SNE Results', scene=dict(
                    xaxis_title='Component 1',
                    yaxis_title='Component 2',
                    zaxis_title='Component 3'))
    fig_tsne.write_html(save_path + '_tsne.html')


def visualize_data_3d_interactive_v1(data_dict, save_path):
    """
	版本不同:
	1.输入不同,data_dict是一个{cls: features};
	2.可视化功能差异,这个版本加入了对于不同cls显示不同颜色,并打上标签;
	"""

    save_path = os.path.splitext(save_path)[0]
    
    # 准备空列表来存储所有数据点和颜色
    all_data = []
    colors = []
    pid_index = 0  # 用于为每个pid分配不同的颜色
    texts = []  # 用于存储文本标签
    
    # 提取颜色映射
    color_palette = plt.cm.get_cmap('tab10', len(data_dict))
    
    # 将每个pid的数据点收集到一起,并为第一个特征添加标签
    for pid, features in data_dict.items():
        all_data.append(features)
        colors.extend([color_palette(pid_index)] * features.shape[0])
        # 初始化所有文本为空,除了第一个特征
        texts.extend([""] * features.shape[0])
        texts[len(texts) - features.shape[0]] = pid  # 为第一个特征设置pid标签
        pid_index += 1
    
    # 将所有数据合并成一个大矩阵
    all_data = np.vstack(all_data)
    
    # 使用PCA将数据降到3维
    print('PCA is processing ...')
    pca = PCA(n_components=3)
    X_pca = pca.fit_transform(all_data)
    
    # 使用t-SNE将数据降到3维
    print('t-SNE is processing ...')
    tsne = TSNE(n_components=3, perplexity=30, learning_rate=200)
    X_tsne = tsne.fit_transform(all_data)
    
    # 创建一个3D散点图显示PCA结果
    fig_pca = go.Figure(data=[go.Scatter3d(
        x=X_pca[:, 0], y=X_pca[:, 1], z=X_pca[:, 2],
        mode='markers+text',
        text=texts,
        marker=dict(
            size=5,
            color=['rgb({}, {}, {})'.format(c[0]*255, c[1]*255, c[2]*255) for c in colors],  # 将颜色转换为plotly格式
            opacity=0.8
        )
    )])
    fig_pca.update_layout(title='PCA Results', scene=dict(
        xaxis_title='Component 1',
        yaxis_title='Component 2',
        zaxis_title='Component 3'))
    fig_pca.write_html(save_path + '_pca.html')
    
    # 创建一个3D散点图显示t-SNE结果
    fig_tsne = go.Figure(data=[go.Scatter3d(
        x=X_tsne[:, 0], y=X_tsne[:, 1], z=X_tsne[:, 2],
        mode='markers+text',
        text=texts,
        marker=dict(
            size=5,
            color=['rgb({}, {}, {})'.format(c[0]*255, c[1]*255, c[2]*255) for c in colors],  # 将颜色转换为plotly格式
            opacity=0.8
        )
    )])
    fig_tsne.update_layout(title='t-SNE Results', scene=dict(
        xaxis_title='Component 1',
        yaxis_title='Component 2',
        zaxis_title='Component 3'))
    fig_tsne.write_html(save_path + '_tsne.html')



if __name__ == '__main__':
    # test v0
    data_np = np.random.rand(100, 256)
    visualize_data_3d_interactive_v0(data_np, 'outputs/vis_hdim_vector_interactive_v0.html')

    # test v1
    data_dict = {
        'class1': np.random.randn(100, 50),   # 100个50维的样本
        'class2': np.random.randn(100, 50),   # 另外100个50维的样本
        'class3': np.random.randn(100, 50),   # 另外100个50维的样本
        'class4': np.random.randn(100, 50),   # 另外100个50维的样本
        'class5': np.random.randn(100, 50),   # 另外100个50维的样本
        'class6': np.random.randn(100, 50),   # 另外100个50维的样本
        'class7': np.random.randn(100, 50),   # 另外100个50维的样本
        'class8': np.random.randn(100, 50),   # 另外100个50维的样本
        'class9': np.random.randn(100, 50),   # 另外100个50维的样本
        'class10': np.random.randn(100, 50)   # 另外100个50维的样本
    }

    visualize_data_3d_interactive_v1(data_dict, 'outputs/vis_hdim_vector_interactive_v1.html')

在这个脚本中,你需要替换X为你实际的数据。

PCA通常用于获取数据的主要方向,而t-SNE更擅长在保持局部结构的同时展示数据的簇状分布。视觉效果上,t-SNE可能更适合展示复杂的簇结构,但它的计算成本通常也更高。

2. t-SNE 原理

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非常流行的机器学习算法,主要用于高维数据的可视化。它由Laurens van der Maaten和Geoffrey Hinton在2008年提出。t-SNE的核心优势在于它能够有效地在二维或三维空间中展示高维数据的局部结构,使得类似的数据点在低维空间中彼此靠近,而不相似的数据点则远离。这使t-SNE特别适用于高维数据的聚类分析和可视化。

t-SNE的工作原理

t-SNE的工作过程可以分为以下几个关键步骤:

  1. 计算高维空间中的相似性
    t-SNE首先在高维空间中计算每对数据点间的条件概率,这种概率反映了一个点选择另一个点作为其邻居的可能性。这个概率由高斯分布(正态分布)的相似性函数决定,其中中心点是数据点本身。

  2. 计算低维空间中的相似性
    对于映射到低维空间中的数据点,t-SNE使用了一个长尾分布——具体来说是t分布(自由度为1的学生t分布,形状类似柯西分布),来计算低维空间中点之间的相似性。使用长尾分布是为了解决所谓的“拥挤问题”(crowding problem),即在低维空间中很难准确地表示原高维空间中的距离关系。

  3. 最小化Kullback-Leibler散度
    t-SNE的目标是使得两个空间(高维和低维)中的概率分布尽可能相似。为此,它通过最小化高维空间与低维空间中定义的概率分布之间的Kullback-Leibler散度来调整低维空间中的点。Kullback-Leibler散度是一种衡量两个概率分布差异的方法。

  4. 梯度下降
    t-SNE使用梯度下降法来找到低维空间的最优配置,以最小化Kullback-Leibler散度。这一步通常需要多次迭代,且对初始值和超参数(如学习率和困惑度)比较敏感。

t-SNE的使用注意事项

  • 困惑度(Perplexity)
    困惑度是t-SNE中的一个重要参数,反映了考虑的邻居的数量,并且对结果有显著影响。一般需要通过试验来选择最合适的困惑度值。

  • 随机性
    由于梯度下降的初始点是随机选择的,t-SNE的结果可能每次都略有不同。为了得到可重复的结果,需要固定随机种子。

  • 计算成本
    t-SNE的计算成本随着数据量的增加而显著增加,特别是对于非常大的数据集,可能需要较长的计算时间。

t-SNE是一个非常强大的工具,特别是在探索性数据分析和数据可视化方面。然而,正确地使用t-SNE需要对其参数和数据特性有一定的理解。

3. PCA 原理

主成分分析(PCA,Principal Component Analysis)是一种广泛使用的统计技术,用于数据降维和探索性数据分析。通过PCA,可以从多维数据集中提取出关键信息,并且以维数更少的数据集形式呈现,这种转换是通过保留数据的最大方差来实现的。

PCA的工作原理

  1. 标准化数据
    首先,通常需要将数据进行标准化处理,即对每个特征维度进行中心化(减去均值)和缩放(除以标准差),以使各特征具有相同的重要性。

  2. 计算协方差矩阵
    然后,计算数据的协方差矩阵。协方差矩阵描述了数据中各个变量之间的相关性;在这个矩阵中,每个元素是对应两个变量的协方差,它反映了两个变量变化时是如何相互影响的。

  3. 求解特征值和特征向量
    对协方差矩阵进行特征值分解,求得的特征值和对应的特征向量指示了数据的主要变化方向。特征值越大,对应的特征向量在数据集中的重要性就越高,这个特征向量定义了一个主成分。

  4. 选择主成分
    选择最大的几个特征值及其对应的特征向量。通常,这些特征向量被称为“主成分”,它们是新的、较少的、互相正交的坐标轴,这些坐标轴是按照它们能够捕捉的数据方差的重要性排序的。

  5. 构造新的特征空间
    将原始数据投影到这些选定的主成分上,得到的就是降维后的数据。这一步通常涉及到一个矩阵乘法运算,原始数据矩阵乘以选定的主成分矩阵。

PCA的应用

  • 数据压缩:通过减少数据集的维数,PCA有助于减少存储空间和提高算法效率。
  • 去噪:PCA可以帮助识别并去除数据中的噪声,特别是当噪声较小且数据的主要结构在高方差的方向时。
  • 可视化:在多维数据集中,通过PCA可以将数据降到两维或三维,使得数据可通过图形化方式展示。

注意事项

虽然PCA是一个强大的工具,但它也有局限性。由于PCA是基于线性假设的,它可能无法有效识别基于非线性结构的复杂模式。此外,如果所有变量的方差都差不多,PCA的效果可能就不明显。在这些情况下,可能需要考虑使用其他的降维技术,如t-SNE、LDA(线性判别分析)或者基于核的PCA方法。

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

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

相关文章

Ollama、FastGPT大模型RAG结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…

【TI毫米波雷达】I2C初始化配置和主机数据收发,用SDA来模拟UART数据输出,可直接连接IWR6843AOP开发板引脚

【TI毫米波雷达】I2C初始化配置和主机数据收发,用SDA来模拟UART数据输出,可直接连接IWR6843AOP开发板引脚 文章目录 导入库引脚复用初始化I2C配置数据发送用SDA来模拟UART数据输出附录:结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo…

代理服务器端口分配测试

上游服务器需要一个短暂或临时端口请求下游服务器&#xff0c;测试端口分配方式。 参考nginx 摘录-腾讯云开发者社区-腾讯云 框架为 <dependency><groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</ar…

数据结构课程设计(七)---求图的中心顶点 [图]

1.7.1 题目内容 1.7.1-A [问题描述] 假设有一个公司在某个地区有n个产品销售点&#xff0c;现根据业务需要打算在其中某个销售点上建立一个中心仓库&#xff0c;负责向其它销售点提供产品。由于运输线路不同&#xff0c;运输费用也不同。假定每天需要向每个销售点运输一次产品…

Android网络抓包--Charles

一、Android抓包方式 对Https降级进行抓包&#xff0c;降级成Http使用抓包工具对Https进行抓包 二、常用的抓包工具 wireshark&#xff1a;侧重于TCP、UDP传输层&#xff0c;HTTP/HTTPS也能抓包&#xff0c;但不能解密HTTPS报文。比较复杂fiddler&#xff1a;支持HTTP/HTTPS…

Ubuntu 20.04 设置开启 root 远程登录连接

Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 操作步骤 1、首先使用普通用户登录 2、设置root密码 macw:~$ sudo passwd …

Docker部署Logstash同步Mysql数据到ES

1、准备配置文件文件夹 2、部署logstash & elasticsearch docker pull docker.elastic.co/logstash/logstash:7.15.0 ## 替换{你的ES地址}为ES地址 docker run -d --name logstash -p 5044:5044 -p 9600:9600 -v D:\logstash\data\:/usr/share/logstash/data -v D:\logst…

【并发】 第五篇 原子操作(二) - CAS 详解

导航 一. 简介二. CAS原子操作原理三. CAS 实现自旋锁四. CAS原子操作的优点1. 非阻塞2. 原子性3. 高效性五. CAS原子操作的缺点1. ABA问题2. 自旋开销3. 只能保证一个共享变量的原子性操作一. 简介 CAS是"比较并交换"(Compare and Swap)的缩写。是一种并发控制机…

【网络】服务器间FTP传输文件被限速问题的排查(未达最优解)

服务器间FTP传输文件被限速问题的排查 问题描述具体问题软硬件环境文件传输方式的2种策略FTP相关信息问题表现问题解决结论 发散探讨——基于此问题进行发散研究相关知识从FileZilla软件入手从Windows入手从Linux入手从协议入手Windows和Linux的文件共享&#xff0c;分别是使用…

重看Spring聚焦ApplicationContext分析

目录 一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 &#xff08;二&#xff09;ApplicationContext 结构类图 二、ApplicationContext根接口 &#xff08;一&#xff09;源码展示 &#xff08;二&#xff09;分析说明 三、子接口Configu…

IPSec简介

起源 随着Internet的发展&#xff0c;越来越多的企业直接通过Internet进行互联&#xff0c;但由于IP协议未考虑安全性&#xff0c;而且Internet上有大量的不可靠用户和网络设备&#xff0c;所以用户业务数据要穿越这些未知网络&#xff0c;根本无法保证数据的安全性&#xff0…

00_如何使用国内镜像源下载QT

如何使用国内镜像源下载QT 如何使用国内镜像源下载QT 如何使用国内镜像源下载QT 第一步&#xff1a;下载下载qt online installer 网站&#xff1a;https://download.qt.io/official_releases/online_installers/ 添加链接描述 下载windows版本 第二步&#xff1a; 剪切放…

竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser&#xff0c;Unity打开文件选择器 下载地址&#xff1a;GitHub链接&#xff1a; https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…

若依vue中关于字典的使用

文章目录 字典管理页面列表点击某个字典类型展示具体字典数据修改某一条字典数据 字典的应用一般用于select多选框中代码实现根据字典Dict的value获取Label&#xff0c;类似于通过key获得value 源码解析 字典管理页面 列表 点击某个字典类型展示具体字典数据 修改某一条字典数…

【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营&#xff0c;我也将会通过笔记博客的方式记录学习的过程与遇到的问题&#xff0c;并为代码添加注释&#xff0c;希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 书生浦语大模型开源体系…

机器学习—数据集(二)

1可用数据集 公司内部 eg:百度 数据接口 花钱 数据集 学习阶段可用的数据集&#xff1a; sklearn:数据量小&#xff0c;方便学习kaggle&#xff1a;80万科学数据&#xff0c;真实数据&#xff0c;数据量大UCI&#xff1a;收录了360个数据集&#xff0c;覆盖科学、生活、经济等…

springboot的logback.xml默认配置文件

logback.xml <?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 控制台输出 --><appender name"STDOUT" class"ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:s…

BI数据分析软件:行业趋势与功能特点剖析

随着数据量的爆炸性增长&#xff0c;企业对于数据的需求也日益迫切。BI数据分析软件作为帮助企业实现数据驱动决策的关键工具&#xff0c;在当前的商业环境中扮演着不可或缺的角色。本文将从行业趋势、功能特点以及适用场景等方面&#xff0c;深入剖析BI数据分析软件&#xff0…

JavaScript内置对象

目录 前言: 1.什么是对象: 1.1面向对象是干什么的&#xff1f; 1.1.1封装&#xff1a; 1.1.2继承&#xff1a; 1.1.3多态&#xff1a; 1.2面向过程与面向对象: 1.2.1面向过程&#xff1a; 1.2.2面向对象&#xff1a; 1.3JavaScript中的对象 1.4内置对象&#xff1a; …