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