亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中層次聚類的詳細(xì)講解

 更新時(shí)間:2022年12月09日 08:49:04   作者:川川菜鳥  
層次聚類( Hierarchical Clustering )是聚類算法的一種,通過計(jì)算不同類別的相似度類創(chuàng)建一個(gè)有層次的嵌套的樹,下面這篇文章主要給大家介紹了關(guān)于Python中層次聚類的詳細(xì)講解,需要的朋友可以參考下

前言

層次聚類是流行的無監(jiān)督學(xué)習(xí)算法之一。層次聚類所做的就是找到數(shù)據(jù)集中具有相似屬性的元素,并將它們組合在一個(gè)集群中。最后,我們得到一個(gè)單一的大集群,其主要元素是數(shù)據(jù)點(diǎn)的集群或其他集群的集群。

一、聚類流程與基本原理

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

樣點(diǎn)之間的相似度是根據(jù)距離來實(shí)現(xiàn)的,比如最短距離法、最長距離法、重心法、類平均法以及ward法。

最短距離法 :從兩個(gè)類中找出距離最短的兩個(gè)樣品點(diǎn)。如下:

最長距離法 :同理如下:

類平均法: 就是取兩個(gè)類之間所有點(diǎn)的距離的平均值

重心法 :名如其法,如下

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

二、實(shí)現(xiàn)層次聚類

數(shù)據(jù)下載:點(diǎn)擊這里下載

如下:

2.1 導(dǎo)入相關(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)列上實(shí)現(xiàn)我們的層次聚類模型。所以我們需要從我們的數(shù)據(jù)集中提取這兩個(gè)特征:

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

如下:

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

2.3 確定最佳集群數(shù)

在嘗試對(duì)我們的數(shù)據(jù)進(jìn)行聚類之前,我們需要知道我們的數(shù)據(jù)可以最佳地聚類到多少個(gè)集群。所以讓我們首先在我們的數(shù)據(jù)集上實(shí)現(xiàn)一個(gè)樹狀圖來實(shí)現(xiàn)這個(gè)目標(biāo):

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

樹狀圖,如下所示:

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

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

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

2.4 層次聚類模型訓(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)于層次聚類,我們需要了解的最后一個(gè)細(xì)節(jié)是它的時(shí)間和空間復(fù)雜是比較高的,因此不是解決大型數(shù)據(jù)集聚類問題的合適解決方案。

三、總結(jié)

到此這篇關(guān)于Python中層次聚類的文章就介紹到這了,更多相關(guān)Python層次聚類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論