Этот пример показывает, как визуализировать данные MNIST, которые состоят из изображений рукописных цифр, с помощью функции tsne
. Изображения являются 28 28 пикселями в шкале полутонов. Каждое изображение имеет связанную метку от 0 до 9, который является цифрой, которую представляет изображение. tsne
уменьшает размерность данных с 784 исходных размерностей до 50 использований PCA, и затем к двум или трем использованиям t-SNE алгоритма Barnes-хижины.
Начните путем получения изображения и маркируйте данные из
http://yann.lecun.com/exdb/mnist/
Разархивируйте файлы. В данном примере используйте данные t10k-images
.
imageFileName = 't10k-images.idx3-ubyte'; labelFileName = 't10k-labels.idx1-ubyte';
Обработайте файлы, чтобы загрузить их в рабочей области. Код для этой функции обработки появляется в конце этого примера. Чтобы выполнить код, добавьте директорию функции к пути поиска файлов.
addpath(fullfile(matlabroot,'examples','stats')); % add to the path [X,L] = processMNISTdata(imageFileName,labelFileName); rmpath(fullfile(matlabroot,'examples','stats')); % remove from the path
Read MNIST image data... Number of images in the dataset: 10000 ... Each image is of 28 by 28 pixels... The image data is read to a matrix of dimensions: 10000 by 784... End of reading image data. Read MNIST label data... Number of labels in the dataset: 10000 ... The label data is read to a matrix of dimensions: 10000 by 1... End of reading label data.
Получите двумерные аналоги кластеров данных с помощью t-SNE. Используйте PCA, чтобы уменьшать начальную размерность до 50. Используйте вариант Barnes-хижины t-SNE алгоритма, чтобы сэкономить время на этом относительно большом наборе данных.
rng default % for reproducibility Y = tsne(X,'Algorithm','barneshut','NumPCAComponents',50);
Отобразите результат, окрашенный с правильными метками.
figure gscatter(Y(:,1),Y(:,2),L)
t-SNE создает кластеры точек, базирующихся только на их относительных общих чертах, которые соответствуют тесно истинным меткам.
t-SNE может также уменьшать данные до трех измерений. Установите пару "имя-значение" 'NumDimensions'
tsne
на 3
.
rng default % for fair comparison Y3 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'NumDimensions',3); figure scatter3(Y3(:,1),Y3(:,2),Y3(:,3),15,L,'filled'); view(-93,14)
Вот код функции, которая считывает данные в рабочую область.
function [X,L] = processMNISTdata(imageFileName,labelFileName) [fileID,errmsg] = fopen(imageFileName,'r','b'); if fileID < 0 error(errmsg); end %% % First read the magic number. This number is 2051 for image data, and % 2049 for label data magicNum = fread(fileID,1,'int32',0,'b'); if magicNum == 2051 fprintf('\nRead MNIST image data...\n') end %% % Then read the number of images, number of rows, and number of columns numImages = fread(fileID,1,'int32',0,'b'); fprintf('Number of images in the dataset: %6d ...\n',numImages); numRows = fread(fileID,1,'int32',0,'b'); numCols = fread(fileID,1,'int32',0,'b'); fprintf('Each image is of %2d by %2d pixels...\n',numRows,numCols); %% % Read the image data X = fread(fileID,inf,'unsigned char'); %% % Reshape the data to array X X = reshape(X,numCols,numRows,numImages); X = permute(X,[2 1 3]); %% % Then flatten each image data into a 1 by (numRows*numCols) vector, and % store all the image data into a numImages by (numRows*numCols) array. X = reshape(X,numRows*numCols,numImages)'; fprintf(['The image data is read to a matrix of dimensions: %6d by %4d...\n',... 'End of reading image data.\n'],size(X,1),size(X,2)); %% % Close the file fclose(fileID); %% % Similarly, read the label data. [fileID,errmsg] = fopen(labelFileName,'r','b'); if fileID < 0 error(errmsg); end magicNum = fread(fileID,1,'int32',0,'b'); if magicNum == 2049 fprintf('\nRead MNIST label data...\n') end numItems = fread(fileID,1,'int32',0,'b'); fprintf('Number of labels in the dataset: %6d ...\n',numItems); L = fread(fileID,inf,'unsigned char'); fprintf(['The label data is read to a matrix of dimensions: %6d by %2d...\n',... 'End of reading label data.\n'],size(L,1),size(L,2)); fclose(fileID);