Machine-learning-with-python-clustering-algorithms-hierarchical

提供:Dev Guides
移動先:案内検索

機械学習-階層的クラスタリング

階層的クラスタリングの概要

階層的クラスタリングは、同様の特性を持つラベルなしデータポイントをグループ化するために使用される別の教師なし学習アルゴリズムです。 階層的なクラスタリングアルゴリズムは、次の2つのカテゴリに分類されます。

アグロメレーティブ階層アルゴリズム-アグロメレーティブ階層アルゴリズムでは、各データポイントは単一のクラスターとして扱われ、クラスターのペアを連続的にマージまたはアグロメレートします(ボトムアップアプローチ)。 クラスターの階層は、樹状図またはツリー構造として表されます。

分割型階層アルゴリズム-一方、分割型階層アルゴリズムでは、すべてのデータポイントが1つの大きなクラスターとして扱われ、クラスタリングのプロセスでは、1つの大きなクラスターをさまざまな小さなクラスターに分割(トップダウンアプローチ)します。

凝集型階層クラスタリングを実行する手順

最も使用されている重要な階層的クラスタリング、つまり 凝集性。 同じことを実行する手順は次のとおりです-

  • *ステップ1 *-各データポイントを単一のクラスターとして扱います。 したがって、開始時にK個のクラスターが存在することになります。 データポイントの数も開始時にKになります。
  • *ステップ2 *-このステップでは、2つのクローゼットデータポイントを結合して大きなクラスターを形成する必要があります。 これにより、合計K-1クラスターになります。
  • *ステップ3 *-次に、より多くのクラスターを形成するには、2つのクローゼットクラスターを結合する必要があります。 これにより、合計K-2クラスターになります。
  • *ステップ4 *-1つの大きなクラスターを形成するには、Kが0になるまで上記の3つのステップを繰り返します。 結合するデータポイントが残っていません。
  • *ステップ5 *-最後に、単一の大きなクラスターを作成した後、樹状図を使用して、問題に応じて複数のクラスターに分割します。

凝集型階層クラスタリングにおける樹状図の役割

最後のステップで説明したように、大きなクラスターが形成されると、樹状図の役割が始まります。 問題に応じて、樹状図を使用してクラスターを関連するデータポイントの複数のクラスターに分割します。 それは次の例の助けを借りて理解することができます-

例1

理解するために、次のように必要なライブラリのインポートから始めましょう-

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

次に、この例で使用したデータポイントをプロットします-

X = np.array(
   [[labels = range(1, 11)
plt.figure(figsize = (10, 7))
plt.subplots_adjust(bottom = 0.1)
plt.scatter(X[:,0],X[:,1], label = 'True Position')
for label, x, y in zip(labels, X[:, 0], X[:, 1]):
   plt.annotate(
      label,xy = (x, y), xytext = (-3, 3),textcoords = 'offset points', ha = 'right', va = 'bottom')
plt.show()

データポイントのプロット

上記の図から、アウトデータポイントに2つのクラスターがあることが非常に簡単にわかりますが、実際のデータでは、数千のクラスターが存在する可能性があります。 次に、Scipyライブラリを使用してデータポイントの樹状図をプロットします-

from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
linked = linkage(X, 'single')
labelList = range(1, 11)
plt.figure(figsize = (10, 7))
dendrogram(linked, orientation = 'top',labels = labelList,
   distance_sort ='descending',show_leaf_counts = True)
plt.show()

樹状図のプロット

ここで、大きなクラスターが形成されると、最長の垂直距離が選択されます。 次の図に示すように、垂直線が引かれます。 水平線が2点で青い線と交差するため、クラスターの数は2になります。

青い線

次に、クラスター化のためにクラスをインポートし、そのfit_predictメソッドを呼び出してクラスターを予測する必要があります。 _sklearn.cluster_ライブラリの_AgglomerativeClustering_クラスをインポートしています-

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters = 2, affinity = 'euclidean', linkage = 'ward')
cluster.fit_predict(X)

次に、次のコードの助けを借りてクラスタをプロットします-

plt.scatter(X[:,0],X[:,1], c = cluster.labels_, cmap = 'rainbow')

Sklearn Cluster

上の図は、データポイントからの2つのクラスターを示しています。

例2

上記の簡単な例から樹状図の概念を理解したので、階層クラスタリングを使用してPima Indian Diabetes Datasetのデータポイントのクラスターを作成する別の例に移りましょう。

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
import numpy as np
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names = headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
data.shape
(768, 9)
data.head()
Preg Plas Pres Skin Test Mass Pedi Age Class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
patient_data = data.iloc[:, 3:5].values
import scipy.cluster.hierarchy as shc
plt.figure(figsize = (10, 7))
plt.title("Patient Dendograms")
dend = shc.dendrogram(shc.linkage(data, method = 'ward'))

患者デンドグラム

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters = 4, affinity = 'euclidean', linkage = 'ward')
cluster.fit_predict(patient_data)
plt.figure(figsize = (10, 7))
plt.scatter(patient_data[:,0], patient_data[:,1], c = cluster.labels_, cmap = 'rainbow')

AgglomerativeClustering