t-SNE降维算法详解(附matlab代码)

什么是t-SNE

        t-SNE的主要用途是可视化和探索高维数据。 它由Laurens van der Maatens和Geoffrey Hinton在JMLR第九卷(2008年)中开发并出版。 t-SNE的主要目标是将多维数据集转换为低维数据集。 相对于其他的降维算法,对于数据可视化而言t-SNE的效果最好。 如果我们将t-SNE应用于n维数据,它将智能地将n维数据映射到3d甚至2d数据,并且原始数据的相对相似性非常好。与PCA一样,t-SNE不是线性降维技术,它遵循非线性,这是它可以捕获高维数据的复杂流形结构的主要原因。

t-SNE原理

首先,它将通过选择一个随机数据点并计算与其他数据点(|x—x|)的欧几里得距离来创建概率分布。 从所选数据点附近的数据点将获得更多的相似度值,而距离与所选数据点较远的数据点将获得较少的相似度值。 使用相似度值,它将为每个数据点创建相似度矩阵(S1)

t-SNE降维算法详解(附matlab代码)_第1张图片

由上图可知,我们可以说X1的邻域 N(X1)= {X2, X3, X4, X5, X6},这意味着X2,X3,X4,X5和X6是X1的邻居。 它将在相似度矩阵“ S1”中获得更高的价值。 这是通过计算与其他数据点的欧几里得距离来计算的。

另一方面,X20远离X1。 这样它将在S1中获得较低的值。

其次,它将根据正态分布将计算出的相似距离转换为联合概率。

通过以上的计算,t-SNE将所有数据点随机排列在所需的较低维度上。

t-SNE将再次对高维数据点和随机排列的低维数据点进行所有相同的计算。 但是在这一步中,它根据t分布分配概率。 这就是名称t-SNE的原因。t-SNE中使用t分布的目的是减少拥挤问题,t分布→视觉上t分布看起来很像正态分布,但尾部通常更胖,这意味着数据的可变性更高。

对于较低维的数据点,还将创建一个相似度矩阵(S2)。然后该算法将S1与S2进行比较,并通过处理一些复杂的数学运算来使S1与S2之间有所不同。包括使用两个分布之间的Kullback Leibler散度(KL散度)作为损失函数运行梯度下降算法。使用KL散度通过将两个分布之间相对于数据点位置的值最小化,帮助t-SNE保留数据的局部结构。

算法要点

t-SNE算法具有扩展密集簇并缩小稀疏簇的特点。

t-SNE不会保留群集之间的距离。

t-SNE是一种不确定性算法或随机算法,这就是为什么每次运行结果都会略有变化的原因。

即使它不能在每次运行中保留方差,也可以使用超参数调整来保留每个类之间的距离。

该算法涉及许多计算和计算。 因此,该算法需要大量时间和空间来计算。

困惑度(perplexity)是控制数据点是否适合算法的主要参数。 推荐范围是(5–50)。

困惑度应始终小于数据点的数量。

低困惑度→关心本地结构,并关注最接近的数据点。

高度困惑→关心全局结构。

t-SNE可以巧妙地处理异常值。

 matlab代码

clear all;
close all;
clc;

% 载入鸢尾花数据
A=xlsread('E:\IP9')
% load plot
% example1
% 欧式距离tsne结果
rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','euclidean');
figure;
gscatter(Y(:,1),Y(:,2),species)
title('Euclidean')




% example2
% 对比四种距离下的tsne降维效果
rng('default') % for reproducibility

Y = tsne(meas,'Algorithm','exact','Distance','mahalanobis');
figure
subplot(2,2,1)
gscatter(Y(:,1),Y(:,2),species)
title('Mahalanobis')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','cosine');
subplot(2,2,2)
gscatter(Y(:,1),Y(:,2),species)
title('Cosine')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','chebychev');
subplot(2,2,3)
gscatter(Y(:,1),Y(:,2),species)
title('Chebychev')

rng('default') % for fair comparison
Y = tsne(meas,'Algorithm','exact','Distance','euclidean');
subplot(2,2,4)
gscatter(Y(:,1),Y(:,2),species)
title('Euclidean')

你可能感兴趣的:(算法,matlab,开发语言)