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

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

最長(zhǎng)距離法 :同理如下:


類(lèi)平均法: 就是取兩個(gè)類(lèi)之間所有點(diǎn)的距離的平均值
重心法 :名如其法,如下

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

2.1 導(dǎo)入相關(guān)庫(kù)
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)列上實(shí)現(xiàn)我們的層次聚類(lèi)模型。所以我們需要從我們的數(shù)據(jù)集中提取這兩個(gè)特征:
newData = ourData.iloc[:, [3, 4]].values newData
如下:

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

看上面的樹(shù)狀圖,可以確定最佳聚類(lèi)數(shù);假設(shè)地,推斷整個(gè)樹(shù)狀圖中的所有水平線,然后找到不與這些假設(shè)線相交的最長(zhǎng)垂直線。
越過(guò)那條最長(zhǎng)的線,建立一個(gè)分界線。我們可以對(duì)數(shù)據(jù)進(jìn)行最佳聚類(lèi)的聚類(lèi)數(shù)等于已建立的閾值所跨越的歐幾里德距離(垂直線)的計(jì)數(shù)。
在我們剛剛獲得的樹(shù)狀圖中,沒(méi)有延伸的水平線交叉的最長(zhǎng)垂直線位于綠色部分。第三條線位于歐幾里得距離 (110 - 250) 之間。將我們的閾值設(shè)為 150,獲得的最佳聚類(lèi)數(shù)為 5。知道我們的數(shù)據(jù)應(yīng)該聚集到的最佳數(shù)量;我們現(xiàn)在可以訓(xùn)練我們的聚類(lèi)模型來(lái)實(shí)現(xiàn)這個(gè)目標(biāo)。
2.4 層次聚類(lèi)模型訓(xùn)練
from sklearn.cluster import AgglomerativeClustering # n_clusters為集群數(shù),affinity指定用于計(jì)算距離的度量,linkage參數(shù)中的ward為離差平方和法 Agg_hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward') y_hc = Agg_hc.fit_predict(newData) # 訓(xùn)練數(shù)據(jù)
上面的代碼訓(xùn)練了我們的模型,我們現(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)于層次聚類(lèi),我們需要了解的最后一個(gè)細(xì)節(jié)是它的時(shí)間和空間復(fù)雜是比較高的,因此不是解決大型數(shù)據(jù)集聚類(lèi)問(wèn)題的合適解決方案。
三、總結(jié)
到此這篇關(guān)于Python中層次聚類(lèi)的文章就介紹到這了,更多相關(guān)Python層次聚類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于httpx模塊實(shí)現(xiàn)發(fā)送請(qǐng)求
這篇文章主要介紹了Python基于httpx模塊實(shí)現(xiàn)發(fā)送請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Python判斷一個(gè)數(shù)是否為質(zhì)數(shù)的3種方法(超詳細(xì))
一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)(質(zhì)數(shù))整除(2, 3, 5, 7等),換句話說(shuō)就是該數(shù)除了1和它本身以外不再有其他的因數(shù),下面這篇文章主要給大家介紹了關(guān)于利用Python判斷一個(gè)數(shù)是否為質(zhì)數(shù)的3種方法,需要的朋友可以參考下2024-09-09
封裝一個(gè)python的pymysql操作類(lèi)
這篇文章主要介紹了封裝一個(gè)python的pymysql操作類(lèi)的相關(guān)資料,需要的朋友可以參考下2022-12-12
Python優(yōu)化技巧之利用ctypes提高執(zhí)行速度
ctypes是Python的一個(gè)外部庫(kù),提供和C語(yǔ)言兼容的數(shù)據(jù)類(lèi)型,可以很方便地調(diào)用C DLL中的函數(shù)。今天我們就來(lái)詳細(xì)探討下ctypes庫(kù)的使用技巧2016-09-09
詳解Python開(kāi)發(fā)中如何使用Hook技巧
這篇文章主要介紹了詳解Python開(kāi)發(fā)中如何使用Hook技巧,詳細(xì)的介紹了Python Hook的用法和示例,有興趣的可以了解一下2017-11-11
Python中join()函數(shù)多種操作代碼實(shí)例
這篇文章主要介紹了Python中join()函數(shù)多種操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Python 基于win32com客戶端實(shí)現(xiàn)Excel操作的詳細(xì)過(guò)程
這篇文章主要介紹了Python 基于win32com客戶端實(shí)現(xiàn)Excel操作的詳細(xì)過(guò)程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Python容器類(lèi)型轉(zhuǎn)換的3種方法實(shí)例
使用Python我們可以輕松地將數(shù)據(jù)轉(zhuǎn)換成不同的類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于Python容器類(lèi)型轉(zhuǎn)換的3種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03

