LoginSignup
3
4

More than 5 years have passed since last update.

【機械学習入門】「K-meansクラスタリング」というのをやってみる♬

Last updated at Posted at 2019-02-09

参考の記事をちょっと試したら、少しはまったので備忘録で残しておく。

【参考】
・①K-meansクラスタリング

少し古い記事らしくて、言語仕様やリンクがちょっとということで、その修正を以下の通り、実施しました。

やったこと

・urllib.urlretrieveをurllib.request.urlretrieveに変更する
・color=colorsをc=colorsに変更する

・urllib.urlretrieveをurllib.request.urlretrieveに変更する

コード全体はおまけに載せておきます。
参考のとおり、「urlretrieveは、ネット上からファイルをダウンロードし保存するのに使う。しかし、2系と3系とで違いがありググラビリティが低い。なので、書き記す。」ということで、以下のとおり書き換えると動きました。

import urllib.request
# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/SchoolScore.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
urllib.request.urlretrieve(url, 'SchoolScore.txt')

【参考】
・②python3 urlretrieve

・color=colorsをc=colorsに変更する

こちらは、少し英文読まないといけないのですが、つまりmatplotlibに渡すとき混乱するので、colorではなくcで渡しましょうということで、colorをcにするとカラーが反映しました。
原文引用「For the time been, as suggested, use c instead of color」
【参考】
・③ValueError: Supply a 'c' kwarg or a 'color' kwarg but not both; they differ but their functionalities overlap

まとめ

・k-meansクラスタリングと主成分分析をやってみた

・離散データには応用できそうだけど、残念ながら音声の分類には不適当なようだ

おまけ

以下のコードは上記記載の変更以外は前出の参考①のとおりです。

# URL によるリソースへのアクセスを提供するライブラリをインポートする。
import urllib.request
import pandas as pd # データフレームワーク処理のライブラリをインポート
# 図やグラフを図示するためのライブラリをインポートする。
import matplotlib.pyplot as plt
from pandas.tools import plotting # 高度なプロットを行うツールのインポート
from sklearn.cluster import KMeans # K-means クラスタリングをおこなう
#import sklearn #機械学習のライブラリ
from sklearn.decomposition import PCA #主成分分析器

# ウェブ上のリソースを指定する
url = 'https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/SchoolScore.txt'
# 指定したURLからリソースをダウンロードし、名前をつける。
urllib.request.urlretrieve(url, 'SchoolScore.txt')
#('SchoolScore.txt', <httplib.HTTPMessage instance at 0x104143e18>)

df = pd.read_csv("SchoolScore.txt", sep='\t', na_values=".") # データの読み込み
df.head() #データの確認
df.iloc[:, 1:].head() #解析に使うデータは2列目以降

plotting.scatter_matrix(df[df.columns[1:]], figsize=(6,6), alpha=0.8, diagonal='kde')   #全体像を眺める
plt.savefig('k-means/scatter_plot.jpg')
plt.pause(1)
plt.close()

scatter_plot.jpg

# この例では 3 つのグループに分割 (メルセンヌツイスターの乱数の種を 10 とする)
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(df.iloc[:, 1:])
# 分類結果のラベルを取得する
labels = kmeans_model.labels_

# 分類結果を確認
print(labels)

以下が出力

[2 2 0 2 2 1 2 2 1 2 2 2 1 2 2 0 1 2 0 0 1 0 1 1 2 2 2 0 1 1 1 1 1 1 0 1 1]
# それぞれに与える色を決める。
color_codes = {0:'#00FF00', 1:'#FF0000', 2:'#0000FF'}
# サンプル毎に色を与える。
colors = [color_codes[x] for x in labels]

# 色分けした Scatter Matrix を描く。
plotting.scatter_matrix(df[df.columns[1:]], figsize=(6,6),c=colors, diagonal='kde', alpha=0.8)   #データのプロット
plt.savefig('k-means/scatter_color_plot.jpg')
plt.pause(1)
plt.close()

scatter_color_plot.jpg

#主成分分析の実行
pca = PCA()
pca.fit(df.iloc[:, 1:])
PCA(copy=True, n_components=None, whiten=False)

# データを主成分空間に写像 = 次元圧縮
feature = pca.transform(df.iloc[:, 1:])

# 第一主成分と第二主成分でプロットする
plt.figure(figsize=(6, 6))
for x, y, name in zip(feature[:, 0], feature[:, 1], df.iloc[:, 0]):
    plt.text(x, y, name, alpha=0.8, size=10)
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, color=colors)
plt.title("Principal Component Analysis")
plt.xlabel("The first principal component score")
plt.ylabel("The second principal component score")
plt.savefig('k-means/PCA12_plot.jpg')
plt.pause(1)
plt.close()

PCA12_plot.jpg

最後にそもそものデータを掲載しておく
https://raw.githubusercontent.com/maskot1977/ipython_notebook/master/toydata/SchoolScore.txt
以下のデータでは上記で得られた分類(ラベル)を追加しています。

Student Japanese Math English Category
0 80 85 100 2
1 96 100 100 2
2 54 83 98 0
3 80 98 98 2
4 90 92 91 2
5 84 78 82 1
6 79 100 96 2
7 88 92 92 2
8 98 73 72 1
9 75 84 85 2
10 92 100 96 2
11 96 92 90 2
12 99 76 91 1
13 75 82 88 2
14 90 94 94 2
15 54 84 87 0
16 92 89 62 1
17 88 94 97 2
18 42 99 80 0
19 70 98 70 0
20 94 78 83 1
21 52 73 87 0
22 94 88 72 1
23 70 73 80 1
24 95 84 90 2
25 95 88 84 2
26 75 97 89 2
27 49 81 86 0
28 83 72 80 1
29 75 73 88 1
30 79 82 76 1
31 100 77 89 1
32 88 63 79 1
33 100 50 86 1
34 55 96 84 0
35 92 74 77 1
36 97 50 73 1
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4