こんばんは,@PKです.
前回KNIMEでクラスタリング(1)でk-meansでクラスター分析について紹介しました.
www.t-kahi.com
今回はKNIMEでの階層型クラスリングについて紹介します.
階層型クラスタリングについて
階層型クラスタリングは距離の近いサンプル同士をクラスターとしてまとめていく手法です.
階層的クラスタリング(クラスター分析)、近いクラスターを結合していく
階層的クラスタリングの併合方法を図で確認 - Qiita
クラスター分析の手法②(階層クラスター分析) | データ分析基礎知識
下図のように距離が近いサンプルをまとめていき樹形図(デンドログラム)を作成していきます.
この階層型クラスタリングを行うKNIMEノードが用意されています.
nodepit.com
サンプル間の距離を定義する手法がいくつかありますので,Workflow紹介のときに例示します.
階層型クラスタリング
紹介するKNIME Workflowの概要を以下に示します.
まず,「Python Source」でサンプルデータを作成し,そのデータを「Hierarchical Clustering」ノードで処理をします.
クラスター分けをした後に,クラスターごとに色をつけて可視化します.
また,前回と同様にRとPythonでも同様の処理を行います.
サンプルデータ作成
サンプルデータを「Python Source」を使って作成します.
import numpy as np import matplotlib.pyplot as plt import pandas as pd import mglearn from IPython.display import display from sklearn.datasets import make_blobs X, y = make_blobs(random_state=42) print(X) print(y) output_table = pd.DataFrame(X)
今回は散布図として表示していませんが,出力結果は(1)と同様に,3つのクラスタに分かれる下図のような結果となります.
「Hieralchical Clustering」ノードの実行
「Hieralchical Clustering」ノードの設定を下図に示します.
設定できるパラメータは下記のとおりです.
クラスターの数は3に設定しました.
また,距離に関する言葉について下記にまとめました.
Distance Function:
Euclidean : ユークリッド距離(一般的によく使用する距離の定義)
Manhattan : マンハッタン距離(各座標の差(の絶対値)の総和)
L1距離(マンハッタン距離)の意味と性質 | 高校数学の美しい物語
Linkage Type :
Single Linkage : 2つのクラスタの最も近い距離の2点を距離の定義とする
Complete Linkage : 2つのクラスタの最も遠い距離の2点を距離の定義とする
Average Linkage : 2つのクラスタの平均の距離の2点を距離の定義とする
KNIMEノードでは上記しか選べないので,もしこれ以外の手法を使いたい場合はRやPythonを使うのが良いでしょう.
階層的クラスタリングと、任意の数のクラスタへの分割 - Qiita
今回はDistance Function = "Euclidean",Linkage Type = "average"を選択しました.
「Hieralchical Clustering」ノードの実行した後に,右クリック⇒Viewsでデンドログラムを見ることができます.
「Color Manager」でクラスターごとに色をつけて「Scatter Plot」で可視化した結果をいかに示します.
良い感じでクラスタに分かれています.
「Python Script (1⇒1)」
階層型クラスタリングをPythonのscikit-learnを使って同様に行います.
from sklearn.datasets import make_blobs from sklearn.cluster import AgglomerativeClustering import pandas as pd agg = AgglomerativeClustering(n_clusters=3) predict = pd.DataFrame(agg.fit_predict(input_table),columns=["predict"]) print(predict) new_input = input_table.reset_index(drop=True) print(new_input) results = new_input.join(predict) output_table = results
出力された結果を「Python View」で可視化します.
from io import BytesIO import numpy as np import matplotlib.pyplot as plt import pandas as pd from IPython.display import display import seaborn as sns # Create buffer to write into buffer = BytesIO() sns.set_style("whitegrid") data = input_table image = plt.scatter(data['0'], data['1'], c=data["predict"]) # Create plot and write it into the buffer image.get_figure().savefig(buffer, format='svg') # The output is the content of the buffer output_image = buffer.getvalue()
出力結果を以下に示します.
「R Snippet」
同様に,Rでも階層型クラスタリングの例を示します.
data <- knime.in distance <- dist(data) hc <- hclust(distance, "ward.D2") result <- cutree(hc,k=3) knime.out <- data.frame(data, result)
出力された結果を「R View」で可視化します.
#R VIew (workspace) library(ggplot2) data <- knime.in p <- ggplot(data, aes(x=X0,y=X1,col=result)) + geom_point() p
出力結果を以下に示します.
終わりに
KNIMEの「Hieralchical Clustering」ノードを使うのは非常に簡単なのですが,距離に関する手法がRやPythonと同じように色々と選べるわけではないのでその点だけ注意してください.