Настройки tsne

Этот пример показывает эффекты различных настроек tsne.

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

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

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

Получите двумерные аналоги кластеров данных с помощью t-SNE. Используйте алгоритм Barnes-хижины для лучшей производительности на этом большом наборе данных. Используйте PCA, чтобы уменьшать начальные размерности с 784 до 50.

rng default % for reproducibility
Y = tsne(X,'Algorithm','barneshut','NumPCAComponents',50);
figure
gscatter(Y(:,1),Y(:,2),L)
title('Default Figure')

t-SNE создает фигуру с хорошо разделенными кластерами и относительно немногими точками данных, которые кажутся неуместными.

Недоумение

Попытайтесь изменить установку недоумения, чтобы видеть эффект на фигуру.

rng default % for fair comparison
Y100 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Perplexity',100);
figure
gscatter(Y100(:,1),Y100(:,2),L)
title('Perplexity 100')

rng default % for fair comparison
Y4 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Perplexity',4);
figure
gscatter(Y4(:,1),Y4(:,2),L)
title('Perplexity 4')

Установка недоумения к 100 урожаям фигура, которая в основном подобна фигуре по умолчанию. Кластеры более высоки, чем с настройкой по умолчанию. Однако установка недоумения к 4 дает фигуре без хорошо разделенных кластеров. Кластеры более свободны, чем с настройкой по умолчанию.

Преувеличение

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

rng default % for fair comparison
YEX0 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Exaggeration',20);
figure
gscatter(YEX0(:,1),YEX0(:,2),L)
title('Exaggeration 20')

rng default % for fair comparison
YEx15 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Exaggeration',1.5);
figure
gscatter(YEx15(:,1),YEx15(:,2),L)
title('Exaggeration 1.5')

В то время как установка преувеличения имеет эффект на фигуру, не ясно, дает ли какая-либо установка не по умолчанию лучшее изображение, чем настройка по умолчанию. Фигура с преувеличением 20 подобна фигуре по умолчанию. В целом большее преувеличение создает больше пустого пространства между встроенными кластерами. Преувеличение 1,5 причин группы маркировало 1 и 6, чтобы разделить в две группы каждого, нежелательный результат. Преувеличение значений в совместном распределении X делает значения в совместном распределении Y меньшими. Это делает намного легче для встроенных точек переместиться друг относительно друга. Разделение кластеров 1 и 6 отражает этот эффект.

Темп обучения

Попытайтесь изменить установку темпа обучения, чтобы видеть эффект на фигуру.

rng default % for fair comparison
YL5 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'LearnRate',5);
figure
gscatter(YL5(:,1),YL5(:,2),L)
title('Learning Rate 5')

rng default % for fair comparison
YL2000 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'LearnRate',2000);
figure
gscatter(YL2000(:,1),YL2000(:,2),L)
title('Learning Rate 2000')

У фигуры с темпом обучения 5 есть несколько кластеров, которые разделяют в две или больше части. Это показывает, что, если темп обучения является слишком небольшим, процесс минимизации может застрять в плохом локальном минимуме. Темп обучения 2 000 дает фигуре, подобной фигуре по умолчанию.

Начальное поведение с различными настройками

Большие темпы обучения или большие значения преувеличения могут привести к нежелательному начальному поведению. Чтобы видеть это, установите большие значения этих параметров и установите NumPrint и Verbose к 1 показывать все итерации. Остановите итерации после 10, когда цель этого эксперимента состоит в том, чтобы просто посмотреть на начальное поведение.

Начните путем установки преувеличения на 200.

rng default % for fair comparison
opts = statset('MaxIter',10);
YEX200 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Exaggeration',200,...
    'NumPrint',1,'Verbose',1,'Options',opts);
|==============================================|
|   ITER   | KL DIVERGENCE   | NORM GRAD USING |
|          | FUN VALUE USING | EXAGGERATED DIST|
|          | EXAGGERATED DIST| OF X            |
|          | OF X            |                 |
|==============================================|
|        1 |    2.190347e+03 |    6.078667e-05 |
|        2 |    2.190352e+03 |    4.769050e-03 |
|        3 |    2.204061e+03 |    9.423678e-02 |
|        4 |    2.464585e+03 |    2.113271e-02 |
|        5 |    2.501222e+03 |    2.616407e-02 |
|        6 |    2.529362e+03 |    3.022570e-02 |
|        7 |    2.553233e+03 |    3.108418e-02 |
|        8 |    2.562822e+03 |    3.278873e-02 |
|        9 |    2.538056e+03 |    3.222265e-02 |
|       10 |    2.504932e+03 |    3.671708e-02 |

Расхождение Kullback-Leibler увеличивается во время первых нескольких итераций и нормы увеличений градиента также.

Чтобы видеть конечный результат встраивания, позвольте алгоритму выполнение до завершения с помощью критерия остановки по умолчанию.

rng default % for fair comparison
YEX200 = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'Exaggeration',200);
figure
gscatter(YEX200(:,1),YEX200(:,2),L)
title('Exaggeration 200')

Это значение преувеличения не дает чистое разделение в кластеры.

Покажите начальное поведение, когда темп обучения будет 100,000.

rng default % for fair comparison
YL100k = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'LearnRate',1e5,...
    'NumPrint',1,'Verbose',1,'Options',opts);
|==============================================|
|   ITER   | KL DIVERGENCE   | NORM GRAD USING |
|          | FUN VALUE USING | EXAGGERATED DIST|
|          | EXAGGERATED DIST| OF X            |
|          | OF X            |                 |
|==============================================|
|        1 |    2.815885e+01 |    1.024049e-06 |
|        2 |    2.816002e+01 |    2.902059e-04 |
|        3 |    3.195873e+01 |    7.355889e-04 |
|        4 |    3.348151e+01 |    3.958901e-04 |
|        5 |    3.365935e+01 |    2.876905e-04 |
|        6 |    3.342462e+01 |    3.906245e-04 |
|        7 |    3.303205e+01 |    4.037983e-04 |
|        8 |    3.263320e+01 |    5.665630e-04 |
|        9 |    3.235384e+01 |    4.319099e-04 |
|       10 |    3.211238e+01 |    4.803526e-04 |

Снова, расхождение Kullback-Leibler увеличивается во время первых нескольких итераций и нормы увеличений градиента также.

Чтобы видеть конечный результат встраивания, позвольте алгоритму выполнение до завершения с помощью критерия остановки по умолчанию.

rng default % for fair comparison
YL100k = tsne(X,'Algorithm','barneshut','NumPCAComponents',50,'LearnRate',1e5);
figure
gscatter(YL100k(:,1),YL100k(:,2),L)
title('Learning Rate 100,000')

Темп обучения является слишком большим, и не дает полезного встраивания.

Заключение

tsne с настройками по умолчанию делает хорошее задание встраивания высоко-размерных исходных данных в двумерные точки, которые четко определили кластеры. Эффекты настроек алгоритма трудно предсказать. Иногда они могут улучшить кластеризацию, но по большей части настройки по умолчанию кажутся хорошими. В то время как скорость не является частью этого расследования, настройки могут влиять на скорость алгоритма. В частности, алгоритм Barnes-хижины особенно быстрее на этих данных.

Код к процессу данные MNIST

Вот код функции, которая считывает данные в рабочую область.

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);

Связанные примеры

Больше о

Внешние веб-сайты