非階層型クラスタリングの一つである「K平均法(K-means)」について書いていきます。
K平均法とは
与えられたクラスタ(cluster:集団,群)数 = K個
に分類し、クラスタの平均値をもとに分類することから、
K平均法(Kmeans)と呼ばれています。
どのようなデータを対象に行うか
scikit-learn(http://scikit-learn.org/stable/index.html)には、対象のデータへの使用に適した機械学習アルゴリズムを示すマップが公開されています。
引用元:http://scikit-learn.org/stable/tutorial/machine_learning_map/
今回は、
>50sample:Yes
predicting a category:Yes
labeld data:Yes
num of category known:Yes
<10K samples:No
というデータが対象のため、K平均法を使用します。(MiniBatchでもよい)
実践
contents_a(0あるいは1)の値を、contents_b、contents_cから分類していきます。
データ作成
# ライブラリ import pandas as pd import numpy as np #定義 loop_times = 100 a_0,a_1 = 0, 1 data_frame = pd.DataFrame(index=[], columns=['A', 'B','C']) #一行ずつdata_frameに追加 for i in range(loop_times): contens_a = a_0 if i > loop_times/2 else a_1 contens_b = np.random.randint(2) contens_c = np.random.randn() series = pd.Series([contens_a, contens_b, contens_c], index=data_frame.columns) data_frame = data_frame.append(series, ignore_index = True) # CSV ファイル (kmeans.csv) として出力 data_frame.to_csv("/kmeans.csv")
K平均法プログラム
# ライブラリ import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import cluster, preprocessing #作成したデータセットを読み込む df_all=pd.read_csv('/kmeans.csv') df_test=df_all[["A","B","C"]] df_test.columns = [u'label_A', u'label_B', u'label_C'] pd.DataFrame(df_test) #この行を実行するとデータが見れる #データの整形 X=df_test[["label_A","label_C"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) #描画 x=X_norm[:,0] y=X_norm[:,1] z=df_test["label_A"] plt.subplot(2, 1, 1) plt.scatter(x,y, c=z) plt.show # k-meansを実施 km=cluster.KMeans(n_clusters=2) z_km=km.fit(X_norm) #結果を描画 plt.subplot(2, 1, 2) plt.scatter(x,y, c=z_km.labels_) plt.scatter(z_km.cluster_centers_[:,0],z_km.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show