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