t_kahi’s blog

KNIMEやCellProfiler、創薬に関する記事と,日々のメモです

【KNIME】KNIMEでクラスタリング(2):階層型クラスリング

こんばんは,@PKです.

前回KNIMEでクラスタリング(1)でk-meansでクラスター分析について紹介しました.
www.t-kahi.com

今回はKNIMEでの階層型クラスリングについて紹介します.

階層型クラスタリングについて

階層型クラスタリングは距離の近いサンプル同士をクラスターとしてまとめていく手法です.
階層的クラスタリング(クラスター分析)、近いクラスターを結合していく
階層的クラスタリングの併合方法を図で確認 - Qiita
クラスター分析の手法②(階層クラスター分析) | データ分析基礎知識

下図のように距離が近いサンプルをまとめていき樹形図(デンドログラム)を作成していきます.
f:id:t_kahi:20190815210139p:plain

この階層型クラスタリングを行うKNIMEノードが用意されています.
nodepit.com
サンプル間の距離を定義する手法がいくつかありますので,Workflow紹介のときに例示します.

階層型クラスタリング

紹介するKNIME Workflowの概要を以下に示します.
f:id:t_kahi:20190815223714p:plain

まず,「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つのクラスタに分かれる下図のような結果となります.
f:id:t_kahi:20190815224702p:plain

「Hieralchical Clustering」ノードの実行

「Hieralchical Clustering」ノードの設定を下図に示します.
f:id:t_kahi:20190815230226p:plain

設定できるパラメータは下記のとおりです.

  • クラスターの数
  • データ間距離の定義(Euclidean, Manhattan )
  • クラスター間の距離のタイプ(single, average, complete)

クラスターの数は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でデンドログラムを見ることができます.
f:id:t_kahi:20190815230615p:plain
「Color Manager」でクラスターごとに色をつけて「Scatter Plot」で可視化した結果をいかに示します.
f:id:t_kahi:20190815230712p:plain
良い感じでクラスタに分かれています.

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()

出力結果を以下に示します.
f:id:t_kahi:20190815231847p:plain

「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

出力結果を以下に示します.
f:id:t_kahi:20190815232347p:plain

終わりに

KNIMEの「Hieralchical Clustering」ノードを使うのは非常に簡単なのですが,距離に関する手法がRやPythonと同じように色々と選べるわけではないのでその点だけ注意してください.

最後に階層型クラスタリングのWorkflow動画を紹介します.
youtu.be