質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

887閲覧

scikit-learnを用いて9つのクラスタリングと正解ラベルの色を対応させたい。

koyakazu

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/19 06:01

前提・実現したいこと

predの散布図とY_labelの散布図とのクラスタの色を対応させたい。

該当のソースコード

python

1from sklearn import datasets 2mnist = datasets.fetch_mldata("MNIST original", data_home="data/mnist") 3from sklearn.preprocessing import StandardScaler 4from sklearn.decomposition import PCA 5scaler = StandardScaler() 6scaler.fit(mnist.data) 7X = scaler.transform(mnist.data) 8pca = PCA(n_components=2) 9pca.fit(X) 10X_pca = pca.transform(X) 11import matplotlib.pyplot as plt 12import mglearn 13mglearn.discrete_scatter(X_pca[:, 0], X_pca[:, 1], mnist.target) 14plt.legend(mnist.target, loc=0) 15from sklearn.cluster import KMeans 16a = 10 17km = KMeans(n_clusters=a) 18km.fit(X_pca) 19pred = km.predict(X_pca) 20label = KMeans(n_clusters=a) 21label.fit(X_pca) 22Y_label = label.labels_ 23mglearn.discrete_scatter(X[:, 0], X[:, 1], pred) 24plt.legend(pred, loc=0) 25mglearn.discrete_scatter(X[:, 0], X[:, 1], Y_label) 26plt.legend(Y_label, loc=0)

補足情報(FW/ツールのバージョンなど)

python3.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

他の回答者さんが指摘されているように、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:33

編集2018/09/19 07:44
tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koyakazu

2018/09/19 07:51

ありがとうございます。
guest

0

基本的に無理です。だいたい、元のクラスとクラスタがそのまま対応する訳ではありませんし。

こういう場合、元のクラスは記号、クラスタは色で表現するといった処置を取れば良いのではないでしょうか。

投稿2018/09/19 06:29

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koyakazu

2018/09/19 07:16

その場合のコードはどのようになるのでしょうか?
hayataka2049

2018/09/19 09:01 編集

matplotlib.pyplot.scatterであればmarkerとcを指定できるので、元のクラスでループさせてmarkerを変えつつcをクラスタに対して配列で指定してplotすればできます mglearnでどこまでできるかはわからないので、ご自身で調べてみてください
koyakazu

2018/09/19 09:02

わかりました。
hayataka2049

2018/09/19 09:10

tiitoiさんの回答の図を見ていると、マーカーで頑張ったところでデータ数的にろくに見えなさそうですが・・・ あと、あまり本筋とは関係ありませんが、PCAの第一第二主成分の寄与率を確認しておくべきです(たぶん2次元では情報の大半が落ちているから)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問