当前位置: 首页 > article >正文

掌握特征提取:机器学习中的 PCA、t-SNE 和 LDA模型

文章目录

  • 一、说明
  • 二、既然有 PCA 技术降维,为什么还要学习 t-SNE?
    • 2.1 t-SNE的核心思想:
    • 2.2 保持点之间的局部关系有什么意义?
    • 2.3 t-SNE 的几何直觉:
  • 三、t-SNE 的数学公式:
  • 四、目标函数:
  • 五、梯度下降:
  • 六、t-SNE 代码示例:(MNIST 手写数据集示例)
  • 七、一些问题!
  • 八、t-SNE 中的超参数:
  • 九、一些要点:
  • 十、结论

一、说明

与 PCA(主成分分析)相比,这是一种更好的降维技术。t-SNE,即 t 分布随机邻域嵌入,是一种通过将高维数据降低到低维空间(通常是二维或三维)来实现可视化的统计方法。
这使得数据的可视化和解释变得更加容易,特别是在处理机器学习和数据科学等复杂数据集时。

二、既然有 PCA 技术降维,为什么还要学习 t-SNE?

PCA 在线性数据上效果更好,而 t-SNE 没有这样的限制。无论数据是线性的还是非线性的,t-SNE 都表现良好。下面是使用 PCA 和 t-SNE 技术对 MNIST 数据集的可视化。从图中可以看出,与 PCA 相比,t-SNE 对数字的划分更出色。这种改进可以归因于 MNIST 数据的非线性,t-SNE 可以有效捕捉到这种非线性,而 PCA 则很难做到。
在这里插入图片描述

2.1 t-SNE的核心思想:

t-SNE 背后的核心思想是将高维数据点映射到低维空间(通常是二维或三维),同时保留点之间的局部关系。它通过测量高维空间中数据点之间的相似性并将这种相似性表示为概率来实现这一点。然后,它在低维空间中构建类似的概率分布,并使用称为梯度下降的技术最小化两个分布之间的差异。此过程使 t-SNE 能够有效捕捉数据的局部结构,使其特别适用于可视化复杂数据集和发现有意义的模式。

2.2 保持点之间的局部关系有什么意义?

t-SNE 中的“保持点之间的局部关系”是指在将相邻数据点从高维空间映射到低维空间时,保持它们之间的相对距离和相似性。

假设您有一个数据集,其中相似的数据点在高维空间中彼此靠近。保留局部关系意味着在降维之后,这些相似的点应该在低维空间中仍然紧密相连。同样,如果两个数据点在原始空间中彼此不相似或相距较远,则它们在降维空间中应该保持相对较远的距离。

2.3 t-SNE 的几何直觉:

t-SNE 背后的概念涉及计算每个数据点与数据集中所有其他点之间的相似性。利用这些相似性分数,该算法将数据的维度降低到 2D 或 1D,同时保留点之间的局部关系(即查找最近的邻居)。
在这里插入图片描述
如何计算相似度?

第 1 阶段
一种方法是计算点之间的距离,但由于“维数灾难”,这种方法在高维空间中变得不那么可靠。t -SNE 不再仅仅依赖距离计算,而是采用概率方法。对于每个数据点(例如 x1),在其周围绘制一个均值为零的高斯分布,标准差则根据 x1 周围附近点的密度确定。
在这里插入图片描述
现在,在 x 轴上,我们考虑与参考点(例如 x1)的距离。对于数据集中的每个点,我们计算其与 x1 的距离,并沿 x 轴绘制这些距离。y 轴表示相应的概率密度,使我们能够确定每个数据点相对于 x1 的概率,这可作为该点的相似度得分。
在这里插入图片描述
类似地,该方法应用于数据集中的每个点,从而产生一个 n * n 矩阵,其中记录了每个数据点相对于其他每个数据点的相似性得分。由于每个点周围的分布独特,点 x1 到 x2 的概率 (P(x1 | x2)) 不一定等于 x2 到 x1 的概率 (P(x2 | x1))。两点之间的 P 值越高表示它们是彼此的邻居,而 P 值越低表示它们是不相似的点。

第 2 阶段
现在我们将高维降为低维,并且点随机分布在 x 轴上,如图所示:
在这里插入图片描述
在此阶段,我们重新计算每个点相对于其他点的相似度得分,从而得到另一个 n * n 矩阵。现在我们有两个矩阵:一个表示高维的相似度得分,另一个表示低维的相似度得分。
在这里插入图片描述
阶段 3
为了保留点之间的局部关系,确保相邻点在低维中保持接近,我们的目标是将低维矩阵与高维矩阵对齐。这种对齐涉及迭代调整点的位置,直到低维中的相似性矩阵尽可能接近高维中的相似性矩阵。

三、t-SNE 的数学公式:

计算相似性:
对于高维空间中的每个数据点,我们使用高斯分布计算其与其他每个点的相似性。这种相似性基于点之间的距离。
类似地,在低维空间中,我们使用 t 分布来计算点之间的相似性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、目标函数:

我们希望尽量减小高维空间中的点与低维空间中的点的相似性之间的差异。我们使用Kullback-Leibler (KL) 散度来测量这种差异。
KL 散度衡量一个概率分布与另一个概率分布的差异。在我们的例子中,它量化了高维空间和低维空间之间成对相似度的差异。
在这里插入图片描述

五、梯度下降:

为了最小化 KL 散度,我们使用梯度下降。这种迭代优化技术可以调整低维空间中点的位置。
在每次迭代中,我们计算成本函数相对于低维空间中点的位置的梯度。
这个梯度指示了我们应该移动每个点的方向,以减少高维和低维相似性之间的差异。
通过根据该梯度更新点的位置,我们逐渐收敛到低维相似性与高维空间的相似性紧密匹配的配置。
在这里插入图片描述
在这里插入图片描述
该公式抓住了 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
import plotly.express as px
import pandas as pd
from sklearn.decomposition import PCA
# Load MNIST dataset
mnist = fetch_openml('mnist_784', version=1)
X = mnist.data / 255.0
y = mnist.target
# Select 10000 random points
np.random.seed(42)  # For reproducibility
indices = np.random.choice(range(X.shape[0]), size=10000, replace=False)
X_subset = X.iloc[indices]
y_subset = y.iloc[indices]
# Apply PCA for initial dimensionality reduction
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_subset)
# Plotting with Matplotlib
plt.figure(figsize=(12, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_subset.astype(int), cmap='tab10', s=1)
plt.colorbar(scatter)
plt.title('PCA of MNIST')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

在这里插入图片描述

# Apply t-SNE
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_subset)
# Plot the result
plt.figure(figsize=(12, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y_subset.astype(int), cmap='tab10', s=1)
plt.legend(*scatter.legend_elements(), title="Digits")
plt.title('t-SNE of MNIST')
plt.show()

在这里插入图片描述
借助上述代码示例和图表,您将了解 t-SNE 的工作原理以及为什么在非线性数据出现时它比 PCA 更好。

七、一些问题!

为什么使用高斯分布来计算高
维的相似度?

a. 可微分
b. 距离概率输出

在这里插入图片描述
高斯分布函数

这意味着,在上面的公式中,我们用两点之间的距离代替 x,这样我们就得到了概率输出的距离。

在这里插入图片描述
看黄色部分,我们在高斯分布公式中用距离代替 x

c. 优雅地处理距离
这意味着高斯分布可以平滑地反映点之间的距离。当点靠近时,它们被视为邻居的概率较高,而当它们相距较远时,这个概率逐渐降低。此属性确保分布能够准确地捕捉点之间基于距离的不同相似度。

d. 用方差参数控制密度

“使用方差参数控制密度”是指使用方差参数调整高斯分布的扩展或宽度的能力。

简单来说,方差决定了数据点围绕其平均值(或中心)的分布情况。方差越小,数据点之间的距离越近,密度也就越大;方差越大,数据点之间的距离越远,密度也就越小。

因此,在 t-SNE 中,调整方差参数可以控制高斯分布围绕每个数据点的紧密程度。此调整会影响邻域大小,并影响根据点与点之间的距离将哪些点视为邻居。

我想你已经得到了这个问题的答案,而且它也是一个著名的、众所周知的分布,并且所有的信息对于这个分布来说已经是可用的,所以这也是为什么高斯分布用于计算高维中两点之间的相似性的原因之一。

八、t-SNE 中的超参数:

  1. 困惑度:
    • 困惑度可能是 t-SNE 中最重要的超参数。它可以
    被认为是每个点的有效邻居数量的度量

• 困惑度的值会影响数据的局部和全局方面的平衡。较小的困惑度会强调局部结构,而
较大的困惑度会更多地发挥全局结构的作用。

• 困惑度的典型值介于 5 到 50 之间,但这可能会
因数据集而异。通常建议尝试
不同的值以查看它们如何影响结果。

2.学习率:

• 学习率决定了在
向成本函数最小值移动的过程中每次迭代的步长。

•学习率过高可能导致算法震荡并错过
全局最小值,而学习率过低可能导致
训练过程过长,并可能陷入局部最小值。

•学习率的常见值在 10 到 1000 之间。同样,
尝试不同的值是找到给定数据集的最佳设置的关键

3.迭代次数:

•该超参数控制算法在终止之前运行的迭代次数。

•如果数字太低,算法可能无法完全收敛。如果数字太高
,您可能会浪费计算资源,而
嵌入质量却没有太大提高。

•默认迭代次数通常设置为 1000 这样的值,但
对于较大的数据集,可能需要增加该次数。

九、一些要点:

解释聚类: t-SNE 可以非常有效地揭示聚类和局部结构。但是,聚类之间的距离或图中聚类的相对位置可能没有有意义的解释。避免过度解释全局关系。
轴没有意义: t-SNE 中的轴没有可解释的含义,这就是为什么 t-SNE 仅用于可视化而不是用于预测。
困惑度很重要:困惑度是 t-SNE 中的一个关键超参数。它大致对应于有效最近邻的数量。没有一个放之四海而皆准的值;不同的值可以揭示不同的结构,因此请尝试使用一系列值。常见值介于 5 到 50 之间。
可重复性: t-SNE 从随机初始化开始,每次运行都会产生不同的结果。如果可重复性很重要,请设置随机种子。此外,使用不同的初始化进行多次运行可以更全面地了解数据的结构。
缩放数据:缩放或规范化数据等预处理步骤(尤其是当特征处于不同尺度时)会对 t-SNE 的结果产生重大影响。
维数灾难: t-SNE 可以缓解但不能完全克服维数灾难。在应用 t-SNE 之前,极高维数据可能需要其他步骤,例如使用 PCA 进行初始降维。
学习率和迭代次数:除了困惑度之外,其他参数(如学习率和迭代次数)也会影响结果。学习率过高或过低都会导致嵌入效果不佳,而迭代次数不足可能意味着算法无法完全收敛。
它不是灵丹妙药:虽然 t-SNE 是一种强大的工具,但它并不适合每种数据集或分析。有时其他降维技术(如 PCA、UMAP 或 MDS)可能更合适。
t-SNE 的优点和缺点:
优点
• 如果操作正确,可以提供非常直观的可视化,因为它保留了较低维度中数据的局部结构

缺点
• 计算成本高
• 不太擅长保留全局结构
• 对超参数敏感
• 可能陷入局部最小值
• 解释具有挑战性

十、结论

我希望这篇博客能增强您对 t-SNE 概念的理解。如果您从此内容中获得了价值,请考虑关注我以获取更多有见地的帖子。感谢您花时间阅读本文。谢谢!


http://www.kler.cn/a/444553.html

相关文章:

  • 前端yarn工具打包时网络连接问题排查与解决
  • 火山引擎发布数据飞轮 2.0,AI 重塑企业数据消费
  • linux 使用zip unzip命令
  • 【Vulkan入门】16-IndexBuffer
  • 【C语言】库函数常见的陷阱与缺陷(一):字符串处理函数[3]--strlen
  • jQuery总结(思维导图+二维表+问题)
  • [unity3D] 利用 Button 组件实现鼠标悬停显示文字
  • git 不使用第三方软件解决冲突
  • 小米su7 or 保时捷怎么选?使用 Three 实现 3D 汽车展示平台比比看
  • C语言基础十一:指针变量与数组;数组指针及指针数组
  • 【k8s集群应用】K8S二进制安装大致步骤(简略版)
  • windows免登录linux
  • 前端学习-VUE
  • 探秘 Web3:重塑互联网的新力量
  • 【unity小技巧】unity最全的性能优化方案分享以及如何进行性能测试(2024/11/11更新)
  • 【蓝桥杯每日一题】选数异或——线段树
  • 【linux】shell(38)-数组
  • Micro Sip 配置自己的freeswitch服务器地址
  • SpringBoot如何实现缓存预热?
  • 语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限
  • web全局实现文字的中英文的切换
  • 航电系统组成架构详解!
  • Linux-进程描述符 task_struct 详解(PCB)
  • ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
  • Cherno C++学习笔记 P42 this关键字
  • Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK