主要内容

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

方法可视化MNIST数据[1],该数据由手写数字的图像组成tsne函数。这些图像的灰度为28 * 28像素。每个图像都有一个从0到9的关联标签,这是图像所代表的数字。tsne将数据的维数从原始的784维减少到使用PCA的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…读取标签数据结束。

将数据维数降为2

使用t-SNE获得数据集群的二维类似物。使用PCA将初始维数降至50。使用Barnes-Hut t-SNE算法的变体可以在这个相对较大的数据集上节省时间。

rng默认的再现率%Y = tsne(X,“算法”“barneshut”“NumPCAComponents”, 50);

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

图numGroups =长度(唯一的(L));clr = hsv(numGroups);gscatter (Y (: 1), Y (:, 2), L, clr)

t-SNE仅基于与真实标签密切对应的相对相似性创建点集群。

将数据的维数降为三

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

rng默认的%作公平比较Y3 = tsne(X,“算法”“barneshut”“NumPCAComponents”, 50岁,“NumDimensions”3);图scatter3 (Y3 (: 1), Y3 (:, 2), Y3(:, 3), 15日,clr (L + 1,:)“填充”);视图(-93,14)

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

函数[X,L] = processMNISTdata(imageFileName,labelFileName) [fileID,errmsg] = fopen(imageFileName, labelFileName)“r”“b”);如果fileID < 0 error(errmsg);结束% %首先读一下这个神奇的数字。对于图像数据,这个数字是2051% 2049为标签数据magicNum = fread(fileID,1,“int32”0,“b”);如果magicNum == 2051 fprintf(\nRead MNIST图像数据…\n'结束% %然后读取图像的数量,行数和列数numImages = fread(fileID,1,“int32”0,“b”);流('数据集中的图像数量:%6d…\n', numImages);numRows = fread(fileID,1,“int32”0,“b”);numCols = fread(fileID,1,“int32”0,“b”);流('每个图像都是%2d * %2d像素…\n'numRows numCols);% %%读取映像数据X = fread(fileID,inf,“无符号字符”);% %将数据重塑为数组XX =重塑(X,numCols,numRows,numImages);X = permute(X,[2 1 3]);% %%然后将每个图像数据平化为1 by (numRows*numCols)向量,和将所有图像数据存储到numImages by (numRows*numCols)数组中。X =重塑(X,numRows*numCols,numImages)';流(['图像数据被读取到一个维度矩阵:%6d by %4d…\n'...'读取图像数据结束。\n'),大小(X, 1),大小(X, 2));% %%关闭文件文件关闭(文件标识);% %同样,读取标签数据。[fileID,errmsg] = fopen(labelFileName,“r”“b”);如果fileID < 0 error(errmsg);结束magicNum = fread(fileID,1,“int32”0,“b”);如果magicNum == 2049 fprintf(\nRead MNIST标签数据…\n'结束numItems = fread(fileID,1,“int32”0,“b”);流('数据集中的标签数量:%6d…\n', numItems);L = fread(fileID,inf,“无符号字符”);流([标签数据被读取到一个维度矩阵:%6d by %2d…\n...读取标签数据结束。\n),大小(L, 1),大小(L, 2));文件关闭(文件标识);

参考文献

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

相关的例子

更多关于