MNISTでは主成分分析,t-SNE,UMAPでMNIST訓練データ6万文字の次元削減を試し,結果をカラーでプロットした。しかし,結果のプロットは手書き文字そのもので行うほうがわかりやすい。以下では6万文字を次元削減した上で,全体の約1/50をランダムに選び,元の手書き文字そのものでプロットした。
PCA:

t-SNE:

UMAP:

プログラムはちょっと強引で,もっとエレガントに書けそうだけれど,とりあえず:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import tensorflow as tf
rng = np.random.default_rng()
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x = x_train.reshape(60000, 28*28)
y = PCA(n_components=2).fit_transform(x)
def toimg(nx, ny, ax, ay):
img = np.zeros((ny,nx), dtype='uint8')
x1 = min(ax)
x2 = max(ax)
y1 = min(ay)
y2 = max(ay)
hx = (nx - 28) / (x2 - x1)
hy = (ny - 28) / (y2 - y1)
h = min(hx, hy)
for k in range(60000):
if rng.random() < 0.02:
i1 = int(h * (ax[k] - x1))
j1 = int(h * (y2 - ay[k]))
for i in range(28):
for j in range(28):
img[j1+j, i1+i] = min(int(img[j1+j, i1+i]) + int(x_train[k][j,i]), 255)
return img
img = toimg(1024, 1024, y[:,0], y[:,1])
plt.imshow(img, cmap='gray_r')
plt.imsave("mnistpca.png", img, cmap='gray_r')
t-SNE,UMAPも同様。
追記: Deep TDA というのもあるらしい。Why you should use Topological Data Analysis over t-SNE or UMAP?