Визуализация высоко-размерных данных с помощью t-SNE

В этом примере показано, как визуализировать данные MNIST [1], который состоит из изображений рукописных цифр, с помощью tsne функция. Изображения составляют 28 на 28 пикселей в полутоновом цвете. Каждое изображение имеет связанную метку от 0 до 9, которая является цифрой, которую представляет изображение. tsne уменьшает размерность данных с 784 исходных размерностей до 50 с помощью PCA, а затем до двух или трех с помощью алгоритма t-SNE Барнса-Хата.

Получение данных

Начните с получения изображений и данных о метках

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

Разархивируйте файлы. В данном примере используйте t10k-images данные.

imageFileName = 't10k-images.idx3-ubyte';
labelFileName = 't10k-labels.idx1-ubyte';

Обработайте файлы, чтобы загрузить их в рабочую область. Код для этой функции обработки появляется в конце этого примера.

[X,L] = processMNISTdata(imageFileName,labelFileName);
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-Hut алгоритма t-SNE, чтобы сэкономить время на этом относительно большом наборе данных.

rng default % for reproducibility
Y = tsne(X,'Algorithm','barneshut','NumPCAComponents',50);

Отобразите результат, окрашенный правильными метками.

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

t-SNE создает кластеры точек, основанные исключительно на их относительных сходствах, которые тесно соответствуют истинным меткам.

Уменьшите размерность данных до трех

t-SNE также может уменьшить данные до трёх размерностей. Установите tsne 'NumDimensions' Пара "имя-значение" с 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);

Ссылки

[1] Янн ЛеКун (Courant Institute, NYU) и Коринна Кортес (Google Labs, New York) имеют авторские права на набор данных MNIST, который является производной работой от исходных наборов данных NIST. Набор данных MNIST доступен в соответствии с условиями лицензии Creative Commons Attribution-Share Alike 3.0, https://creativecommons.org/licenses/by-sa/3.0/

Похожие примеры

Подробнее о