日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python中層次聚類的詳細講解_python

作者:川川菜鳥 ? 更新時間: 2023-01-07 編程語言

前言

層次聚類是流行的無監督學習算法之一。層次聚類所做的就是找到數據集中具有相似屬性的元素,并將它們組合在一個集群中。最后,我們得到一個單一的大集群,其主要元素是數據點的集群或其他集群的集群。

一、聚類流程與基本原理

系統聚類法(hierarchical clustering method),又叫分層聚類法,是目前最常用的聚類分析方法。其基本步驟如下:假設樣本中有n個樣品,那么就先將這n個樣品看作n類,也就是一個樣品一個類,然后將性質最接近的兩類合并為一個新的類,這樣就得到n-1個類,接著從中再找出最接近的兩個類,讓其進行合并,這樣就變為n-2個類,讓此過程持續進行下去,最后所有的樣品都歸為一類,把上述過程繪制成一張圖,這個圖就稱為聚類圖,從圖中再決定分為多少類。如下所示:

樣點之間的相似度是根據距離來實現的,比如最短距離法、最長距離法、重心法、類平均法以及ward法。

最短距離法 :從兩個類中找出距離最短的兩個樣品點。如下:

最長距離法 :同理如下:

類平均法: 就是取兩個類之間所有點的距離的平均值

重心法 :名如其法,如下

離差平方和法 :離差平方和法又叫Ward法,此方法查找聚合偏差。例如,如果我們有兩個集群,我們可以假裝將它們合并為一個集群,然后估計結果集群的質心。之后,我們找到新質心的所有點的平方偏差之和。對于不同的合并,我們將獲得其他變化。因此,我們選擇合并最小的距離作為我們的距離。

二、實現層次聚類

數據下載:點擊這里下載

如下:

2.1 導入相關庫

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

2.2 讀取數據

ourData = pd.read_csv('Mall_Customers.csv') 
ourData.head()

如下:

我們將使用該數據集在Annual Income (k$)和Spending Score (1-100)列上實現我們的層次聚類模型。所以我們需要從我們的數據集中提取這兩個特征:

newData = ourData.iloc[:, [3, 4]].values
newData 

如下:

可以看到數據不一致,我們必須對數據進行縮放,以使各種特征具有可比性;否則,我們最終會得到一個劣質的模型。原因是層次聚類,就像機器學習中的許多其他算法一樣,是基于距離的(歐幾里得距離)。

2.3 確定最佳集群數

在嘗試對我們的數據進行聚類之前,我們需要知道我們的數據可以最佳地聚類到多少個集群。所以讓我們首先在我們的數據集上實現一個樹狀圖來實現這個目標:

import scipy.cluster.hierarchy as sch # 導入層次聚類算法
dendrogram = sch.dendrogram(sch.linkage(newData , method = 'ward')) # 使用樹狀圖找到最佳聚類數
plt.title('Dendrogram') # 標題
plt.xlabel('Customers') # 橫標簽
plt.ylabel('Euclidean distances') # 縱標簽
plt.show() 

樹狀圖,如下所示:

看上面的樹狀圖,可以確定最佳聚類數;假設地,推斷整個樹狀圖中的所有水平線,然后找到不與這些假設線相交的最長垂直線。

越過那條最長的線,建立一個分界線。我們可以對數據進行最佳聚類的聚類數等于已建立的閾值所跨越的歐幾里德距離(垂直線)的計數。

在我們剛剛獲得的樹狀圖中,沒有延伸的水平線交叉的最長垂直線位于綠色部分。第三條線位于歐幾里得距離 (110 - 250) 之間。將我們的閾值設為 150,獲得的最佳聚類數為 5。知道我們的數據應該聚集到的最佳數量;我們現在可以訓練我們的聚類模型來實現這個目標。

2.4 層次聚類模型訓練

from sklearn.cluster import AgglomerativeClustering 
# n_clusters為集群數,affinity指定用于計算距離的度量,linkage參數中的ward為離差平方和法
Agg_hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward')
y_hc = Agg_hc.fit_predict(newData) # 訓練數據

上面的代碼訓練了我們的模型,我們現在可以繼續并可視化數據是如何聚集的:

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

如下:

關于層次聚類,我們需要了解的最后一個細節是它的時間和空間復雜是比較高的,因此不是解決大型數據集聚類問題的合適解決方案。

三、總結

原文鏈接:https://blog.csdn.net/weixin_46211269/article/details/127175675

欄目分類
最近更新