社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python实例 | 最好用的降维算法t-SNE

CDA数据分析师 • 2 年前 • 312 次点击  

 



 CDA数据分析师 出品  

作者:  郗晓琴  熊泽伟

编译: Mika


今天这篇文章是介绍目前前沿好用的一种降维可视化算法:t-SNE,并且附带python的实际例子加以讲解。

  • t-SNE是什么技术


我们直接开门见山好了,第一件事:什么是t-SNE?t-SNE的全称叫做t分布式随机邻居嵌入(t-SNE)。该算法是一种非监督的非线性技术,主要用于数据探索和可视化高维数据。

简而言之,t-SNE为我们提供了数据如何在高维空间中排列的感觉或直觉。它由Laurens van der Maatens和Geoffrey Hinton于2008年开发。

一提到降维,我们会想到大名鼎鼎的PCA,PCA是线性降维的技术,那么较之于我们今天要介绍的t-SNE,它们有什么不同或者联系吗。

如果您熟悉主成分分析(PCA),那么像我一样,你可能想知道PCA和t-SNE之间的区别。

首先要注意的是,PCA是在1933年开发的,而t-SNE是在2008年开发的。自1933年以来,数据科学领域发生了很大变化,主要是在计算和数据大小领域。其次,PCA是一种线性降维技术,旨在最大化方差并保持较大的成对距离。PCA可能导致可视化效果不佳,特别是在处理非线性结构时。这里非线性结构可以视为任何几何形状,如:圆柱体、球、曲线等。

t-SNE与PCA的不同之处在于只保留小的成对距离或局部相似性,

而PCA则关注的是保持大成对距离以最大化方差。

图1-“瑞士卷“数据集,保持与t-SNE(实线)的小距离vs最大化方差PCA

Laurens很好地利用上图中的“瑞士卷”数据集很好地说明了PCA和t-SNE方法(实线为t-SNE,虚线为PCA)。你可以看到,由于这个“瑞士卷”数据集(流形)的非线性并保持了大距离,PCA会错误地保留数据的结构。

 

  • t-SNE算法原理:


现在我们知道为什么有时候我们不用pca而用t-SNE,让我们来看看t-SNE是如何工作的,其背后有怎样的算法原理。其实,概括来说:t-SNE算法计算高维空间和低维空间中一对实例之间的相似性度量。然后,该算法用代价函数来优化这两个相似度指标。这个算法将其分为3个基本步骤。

步骤 1:

测量高维空间中点之间的相似性。

图2-围绕数据点的高斯分布在高维空间中测量成对的相似度

步骤 2:

第2步类似于第1步,不用高斯分布而是使用具有一定自由度的学生t分布。


  • t-SNE用在哪儿


现在我们已经了解了t-SNE的工作原理,让我们快速谈谈它在哪里使用。Laurens van der Maaten在他的视频演示中展示了许多例子,他提到了t-SNE在气候研究、计算机安全、生物信息学、癌症研究等领域的使用。也就是说t-SNE可用于高维数据(主要用于可视化),然后这些维度的输出成为其他分类模型的输入。然而,t-SNE不是聚类方法,因为它不保留PCA等输入,并且值可能经常在运行之间发生变化,因此纯粹是为了探索、可视化等工作。

代码示例:

本次案例的目标是通过蘑菇的特征(比如形状、气味等)来区分其是否可以食用,同时会在二维空间上呈现基于PCA和t-SNE的不同的降维分类效果,以此来认识二者的不同。

第1步-导入所需的库,读取并查看数据集

第2步-区分解释变量与被解释变量,查看数据的基本信息

3-查看解释变量的取值情况,进行数据编码

4-PCA降维与可视化

5-t-SNE降维与可视化

从可视化的结果可以看出,基于PCA降维的结果会产生重叠,这是因为主成分降维无法维护数据的局部结构而导致的,而基于t-SNE降维的结果分类更加清晰,基本没有类别之间的重叠,这就是t-SNE算法在降维过程中很好的保留了数据局部特征而产生的结果,所以,t-SNE算法可以很好的用来进行数据降维和可视化展示。


 

点这里👇关注我,记得标星哦~



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153871
 
312 次点击