機器學習 - 層次聚類



層次聚類是另一種無監督學習演算法,用於將具有相似特徵的未標記資料點分組在一起。層次聚類演算法分為以下兩類:

  • 凝聚層次演算法 - 在凝聚層次演算法中,每個資料點都被視為單個叢集,然後依次合併或凝聚(自下而上方法)成對的叢集。叢集的層次結構表示為樹狀圖或樹結構。

  • 分裂層次演算法 - 另一方面,在分裂層次演算法中,所有資料點都被視為一個大的叢集,聚類過程涉及將一個大的叢集劃分為各種小的叢集(自上而下方法)。

執行凝聚層次聚類的步驟

我們將解釋最常用和最重要的層次聚類,即凝聚聚類。執行此操作的步驟如下:

  • 步驟 1 - 將每個資料點視為單個叢集。因此,我們開始時將有 K 個叢集。資料點的數量開始時也為 K。

  • 步驟 2 - 在此步驟中,我們需要透過連線兩個最接近的資料點來形成一個大的叢集。這將導致總共 K-1 個叢集。

  • 步驟 3 - 現在,為了形成更多叢集,我們需要連線兩個最接近的叢集。這將導致總共 K-2 個叢集。

  • 步驟 4 - 現在,為了形成一個大的叢集,重複上述三個步驟,直到 K 變為 0,即沒有更多的資料點可以連線。

  • 步驟 5 - 最後,在形成一個大的集群后,將使用樹狀圖根據問題將其劃分為多個叢集。

樹狀圖在凝聚層次聚類中的作用

正如我們在最後一步中討論的那樣,一旦形成大的叢集,樹狀圖的作用就開始了。樹狀圖將用於根據我們的問題將叢集分割成多個相關資料點的叢集。這可以透過以下示例來理解:

示例 1

為了理解,讓我們從匯入所需的庫開始:

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

接下來,我們將繪製本例中使用的數點:

X = np.array([[7,8],[12,20],[17,19],[26,15],[32,37],[87,75],[73,85],
[62,80],[73,60],[87,96],])
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() 

輸出

執行此程式碼時,它將生成以下繪圖作為輸出:

Hierarchical Clustering

從上圖可以很容易地看出,我們的資料點中有兩個叢集,但在現實世界的資料中,可能有數千個叢集。

接下來,我們將使用 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() 

它將生成以下繪圖:

Longest Vertical Distance

現在,一旦形成大的叢集,就選擇最長的垂直距離。然後繪製一條垂直線穿過它,如下圖所示。由於水平線在兩點與藍線相交,因此叢集數量將為兩個。

Longest Vertical_Distance Selected

接下來,我們需要匯入用於聚類的類並呼叫其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')

下圖顯示了我們資料點中的兩個叢集。

Two Clusters Datapoints

示例 2

正如我們在上面的簡單示例中理解了樹狀圖的概念一樣,讓我們轉向另一個示例,在該示例中,我們使用層次聚類建立 Pima 印第安人糖尿病資料集中的資料點的叢集:

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]

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=(7.2, 5.5))
plt.scatter(patient_data[:,0], patient_data[:,1], c=cluster.labels_,
cmap='rainbow') 

輸出

執行此程式碼時,它將生成以下兩個繪圖作為輸出:

Hierarchical Clustering1 Hierarchical Clustering2
廣告