網站首頁 編程語言 正文
前言
層次聚類是流行的無監督學習算法之一。層次聚類所做的就是找到數據集中具有相似屬性的元素,并將它們組合在一個集群中。最后,我們得到一個單一的大集群,其主要元素是數據點的集群或其他集群的集群。
一、聚類流程與基本原理
系統聚類法(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
相關推薦
- 2022-05-13 C++ 使用ffmpeg實現rtsp取流
- 2023-06-18 C#中獲取文件大小問題_C#教程
- 2022-10-16 python?os模塊使用方法介紹_python
- 2022-09-21 Android開發Activity的生命周期詳解_Android
- 2022-04-12 Http 請求常見狀態碼報錯(200/404/500)
- 2023-01-11 C++入門教程之引用與指針_C 語言
- 2022-11-18 Oracle移動數據文件不停機和停機兩種方式詳解_oracle
- 2022-06-01 C語言?深入淺出講解指針的使用_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支