有效使用t-SNE进行降维

数据可视化在现实世界的机器学习应用中非常重要。随着大量数据集和大量信息的日益可用性,以不同的特征编码的数据集成为研究新的可视化方法的合适选择。

数据集包含许多特征,但都是不可探究的。在统计学和机器学习中,降维是通过获得一组主要变量来减少所考虑的随机变量数量的过程。它可以分为特征选择和特征提取。

有许多降维技术,如Sammon mapping,多维标度(MDS),基于图形的可视化和t-SNE。在这里,我们将讨论t-SNE方法,t-分布式随机邻域嵌入是一种用于挖掘高维数据的非线性降维算, 它将多维数据映射到适合于人类观察的两个或多个维度。然后我们将在MNIST数据集上应用此方法。

什么是t-SNE?

它是一种探索高维数据的流行方法,并已在机器学习领域广泛应用。它是一种非常有用的降维技术,并且比上面提到的其他技术要好得多。它具有从高维数据创建二维图形的能力。

t-SNE如何运作?

t-SNE的工作对数学领域的知识要求比较高。t-SNE的大致作用是试图保持邻域内的距离。

有效使用t-SNE进行降维

假设我们使用t-SNE将d维数据减少为二维数据。

从上面的图片中我们可以看到x2和x3在x1 [N(x1)= {x2,x3}]邻域内,并且x5在x4 [N(x4)= {x5}]的邻域内。

由于t-SNE保留了邻域的距离,

d(x1, x2) ≈ d(x'1, x'2)

d(x1, x3) ≈ d(x'1, x'3)

d(x4, x5) ≈ d(x'4, x'5)

对于每一点,它构造了一个概念,其他点是它的“邻居”,试图使所有点具有相同数量的邻居。然后它尝试嵌入它们,以便这些点都具有相同数量的邻居。

正确阅读t-SNE

1、假设我们有两个集群,每个集群包含二维平面上的50个点。每个图具有不同的困惑度(perplexity value)

有效使用t-SNE进行降维

我们可以看到,随着困惑的增加,我们得到越来越稳定的结构,但是困惑的值应该总是小于总点数,因为当它们变得相等时算法失败。如在最后一个图中,perplexity = 100也等于总点数,因此我们得到了一个意料之外的图形。

2、在下面的图中,将每个图表的perplexity设置为30,观察每个图表的在不同迭代次数下产生的差异。迭代次数(10,20,60,120和1000)。

有效使用t-SNE进行降维

TSNE是一个不断细化样本间差异的迭代过程。您可以设置要执行的最大迭代次数的限制。对于大型数据集,这可能会加快获得效果所需的时间,但在大多数情况下,您应将此设置保留为默认值1000。

MNIST数据集

MNIST是计算机视觉数据集,其包含手写数字的图像,每个图像高28像素,宽28像素,总共784像素。

有效使用t-SNE进行降维

现在,我们将使用不同的超参数值在此数据集上执行t-SNE。

perplexity设置为30,n_iter = 1000,只选取1000个数据点

from sklearn.preprocessing import StandardScaler
standardized_data = StandardScaler().fit_transform(data)
print(standardized_data.shape)
from sklearn.manifold import TSNE
data_1000 = standardized_data[0:1000,:]
labels_1000 = labels[0:1000]
model = TSNE(n_components=2, random_state=0)
tsne_data = model.fit_transform(data_1000)
tsne_data = np.vstack((tsne_data.T, labels_1000)).T
tsne_df = pd.DataFrame(data=tsne_data, columns=("Dim_1", "Dim_2", "label"))
sn.FacetGrid(tsne_df, hue="label", size=6).map(plt.scatter, 'Dim_1', 'Dim_2').add_legend()
plt.show()

有效使用t-SNE进行降维

有效使用t-SNE进行降维

2、perplexity设置为50,n_iter = 1000

有效使用t-SNE进行降维

3.perplexity设置为2,n_iter = 1000

有效使用t-SNE进行降维

4.这回我们更改perplexity设置为30,n_iter = 5000,考虑获取15000点。

from sklearn.manifold import TSNE
data_15000 = standardized_data[0:15000,:]
labels_15000 = labels[0:15000]
model = TSNE(n_components=2, random_state=0, n_iter=5000)
tsne_data = model.fit_transform(data_15000)
tsne_data = np.vstack((tsne_data.T, labels_15000)).T
tsne_df = pd.DataFrame(data=tsne_data, columns=('Dim_1', 'Dim_2', 'labels'))
sn.FacetGrid(tsne_df, hue="labels", size=6).map(plt.scatter,'Dim_1', 'Dim_2').add_legend()
plt.show()

有效使用t-SNE进行降维

有效使用t-SNE进行降维

正确的图表

perplexity的默认值= 30,n_iter = 1000,学习率= 1000

类sklearn.manifold.TSNE(n_components = 2,perplexity= 30.0,early_exaggeration = 12.0,learning_rate = 200.0,n_iter = 1000,n_iter_without_progress = 300,min_grad_norm = 1E-07,metric= 'euclidean ' ,init= 'random ' ,verbose= 0,random_state =None,method='barnes_hut',angle= 0.5)

结论 -

通过在MNSIT数据集上应用t-SNE,我们可以看到随着迭代次数和困惑度的增加,我们得到了越来越稳定的配置。迭代的次数决于数据集。因此,在得到合适的可视化图形之前,我们必须使用不同的超参数值反复执行t-SNE。

相关推荐