他の回答者さんが指摘されているように、k-mean のクラス番号と MNIST の元のクラスは関連性がないので、色を統一しても意味がないですね。
python
1from sklearn import datasets
2from sklearn.cluster import KMeans
3from sklearn.decomposition import PCA
4from sklearn.model_selection import train_test_split
5from sklearn.preprocessing import StandardScaler
6import matplotlib.pyplot as plt
7import numpy as np
8
9# MNIST データを取得する。
10mnist = datasets.fetch_mldata("MNIST original", data_home="data/mnist")
11
12# 標準化する。
13scaler = StandardScaler()
14scaler.fit(mnist.data)
15X = scaler.transform(mnist.data)
16
17# 主成分分析を行う。
18pca = PCA(n_components=2)
19pca.fit(X)
20x_pca = pca.transform(X)
21
22# K-mean クラスタリングを行う。
23kmean = KMeans(n_clusters=10)
24kmean.fit(x_pca)
25
26num_classes = 10 # クラス数
27
28# クラスごとの色を生成する。
29colors = np.random.rand(num_classes, 3)
30
31# 各データの主成分を可視化する。
32fig, axes = plt.subplots(figsize=(8, 6))
33for cls, color in zip(range(num_classes), colors):
34 indices = mnist.target == cls
35 axes.scatter(x_pca[indices, 0], x_pca[indices, 1], label=int(cls), s=0.1, c=color)
36
37axes.legend(markerscale=20)
38plt.show()
python
1x_train, x_test, y_train, y_test = train_test_split(
2 x_pca, mnist.target, test_size=0.3)
3
4# k-平均クラスタリングを行う。
5kmean = KMeans(n_clusters=num_classes)
6kmean.fit(x_train)
7pred = kmean.predict(x_test)
8
9# クラスごとの色を生成する。
10colors = np.random.rand(num_classes, 3)
11
12# クラスタリング結果を可視化する。
13fig, axes = plt.subplots(figsize=(8, 6))
14for cls, color in zip(range(num_classes), colors):
15 indices = kmean.labels_ == cls
16 axes.scatter(x_train[indices, 0], x_train[indices, 1], label=int(cls), s=0.1, c=color)
17
18axes.set_title('train result')
19axes.legend(markerscale=20)
20plt.show()
21
22# 予測結果を可視化する。
23fig, axes = plt.subplots(figsize=(8, 6))
24for cls, color in zip(range(num_classes), colors):
25 indices = pred == cls
26 axes.scatter(x_test[indices, 0], x_test[indices, 1], label=int(cls), s=0.1, c=color)
27
28axes.set_title('test result')
29axes.legend(markerscale=20)
30plt.show()
提案
例えば、k-mean のクラスタリングの分類境界と元のデータの散文図とかなら意味があるかもしれません。
x_min, x_max = x_pca[:, 0].min() - 1, x_pca[:, 0].max() + 1
y_min, y_max = x_pca[:, 1].min() - 1, x_pca[:, 1].max() + 1
X, Y = np.meshgrid(np.arange(x_min, x_max), np.arange(y_min, y_max))
Z = kmean.predict(np.c_[X.ravel(), Y.ravel()])
Z = Z.reshape(X.shape)
fig, axes = plt.subplots(figsize=(8, 6))
# 分類境界を可視化する。
axes.imshow(Z, interpolation='nearest',
cmap=plt.cm.Paired,
extent=(X.min(), X.max(), Y.min(), Y.max()),
aspect='auto', origin='lower', alpha=0.3)
# 元のデータを可視化する。
for cls, color in zip(range(num_classes), colors):
indices = mnist.target == cls
axes.scatter(x_pca[indices, 0], x_pca[indices, 1],
label=int(cls), s=0.1, c=color)
axes.legend(markerscale=20)
plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/19 07:51