主要内容

使用t-SNE可视化高维数据

此示例显示如何可视化MNIST数据[1],该数据由手写数字的图像组成,使用tsne函数。这些图像的灰度是28 × 28像素。每个图像都有一个从0到9的关联标签,这是图像所代表的数字。tsne使用主成分分析(PCA)将数据的原始维数从784降至50,然后使用t-SNE Barnes-Hut算法将其降至2或3。

获得数据

从获取图像和标签数据开始

http://yann.lecun.com/exdb/mnist/

解压文件。在本例中,使用T10K-Images.数据。

imageFileName =“t10k-images.idx3-ubyte”;Labelfilename =“t10k-labels.idx1-ubyte”

处理这些文件以在工作区中加载它们。此处理函数的代码出现在本示例的末尾。

[x,l] = processmnistdata(imagefilename,labelfilename);
读取MNIST图像数据…数据集中的图像数量:10000…每个图像是28 × 28像素…图像数据被读取为一个维数为10000 × 784的矩阵。读取图像数据结束。读取MNIST标签数据…数据集中的标签数:10000…标签数据被读取为一个维数矩阵:10000 × 1…标签数据读取结束。

将数据的维度降低到两个

使用T-SNE获取数据群集的二维类似物。使用PCA将初始维度降低到50.使用T-SNE算法的Barnes-HUT变体在此相对大的数据集上节省时间。

rng.默认的%的再现性Y = tsne (X,“算法”'barneshut''numpcacomponents',50);

显示结果,用正确的标签着色。

图gscatter (Y (: 1), Y (:, 2), L)

T-SNE完全基于与真正标签相对应的相对相似度创建点集群。

将数据的维度降低到三个

t-SNE还可以将数据缩减为三维。设置tsne“NumDimensions”名称值对3.

rng.默认的为了公平比较Y3 = tsne (X,“算法”'barneshut''numpcacomponents', 50岁,“NumDimensions”3);图scatter3 (Y3 (: 1), Y3 (:, 2), Y3(:, 3), 15日,L,“填充”);视图(-93,14)

以下是将数据读入工作区的函数的代码。

功能[X,L] = processMNISTdata(imageFileName,labelFileName) [fileID,errmsg] = fopen(imageFileName, labelFileName)“r”“b”);如果fileID < 0错误(errmsg);结束%%先读这个神奇的数字。对于图像数据,这个数字是2051% 2049用于标签数据magicNum =从文件中读(文件标识,1“int32”,0,“b”);如果MagicNum == 2051 Fprintf('\nRead mist图像数据…\n'结束%%然后读取图像的数量,行数和列数numImages =从文件中读(文件标识,1“int32”,0,“b”);流('数据集中的图像数量:%6d…\n', numImages);numRows =从文件中读(文件标识,1“int32”,0,“b”);numCols =从文件中读(文件标识,1“int32”,0,“b”);流(“每个图像是%2d × %2d像素……\n”numRows numCols);%%%读取镜像数据X =从文件中读(inf文件标识,“无符号字符”);%%%将数据重写为阵列xx =重塑(x,numcols,numrows,numimages);x = y yute(x,[2 1 3]);%%然后,%将每个图像数据压平于(numrows * numcols)向量中的一个图像数据,%将所有图像数据存储到一个numImages by (numRows*numCols)数组中。x = RESHAPE(x,numrows * numcols,numimages)';流(['图像数据被读取为一个维度矩阵:%6d by %4d…\n'...'读取图像数据结束。\n'),大小(X, 1),大小(X, 2));%%%关闭文件文件关闭(文件标识);%%%同样,读取标签数据。[文件标识,errmsg] = fopen (labelFileName,“r”“b”);如果fileID < 0错误(errmsg);结束magicNum =从文件中读(文件标识,1“int32”,0,“b”);如果MagicNum == 2049 Fprintf('\nRead nist label data…\n'结束numItems =从文件中读(文件标识,1“int32”,0,“b”);流('数据集中的标签数:%6d ... \ n',numitems);l = fread(fileid,inf,“无符号字符”);流([“将标签数据读取为尺寸的矩阵:%6d%2d ... \ n'...'读取标签数据结束。\n'),大小(L, 1),大小(L, 2));文件关闭(文件标识);

参考

Yann LeCun (Courant Institute, NYU)和Corinna Cortes(谷歌Labs, New York)拥有MNIST数据集的版权,该数据集是NIST原始数据集的衍生作品。MNIST数据集是在知识共享署名-共享相似3.0许可条款下提供的,https://creativecommons.org/licenses/by-sa/3.0/

相关的例子

更多关于