No science, No life.

もっと科学を身近に

非線形次元削減法 t-SNE で手書き文字を分類してみた

t-SNE を使って、手書き文字データ MNIST を分類してみました。

MNIST データセットはここから拝借しました。
github.com

MNIST の解説はこれが分かりやすいですね ↓

www.atmarkit.co.jp

MNIST データを読みこんで、

% MNIST data
load('mnist.mat')

% data to be analyzed
idx = 1:10000;
X = double(testX(idx,:));
c = testY(idx);

t-SNE に放り込んで、ついでに k-means クラスタリングして、

% t-SNE
Y = tsne(X,'NumPCAComponents',30);

% k-means clustering
k = 10;
clu = kmeans(Y,k);

プロットしてみました。

subplot(121)
scatter(Y(:,1),Y(:,2),5,c,'filled')
colorbar
colormap jet
title('t-SNE on MNIST')

subplot(122)
scatter(Y(:,1),Y(:,2),5,clu-1,'filled')
colorbar
colormap jet
title('k-means clustering')

f:id:neocortex:20210419235448p:plain

ざっくり適当に放り込んだだけで、ほぼ完璧に分類できています (左図)。t-SNE スゴイ。

k-means でのクラスタリングも良い感じですが (右図)、ところどころ境界がおかしいですね。k-means はクラスタを球形にとってくるので、これは仕方ないのかもしれません。DBSCAN とかにすればもっと上手くいく、かもしれません。

jp.mathworks.com