exponenta event banner

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

Хотя настройка преувеличения влияет на рисунок, неясно, дает ли какая-либо настройка, не заданная по умолчанию, лучшее изображение, чем настройка по умолчанию. Цифра с преувеличением 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 имеет несколько кластеров, которые делятся на две или более частей. Это показывает, что если скорость обучения слишком мала, процесс минимизации может застрять в плохом локальном минимуме. Показатель обучения 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, Нью-Йорк) имеют авторские права на набор данных MNIST, который является производной работой от оригинальных наборов данных NIST. Набор данных MNIST доступен на условиях лицензии Creative Commons Attribution-Share Alike 3.0, https://creativecommons.org/licenses/by-sa/3.0/

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

Подробнее

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