tsne Настройки

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

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

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

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

Получите двумерные аналоги кластеров данных с помощью t-SNE. Используйте алгоритм Барнса-Хата для повышения эффективности на этом большом наборе данных. Используйте 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')

Несмотря на то, что настройка преувеличения влияет на рисунок, неясно, дает ли какая-либо настройка nondefault лучшую картину, чем настройка по умолчанию. Рисунок с преувеличением 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 имеет несколько кластеров, которые разделяются на две или более частей. Это показывает, что, если скорость обучения слишком мал, процесс минимизации может застрять в плохом локальном минимуме. A скорости обучения 2000 дает рисунок, подобную рисунку по умолчанию.

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

Большие скорости обучения или большие значения преувеличения могут привести к нежелательному начальному поведению. Чтобы увидеть это, установите большие значения этих параметров и установите 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 |

Расхождение Кулбэка-Лейблера увеличивается во время первых нескольких итераций, и норма градиента также увеличивается.

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

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 |

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

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

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 с настройками по умолчанию хорошо справляется с внедрением высокомерных начальных данных в двумерные точки, которые имеют четко определенные кластеры. Эффекты настроек алгоритма трудно предсказать. Иногда они могут улучшить кластеризацию, но по большей части настройки по умолчанию кажутся хорошими. Хотя скорость не является частью этого исследования, настройки могут повлиять на скорость алгоритма. В частности, алгоритм Барнса-Хата значительно быстрее на этих данных.

Код для обработки данных 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);

Ссылки

[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/

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

Подробнее о

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