数据可视化PCA与t-SNE

PCA(主成分分析)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。

降维:把数据或特征的维数降低,其基本作用包括:

  • 提高样本密度,以及使基于欧氏距离的算法重新生效
  • 数据预处理。对数据去冗余、降低信噪比
  • 方便可视化

降维主要可以分为线性降维和非线性降维

  • 线性降维
    • 侧重让不相似的点在低维表示中分开
    • MDS(Multiple Dimensional Scaling,多维缩放)
    • PCA(Principle Components Analysis,主成分分析)
  • 非线性降维
    • 非线性降维中用到的方法大多属于流形学习方法
    • 这类技术假设高维数据实际上处于一个比所处空间维度低的非线性流形上,因此侧重让相似的近邻点在低维表示中靠近
    • Sammon mapping
    • SNE(Stochastic Neighbor Embedding,随机近邻嵌入),t-SNE是基于SNE的
    • Isomap(Isometric Mapping,等度量映射)
    • MVU(Maximum Variance Unfolding)
    • LLE(Locally Linear Embedding,局部线性嵌入)等

1.PCA

1.1. PCA的原理

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维方法,它通过将原始数据投影到一个新的坐标系中,将数据中的冗余信息消除,并保留最有用的信息。具体来说,PCA会找到数据中的主成分,将数据沿着主成分方向进行旋转,使得旋转后的数据方差最大。这样可以有效减少数据的维度,从而降低模型复杂度,避免过拟合。

假设我们有一个数据集X={x1​,x2​,...,xn​},其中 x_i \in \mathbb{R}^d,我们的目标是将数据从 d维降至 k维 (k<d)。PCA 的基本思想是找到一个正交基,使得数据在这组基上的投影方差最大。具体来说,我们可以按照以下步骤进行 PCA:

  • 对数据进行中心化处理,即对每个维度减去该维度上的均值,使得数据的均值为 0。
  • 计算协方差矩阵 C,其中 C_{i,j}  表示 x  在第 i 个维度和第 j个维度上的协方差。
  • 对协方差矩阵进行特征值分解,得到特征值  \lambda_1,\lambda_2,...,\lambda_d   和对应的特征向量 v_1,v_2,...,v_d
    ​。其中,特征向量v_i  表示数据在第 i 个维度上的投影方向。
  • 选择前 k 个特征值对应的特征向量 v_1,v_2,...,v_k,将原始数据投影到这组基上。

下面是 PCA 的数学公式:

1.2. PCA的实现

在实现PCA算法时,我们需要执行以下步骤:

  1. 将数据集进行标准化,使得每个特征的均值为0,方差为1。这可以通过对每个特征减去其均值并除以其标准差来实现。
  2. 计算数据的协方差矩阵。
  3. 对协方差矩阵进行特征值分解。
  4. 选择前k个特征值对应的特征向量作为新的基向量。
  5. 将原始数据投影到新的低维空间中。

在Python中,我们可以使用NumPy和SciPy库来实现PCA算法。以下是一个简单的示例代码,演示如何使用Python和NumPy实现PCA算法:

import numpy as np

def pca(X, k):
    # 标准化数据
    X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

    # 计算协方差矩阵
    cov_mat = np.cov(X_std, rowvar=False)

    # 特征值分解
    eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)

    # 选择前k个特征值对应的特征向量
    eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i]) for i in range(len(eigen_vals))]
    eigen_pairs.sort(reverse=True, key=lambda k: k[0])
    w = np.hstack([eigen_pairs[i][1].reshape(-1, 1) for i in range(k)])

    # 将原始数据投影到新的低维空间中
    X_pca = X_std.dot(w)

    return X_pca

在上面的代码中,我们使用numpy.cov()函数计算数据的协方差矩阵,使用numpy.linalg.eig()函数进行特征值分解,然后选择前k个特征值对应的特征向量。最后,我们将原始数据投影到新的低维空间中。

1.3 数据可视化

PCA可以将高维数据映射到二维或三维空间中,从而实现数据的可视化。这种可视化方式通常被称为“主成分分析图”或“PCA图”。下面我们以手写数字数据集为例,演示如何利用PCA进行数据可视化。

首先加载手写数字数据集:

from sklearn.datasets import load_digits

digits = load_digits()
X = digits.data
y = digits.target

然后我们对数据进行PCA降维:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

最后,我们将数据可视化:

import matplotlib.pyplot as plt

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, alpha=0.5)
plt.colorbar()
plt.show()

运行上述代码后,我们可以得到一个二维的PCA图,其中不同颜色的点代表不同的手写数字,如下图所示:

这个图显示了手写数字数据集的PCA可视化结果。在这个二维图中,我们可以看到不同的数字在不同的区域内形成了簇。例如,数字0、6和1在左上角的区域内形成了簇,数字3、8和9在右下角的区域内形成了簇,数字2和7分别位于两个簇的中间位置。

PCA除了可以做数据可视化,也可以对数据进行降维操作。如在图像处理领域,我们常常需要将高维的像素点转化为低维的向量,以便于更好地进行图像分类、压缩等操作。使用PCA对图像进行降维处理是一种常见的方法。以人脸识别为例,我们可以使用PCA对人脸图像进行降维处理,将每张人脸图像转化为一个低维向量,然后使用这些向量进行人脸识别。

除此之外,PCA还可以做数据压缩去噪

2. t-SNE

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维算法,用于将高维数据映射到低维空间。与PCA不同,t-SNE旨在保留数据点之间的局部关系,并在低维空间中反映这种关系,而不是仅仅保留方差最大的维度。它的主要思想是在高维空间中计算数据点之间的相似度,然后在低维空间中将这些相似度转换为概率分布,从而最小化原始空间和低维空间之间的KL散度(Kullback-Leibler Divergence)。
具体来说,对于每个数据点i,t-SNE首先计算它与其他数据点j之间的相似度p_{ij} ,并利用高斯分布函数转换为概率分布p_{j|i},表示如果在低维空间中,点i选择点j作为邻居点的概率。在低维空间中,每个点k被表示为q_{k} 的概率分布,表示如果在高维空间中,点i选择点j作为邻居点的概率。t-SNE通过最小化p_{ij}q_{ij} 之间的KL散度来优化这些概率分布,从而将高维数据映射到低维空间。

Python中有多个库可以实现t-SNE算法

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30.0, early_exaggeration=12.0, learning_rate=200.0)
X_tsne = tsne.fit_transform(X)

其中,n_components指定了降维后的维度数,perplexity是t-SNE算法中的一个超参数,用于控制每个点周围的邻居数量,early_exaggeration是控制t-SNE计算过程中的簇大小的参数,learning_rate是学习率,控制梯度下降的步长。

2.1 t-SNE的应用

t-SNE主要用于可视化高维数据,特别是当我们想要探索数据中的局部结构时。例如,在自然语言处理中,我们可以使用t-SNE来可视化单词嵌入,以了解单词之间的语义关系。在图像处理中,t-SNE可以用于可视化图像的特征向量,以探索图像之间的相似性。

2.1.1 图像处理

t-SNE也可以用于图像处理中的特征提取和图像聚类。在这种情况下,我们可以使用卷积神经网络(CNN)提取图像特征,并使用t-SNE对这些特征进行降维,然后进行聚类或可视化。

例如,我们可以使用一个预先训练好的CNN模型,如VGG或ResNet,对图像进行特征提取。然后,我们可以使用t-SNE将这些高维特征降到二维或三维,以便进行可视化或聚类。

以下是一个使用t-SNE可视化MNIST数据集的示例:

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

# 获取MNIST数据集
mnist = fetch_openml('mnist_784')
X, y = mnist.data / 255.0, mnist.target

# 使用预训练的卷积神经网络(CNN)提取特征
# ...

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

# 可视化降维后的数据
plt.figure(figsize=(10, 10))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y.astype(int), cmap='jet')
plt.axis('off')
plt.colorbar()
plt.show()

该代码使用MNIST数据集作为示例数据集。首先,我们通过fetch_openml函数获取MNIST数据集,并对像素值进行归一化。然后,我们使用预训练的CNN模型提取图像的特征。最后,我们使用t-SNE将这些特征降至二维,并将结果可视化。

2.1.2 自然语言处理

t-SNE 在自然语言处理中也有广泛的应用,特别是在词向量的可视化方面。在自然语言处理中,我们经常使用词向量来表示单词。词向量是将每个单词表示为一个向量,使得每个向量都能够捕捉到该单词的语义信息。词向量通常在高维空间中表示,其中每个维度对应于单词的某个特定特征。

使用 t-SNE 可以将高维词向量降至 2 维或 3 维,然后使用二维或三维散点图将它们可视化。通过这种方式,我们可以更好地理解单词之间的相似性,例如,在这些可视化中,词向量非常相似的单词将在二维或三维空间中彼此靠近。

from sklearn.manifold import TSNE
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
import matplotlib.pyplot as plt

# 加载新闻数据集
newsgroups = fetch_20newsgroups(subset='all',
                                categories=['alt.atheism', 'comp.graphics',
                                            'comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware',
                                            'comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale',
                                            'rec.autos', 'rec.motorcycles', 'rec.sport.baseball',
                                            'rec.sport.hockey', 'sci.crypt', 'sci.electronics',
                                            'sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns',
                                            'talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'])

# 抽取词频特征
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(newsgroups.data)

# 使用t-SNE进行降维
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)
X_tsne = tsne.fit_transform(X.toarray())

# 将降维结果可视化
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()

运行上述代码后,我们可以得到一个散点图,其中每个点代表一个单词,相似的单词会被放置在相似的位置,这有助于我们更好地理解单词之间的语义关系。

需要注意的是,对于大型数据集,t-SNE 可能需要很长时间才能完成降维。在这种情况下,可以尝试使用随机子采样来减少数据点数量。

3. 如何选择PCA还是t-SNE

在选择PCA或t-SNE时,需要考虑以下几个因素:

数据类型:如果数据是高维稠密的,那么PCA是一个更好的选择,因为t-SNE需要大量的计算资源来处理大规模数据。如果数据是低维或稀疏的,t-SNE是更好的选择。
目标:如果目标是可视化数据集并检查其聚类结构或在二维或三维空间中查看数据点的分布,t-SNE是更好的选择。如果目标是减少数据的维度以进行机器学习或其他应用,PCA是更好的选择。
计算资源:PCA是一个快速而直接的方法,而t-SNE需要更多的计算资源和时间。如果计算资源有限,PCA是更好的选择。

参考:https://blog.csdn.net/qq_33578950/article/details/130042918

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

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

相关文章

ClickHouse介绍和使用

ClickHouse介绍和使用 1. 简介2. ClickHouse特点3. 数据类型3.1. 整型3.2. 浮点型3.3. Decimal型3.4. 布尔型3.5. 字符串3.6. 枚举类型3.7. 时间类型 4. 表引擎4.1. TinyLog4.2. Memory4.3. MergeTree4.3.1. partition by分区&#xff08;可选&#xff09;4.3.2. primary key 主…

【笔记】原型和原型链(持续完善)

概念 原型&#xff1a;函数都具有 prototype 属性&#xff0c;称之为原型&#xff0c;也称之为原型对象 1.1 原型可以放一些属性和方法&#xff0c;共享给实例对象使用&#xff08;也就是原生方法&#xff09;。 1.2 原型可以做继承原型链&#xff1a;对象都有 __proto__ 属性…

leetcode一道比较难的链表题

今天还是继续来分享我们的链表题&#xff0c;这个题目有点难&#xff0c;主要是思路比较难想&#xff0c;但是如果沥青思路写起来就比较简单了&#xff08;我乱讲的&#xff09; 随机链表的复制 这个是题目的描述&#xff0c;大家也可以在链接里看&#xff0c;那我把这道题目…

深眸科技聚焦3D机器视觉技术,从技术形态到应用前景实现详细分析

机器视觉技术的不断升级&#xff0c;使得对二维图像的处理逐渐扩展到了更复杂的三维领域&#xff0c;形成了3D机器视觉。3D机器视觉是机器视觉的重要应用领域之一&#xff0c;通过计算机能够在短时间内处理视觉传感器采集的图像信号&#xff0c;从而获得目标对象的三维信息。 …

通过Cookie和Session来实现网站中登录账号的功能

文章目录 一、Cookie和Session二、基于Cookie和Session实现登录账号的功能2.1步骤一2.2步骤二2.3步骤三2.4总结通过Cookie和Session来实现登录功能2.5运行截图 一、Cookie和Session cookie是http请求header中的一个属性&#xff0c;是浏览器持久化存储数据的一种机制&#xff…

OCR文字识别生成双层PDF,一键解锁文件编辑新技能

在当今信息时代&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;技术已经成为数字化转型中不可或缺的一环。利用OCR技术&#xff0c;我们可以将纸质文档转化为可编辑的电子文档&#xff0c;便于存储、检索和共享。然而&#xff0c;有时候我们需要将识别后…

自考改革过渡期!广东小自考最优解只需要2门笔试

图片来源&#xff1a;广东省考试院* 近期广东教育考试院公布了自考专业调整的相关通知&#xff0c;新的专业考试计划从2026年1月起执行。 这次改革过渡期中有一个重大利好消息&#xff0c;小自考专业笔试统考科目最少只需考2门笔试&#xff01; 这是为什么呢&#xff1f; 小…

黑洞路由的几种应用场景

第一种在内网中产生环路&#xff1a; 这种核心交换机上肯定写一条默认路由 0.0.0.0 0 10.0.0.1 出口路由要写一条192.168.0.0 16 10.0.0.2 如果出口路由访问一条不存在的内网网段&#xff0c;又或者访问的那台终端停机了&#xff0c;那就会产生三层环路&#xff0c;数据包在…

git命令行操作

git remote update origin --prune 更新本地的git分支保持和远程分支一致 git clone -b develop XXX 拉取某个分支的代码 1、创建一个空文件夹&#xff0c;在其中打开Git Bash Here&#xff0c;输入&#xff1a; git clone 刚刚复制的粘贴过来&#xff0c;回车 2、打开你拉下…

【扩散模型】5、Diffusion models beat GAN | 使用类别引导图像生成

论文&#xff1a;Diffusion models beat GAN on image Synthesis 代码&#xff1a;https://github.com/openai/guided-diffusion 出处&#xff1a;OPENAI | NIPS2021 时间&#xff1a;2021 贡献&#xff1a; 在本文章之前&#xff0c;扩散模型生成的图片已经非常逼真了&am…

SpringBoot 配置进阶

一、ConfigurationProperties 1、 在类定义上 ConfigurationProperties注解&#xff0c;此注解是用来为bean绑定属性。使用步骤如下&#xff1a; 在配置文件 application.yml 中&#xff0c;添加配置信息 servers:ip-address: 127.0.0.1port: 8123创建配置类&#xff0c;并在…

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成&#xff0c;就差torch的安装了&#xff0c;现在torch我要装的是1.2.0版本的&#xff0c;安装包以及下载好了&#xff0c;安装包都是在这个网站里下载的&#xff08;点此进入&…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址&#xff1a; chrome版本118&#xff1a; https://download.csdn.net/download/qq_35845339/88510476 chrome版本119&#xff1a; chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…

【Linux C IO多路复用】多用户聊天系统

目录 Server-Client mutiplexingServer mutiplexingClient mutiplexing Server-Client 在Linux系统中&#xff0c;IO多路复用是一种机制&#xff0c;它允许一个进程能够监视多个文件描述符&#xff08;sockets、pipes等&#xff09;的可读、可写和异常等事件。这样&#xf…

洋子带你赚钱,粉丝有奖任务来啦,最高拿90京东卡

大家好&#xff0c;我是洋子&#xff0c;前段时间CSDN联合阿里云发布了免费试用3种 云服务器的活动任务&#xff0c;每完成一个任务就可以拿到30京东卡&#xff0c;3个任务互相独立&#xff0c;如果3个任务全部完成就可以拿到90京东卡 任务奖励 参与体验大概十几分钟&#xf…

类直径树上贪心

http://cplusoj.com/d/senior/p/SS231109C 场上想到枚举点&#xff0c;然后最大值为高&#xff0c;然后可以求最大值。但是感觉计数会重 计数其实不会重&#xff0c;如图中&#xff0c;红色线段显然比蓝色线段优 所以我们枚举3叉点时没错的 #include<bits/stdc.h> usin…

『亚马逊云科技产品测评』活动征文|AWS 云服务器实例类型及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 定价计算器 &#xff08;1&#xff09;定价计算器官网 &…

深度学习_10_softmax_实战

由于网上代码的画图功能是基于jupyter记事本&#xff0c;而我用的是pycham,这导致画图代码不兼容pycharm,所以删去部分代码&#xff0c;以便能更好的在pycharm上运行 完整代码&#xff1a; import torch from d2l import torch as d2l"创建训练集&创建检测集合"…

使用合成数据训练语义分割模型

计算机视觉应用现在在各个科技领域无处不在。 这些模型高效且有效&#xff0c;研究人员每年都会尝试新想法。 新的前沿是试图消除深度学习的最大负担&#xff1a;需要大量的标记数据。 正如本文所述&#xff0c;此问题的解决方案是使用合成数据。 从这些研究中获益最多的计算机…

ros1 模拟客户端生成小乌龟服务请求生成小乌龟

模拟客户端生成小乌龟服务请求生成小乌龟 一、话题模型二、创建功能包三 创建客户端Client代码四 配置CMakeLists.txt编译规则&#xff1a;五 测试启动ros 主服务启动小乌龟的服务启动模型客户端服务 一、话题模型 Sever端是海龟仿真器/turtlesim&#xff0c;Client端是待实现…
最新文章