Python中層次聚類的詳細講解
前言
層次聚類是流行的無監(jiān)督學習算法之一。層次聚類所做的就是找到數(shù)據(jù)集中具有相似屬性的元素,并將它們組合在一個集群中。最后,我們得到一個單一的大集群,其主要元素是數(shù)據(jù)點的集群或其他集群的集群。
一、聚類流程與基本原理
系統(tǒng)聚類法(hierarchical clustering method),又叫分層聚類法,是目前最常用的聚類分析方法。其基本步驟如下:假設(shè)樣本中有n個樣品,那么就先將這n個樣品看作n類,也就是一個樣品一個類,然后將性質(zhì)最接近的兩類合并為一個新的類,這樣就得到n-1個類,接著從中再找出最接近的兩個類,讓其進行合并,這樣就變?yōu)閚-2個類,讓此過程持續(xù)進行下去,最后所有的樣品都歸為一類,把上述過程繪制成一張圖,這個圖就稱為聚類圖,從圖中再決定分為多少類。如下所示:

樣點之間的相似度是根據(jù)距離來實現(xiàn)的,比如最短距離法、最長距離法、重心法、類平均法以及ward法。
最短距離法 :從兩個類中找出距離最短的兩個樣品點。如下:

最長距離法 :同理如下:


類平均法: 就是取兩個類之間所有點的距離的平均值
重心法 :名如其法,如下

離差平方和法 :離差平方和法又叫Ward法,此方法查找聚合偏差。例如,如果我們有兩個集群,我們可以假裝將它們合并為一個集群,然后估計結(jié)果集群的質(zhì)心。之后,我們找到新質(zhì)心的所有點的平方偏差之和。對于不同的合并,我們將獲得其他變化。因此,我們選擇合并最小的距離作為我們的距離。
二、實現(xiàn)層次聚類
數(shù)據(jù)下載:點擊這里下載
如下:

2.1 導入相關(guān)庫
import numpy as np import matplotlib.pyplot as plt import pandas as pd
2.2 讀取數(shù)據(jù)
ourData = pd.read_csv('Mall_Customers.csv')
ourData.head()
如下:

我們將使用該數(shù)據(jù)集在Annual Income (k$)和Spending Score (1-100)列上實現(xiàn)我們的層次聚類模型。所以我們需要從我們的數(shù)據(jù)集中提取這兩個特征:
newData = ourData.iloc[:, [3, 4]].values newData
如下:

可以看到數(shù)據(jù)不一致,我們必須對數(shù)據(jù)進行縮放,以使各種特征具有可比性;否則,我們最終會得到一個劣質(zhì)的模型。原因是層次聚類,就像機器學習中的許多其他算法一樣,是基于距離的(歐幾里得距離)。
2.3 確定最佳集群數(shù)
在嘗試對我們的數(shù)據(jù)進行聚類之前,我們需要知道我們的數(shù)據(jù)可以最佳地聚類到多少個集群。所以讓我們首先在我們的數(shù)據(jù)集上實現(xiàn)一個樹狀圖來實現(xiàn)這個目標:
import scipy.cluster.hierarchy as sch # 導入層次聚類算法
dendrogram = sch.dendrogram(sch.linkage(newData , method = 'ward')) # 使用樹狀圖找到最佳聚類數(shù)
plt.title('Dendrogram') # 標題
plt.xlabel('Customers') # 橫標簽
plt.ylabel('Euclidean distances') # 縱標簽
plt.show()
樹狀圖,如下所示:

看上面的樹狀圖,可以確定最佳聚類數(shù);假設(shè)地,推斷整個樹狀圖中的所有水平線,然后找到不與這些假設(shè)線相交的最長垂直線。
越過那條最長的線,建立一個分界線。我們可以對數(shù)據(jù)進行最佳聚類的聚類數(shù)等于已建立的閾值所跨越的歐幾里德距離(垂直線)的計數(shù)。
在我們剛剛獲得的樹狀圖中,沒有延伸的水平線交叉的最長垂直線位于綠色部分。第三條線位于歐幾里得距離 (110 - 250) 之間。將我們的閾值設(shè)為 150,獲得的最佳聚類數(shù)為 5。知道我們的數(shù)據(jù)應(yīng)該聚集到的最佳數(shù)量;我們現(xiàn)在可以訓練我們的聚類模型來實現(xiàn)這個目標。
2.4 層次聚類模型訓練
from sklearn.cluster import AgglomerativeClustering # n_clusters為集群數(shù),affinity指定用于計算距離的度量,linkage參數(shù)中的ward為離差平方和法 Agg_hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward') y_hc = Agg_hc.fit_predict(newData) # 訓練數(shù)據(jù)
上面的代碼訓練了我們的模型,我們現(xiàn)在可以繼續(xù)并可視化數(shù)據(jù)是如何聚集的:
plt.scatter(newData[y_hc == 0, 0], newData[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1') # cluster 1
plt.scatter(newData[y_hc == 1, 0], newData[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2') # cluster 2
plt.scatter(newData[y_hc == 2, 0], newData[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3') # cluster 3
plt.scatter(newData[y_hc == 3, 0], newData[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') # cluster 4
plt.scatter(newData[y_hc == 4, 0], newData[y_hc == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') # cluster 5
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
如下:

關(guān)于層次聚類,我們需要了解的最后一個細節(jié)是它的時間和空間復雜是比較高的,因此不是解決大型數(shù)據(jù)集聚類問題的合適解決方案。
三、總結(jié)
到此這篇關(guān)于Python中層次聚類的文章就介紹到這了,更多相關(guān)Python層次聚類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于httpx模塊實現(xiàn)發(fā)送請求
這篇文章主要介紹了Python基于httpx模塊實現(xiàn)發(fā)送請求,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
Python判斷一個數(shù)是否為質(zhì)數(shù)的3種方法(超詳細)
一個大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)(質(zhì)數(shù))整除(2, 3, 5, 7等),換句話說就是該數(shù)除了1和它本身以外不再有其他的因數(shù),下面這篇文章主要給大家介紹了關(guān)于利用Python判斷一個數(shù)是否為質(zhì)數(shù)的3種方法,需要的朋友可以參考下2024-09-09
Python優(yōu)化技巧之利用ctypes提高執(zhí)行速度
ctypes是Python的一個外部庫,提供和C語言兼容的數(shù)據(jù)類型,可以很方便地調(diào)用C DLL中的函數(shù)。今天我們就來詳細探討下ctypes庫的使用技巧2016-09-09
Python 基于win32com客戶端實現(xiàn)Excel操作的詳細過程
這篇文章主要介紹了Python 基于win32com客戶端實現(xiàn)Excel操作的詳細過程,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
python GUI庫圖形界面開發(fā)之PyQt5信號與槽基礎(chǔ)使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5信號與槽基礎(chǔ)使用方法與實例,需要的朋友可以參考下2020-03-03

