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. Используйте алгоритм 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-хижины особенно быстрее на этих данных.
Вот код функции, которая считывает данные в рабочую область.
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] Yann LeCun (Бегущий Институт, NYU) и Коринна Кортес (Google Labs, Нью-Йорк) обладает авторским правом набора данных MNIST, который является производной работой от исходных наборов данных NIST. Набор данных MNIST сделан доступным в соответствии с Долей Приписывания Creative Commons Одинаково 3,0 лицензии, https://creativecommons.org/licenses/by-sa/3.0/