อัลกอริทึมการทำคลัสเตอร์ - การทำคลัสเตอร์ตามลำดับชั้น

ข้อมูลเบื้องต้นเกี่ยวกับการจัดกลุ่มตามลำดับชั้น

การจัดกลุ่มตามลำดับชั้นเป็นอีกหนึ่งอัลกอริทึมการเรียนรู้ที่ไม่ได้รับการดูแลซึ่งใช้เพื่อจัดกลุ่มจุดข้อมูลที่ไม่มีป้ายกำกับที่มีลักษณะคล้ายคลึงกัน อัลกอริธึมการจัดกลุ่มตามลำดับชั้นแบ่งออกเป็นสองประเภทต่อไปนี้ -

Agglomerative hierarchical algorithms- ในอัลกอริธึมลำดับชั้นแบบ agglomerative จุดข้อมูลแต่ละจุดจะถือว่าเป็นคลัสเตอร์เดียวจากนั้นจึงรวมหรือรวมกลุ่มกันอย่างต่อเนื่อง (แนวทางจากล่างขึ้นบน) ลำดับชั้นของคลัสเตอร์แสดงเป็น dendrogram หรือโครงสร้างต้นไม้

Divisive hierarchical algorithms - ในทางกลับกันในอัลกอริธึมแบบลำดับชั้นแบบแบ่งจุดข้อมูลทั้งหมดจะถือว่าเป็นคลัสเตอร์ใหญ่กลุ่มเดียวและกระบวนการจัดกลุ่มเกี่ยวข้องกับการแบ่ง (วิธีการจากบนลงล่าง) คลัสเตอร์ใหญ่กลุ่มหนึ่งออกเป็นคลัสเตอร์เล็ก ๆ

ขั้นตอนในการทำคลัสเตอร์แบบลำดับชั้นแบบ Agglomerative

เราจะอธิบายการจัดกลุ่มตามลำดับชั้นที่ใช้มากที่สุดและมีความสำคัญเช่น agglomerative ขั้นตอนในการดำเนินการเดียวกันมีดังนี้ -

  • Step 1- ถือว่าแต่ละจุดข้อมูลเป็นคลัสเตอร์เดียว ดังนั้นเราจะมีกลุ่ม K พูดตั้งแต่เริ่มต้น จำนวนจุดข้อมูลจะเป็น K เมื่อเริ่มต้น

  • Step 2- ตอนนี้ในขั้นตอนนี้เราจำเป็นต้องสร้างคลัสเตอร์ขนาดใหญ่โดยการรวมจุดข้อมูลตู้เสื้อผ้าสองจุด ซึ่งจะส่งผลให้มีคลัสเตอร์ K-1 ทั้งหมด

  • Step 3- ตอนนี้ในการสร้างกลุ่มเพิ่มเติมเราจำเป็นต้องเข้าร่วมกลุ่มตู้เสื้อผ้าสองกลุ่ม ซึ่งจะส่งผลให้คลัสเตอร์ K-2 ทั้งหมด

  • Step 4 - ตอนนี้ในการสร้างคลัสเตอร์ขนาดใหญ่หนึ่งกลุ่มให้ทำซ้ำสามขั้นตอนข้างต้นจนกว่า K จะกลายเป็น 0 เช่นไม่มีจุดข้อมูลให้เข้าร่วมอีกต่อไป

  • Step 5 - ในที่สุดหลังจากสร้างคลัสเตอร์ขนาดใหญ่ 1 กลุ่มแล้ว dendrograms จะถูกใช้เพื่อแบ่งออกเป็นหลายคลัสเตอร์ขึ้นอยู่กับปัญหา

บทบาทของ Dendrograms ใน Agglomerative Hierarchical Clustering

ดังที่เราได้กล่าวไว้ในขั้นตอนสุดท้ายบทบาทของ dendrogram จะเริ่มต้นเมื่อมีการสร้างคลัสเตอร์ขนาดใหญ่ Dendrogram จะถูกใช้เพื่อแบ่งคลัสเตอร์ออกเป็นหลาย ๆ จุดข้อมูลที่เกี่ยวข้องขึ้นอยู่กับปัญหาของเรา สามารถเข้าใจได้ด้วยความช่วยเหลือของตัวอย่างต่อไปนี้ -

ตัวอย่าง 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()

จากแผนภาพด้านบนเป็นเรื่องง่ายมากที่จะเห็นว่าเรามีสองกลุ่มในจุดข้อมูลออก แต่ในข้อมูลจริงอาจมีได้หลายพันคลัสเตอร์ ต่อไปเราจะวางแผน dendrograms ของ datapoints ของเราโดยใช้ Scipy library -

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

ตอนนี้เมื่อสร้างคลัสเตอร์ขนาดใหญ่แล้วระยะทางแนวตั้งที่ยาวที่สุดจะถูกเลือก จากนั้นเส้นแนวตั้งจะลากผ่านดังที่แสดงในแผนภาพต่อไปนี้ เมื่อเส้นแนวนอนตัดกับเส้นสีน้ำเงินที่จุดสองจุดจำนวนคลัสเตอร์จะเป็นสอง

ต่อไปเราต้องนำเข้าคลาสสำหรับการทำคลัสเตอร์และเรียกเมธอด fit_predict เพื่อทำนายคลัสเตอร์ เรากำลังนำเข้าคลาส AgglomerativeClustering ของไลบรารี sklearn.cluster -

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

แผนภาพด้านบนแสดงทั้งสองคลัสเตอร์จากจุดข้อมูลของเรา

ตัวอย่าง 2

ตามที่เราเข้าใจแนวคิดของ dendrograms จากตัวอย่างง่ายๆที่กล่าวถึงข้างต้นให้เราไปยังอีกตัวอย่างหนึ่งซึ่งเรากำลังสร้างกลุ่มของจุดข้อมูลในชุดข้อมูลโรคเบาหวานอินเดีย 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]
data.shape
(768, 9)
data.head()
slno. preg พลาส ปธน ผิวหนัง ทดสอบ มวล Pedi อายุ ชั้นเรียน
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')