搜尋
首頁後端開發Python教學一文讀懂層次聚類(Python程式碼)

一文讀懂層次聚類(Python程式碼)

Apr 11, 2023 pm 09:13 PM
python程式碼層次聚類

一文讀懂層次聚類(Python程式碼)

首先要說,聚類屬於機器學習的無監督學習,而且也分很多種方法,例如大家熟知的有K-means。層次聚類也是聚類中的一種,也很常用。以下我先簡單回顧K-means的基本原理,然後慢慢引出層次聚類的定義和分層步驟,這樣更有助於大家理解。

層次聚類和K-means有什麼不同?

K-means 工作原理可以簡單概述為:

  • 決定簇數(k)
  • 從資料中隨機選取k 個點作為質心
  • 將所有點分配到最近的聚類質心
  • 計算新形成的簇的質心
  • 重複步驟3 和4

這是一個迭代過程,直到新形成的簇的質心不變,或達到最大迭代次數。

但是K-means 是存在一些缺點的,我們必須在演算法開始前就決定簇數K 的數量,但實際上我們並不知道應該有多少個簇,所以一般都是根據自己的理解先設定一個值,這可能導致我們的理解和實際情況存在一些偏差。

層次聚類完全不同,它不需要我們開始的時候指定簇數,而是先完整的形成整個層次聚類後,透過決定合適的距離,自動就可以找到對應的簇數和聚類。

什麼是層次聚類?

下面我們由淺及深的介紹什麼是層次聚類,先來一個簡單的例子。

假設我們有以下幾點,我們想要將它們分組:

一文讀懂層次聚類(Python程式碼)

我們可以將這些點中的每一個分配給一個單獨的簇,就是4個簇(4種顏色):

一文讀懂層次聚類(Python程式碼)

然後基於這些簇的相似性(距離),將最相似的(距離最近的)點組合在一起並重複這個過程,直到只剩下一個群集:

一文讀懂層次聚類(Python程式碼)

上面本質上就是在建構一個層次結構。先了解到這裡,後面我們詳細介紹它的分層步驟。

層次聚類的類型

主要有兩種類型的層次聚類:

  • 凝聚層次聚類
  • 分裂層次聚類

凝聚層次聚類

先讓所有點分別成為一個單獨的簇,然後透過相似性不斷組合,直到最後只有一個簇為止,這就是凝聚層次聚類的過程,和我們上面剛剛說的一致。

分裂層次聚類

分裂層次聚類正好反過來,它是從單一集群開始逐步分裂,直到無法分裂,即每個點都是一個簇。

所以無論是10、100、1000 個資料點都不重要,這些點在開始的時候都屬於同一個叢集:

一文讀懂層次聚類(Python程式碼)

現在,在每次迭代中拆分簇中相隔最遠的兩點,並重複這個過程,直到每個簇只包含一個點:

一文讀懂層次聚類(Python程式碼)

上面的過程就是分裂層次聚類。

執行層次聚類的步驟

上面已經說了層次聚類的大概過程,那關鍵的來了,如何確定點和點的相似性呢?

這是聚類中最重要的問題之一了,一般計算相似度的方法是:計算這些簇的質心之間的距離。距離最小的點稱為相似點,我們可以合併它們,也可以稱為基於距離的演算法。

另外在層次聚類中,還有一個稱為鄰近矩陣的概念,它儲存了每個點之間的距離。以下我們透過一個例子來理解如何計算相似度、鄰近矩陣、以及層次聚類的具體步驟。

案例介紹

假設一位老師想要將學生分成不同的組別。現在有每個學生在作業中的分數,想根據這些分數將他們分成幾組。關於擁有多少組,這裡沒有固定的目標。由於老師不知道應該將哪種類型的學生分配到哪個組,因此不能作為監督學習問題來解決。下面,我們將嘗試應用層次聚類將學生分成不同的群組。

下面是5名學生的成績:

一文讀懂層次聚類(Python程式碼)

建立鄰近矩陣

首先,我們要建立一個鄰近矩陣,它儲存了每個點兩兩之間的距離,因此可以得到一個形狀為n X n 的方陣。

這個案例中,可以得到以下5 x 5 的鄰近矩陣:

一文讀懂層次聚類(Python程式碼)

#矩陣裡有兩點要注意下:

  • 矩陣的對角元素總是0,因為點與其自身的距離總是0
  • 使用歐幾裡得距離公式來計算非對角元素的距離

例如,我們要計算點1 和2 之間的距離,計算公式為:

一文讀懂層次聚類(Python程式碼)

#同理,依此計算方法完成後填入鄰近矩陣其餘元素。

執行層次聚類

這裡使用凝聚層次聚類來實作。

步驟1:首先,我們將所有點分配成單一簇:

一文讀懂層次聚類(Python程式碼)

#這裡不同的顏色代表不同的簇,我們資料中的5 個點,即有5 個不同的簇。

步驟2:接下來,我們需要找出鄰近矩陣中的最小距離並合併距離最小的點。然後我們更新鄰近矩陣:

一文讀懂層次聚類(Python程式碼)

最小距離是3,因此我們將合併點1 和2:

一文讀懂層次聚類(Python程式碼)

讓我們看看更新的群集並相應地更新鄰近矩陣:

一文讀懂層次聚類(Python程式碼)

更新之後,我們取了1、2 兩個點中位數(7, 10) 最大的來替換這個簇的值。當然除了最大值之外,我們還可以取最小值或平均值。然後,我們將再次計算這些簇的鄰近矩陣:

一文讀懂層次聚類(Python程式碼)

第 3 步:重複第 2 步,直到只剩下一個簇。

重複所有的步驟後,我們將得到如下所示的合併的聚類:

一文讀懂層次聚類(Python程式碼)

#這就是凝聚層次聚類的工作原理。但問題是我們仍然不知道該分幾組?是2、3、還是4組呢?

下面開始介紹如何選擇聚類數。

如何選擇聚類數?

為了得到層次聚類的群集數,我們使用了一個概念,叫作樹狀圖。

透過樹狀圖,我們可以更方便的選出聚類的簇數。

回到上面的例子。當我們合併兩個簇時,樹狀圖會相應地記錄這些簇之間的距離並以圖形形式表示。下面這個是樹狀圖的原始狀態,橫座標記錄了每個點的標記,縱軸記錄了點和點之間的距離:

一文讀懂層次聚類(Python程式碼)

##當合併兩個簇時,會在樹狀圖中連接起來,連接的高度就是點之間的距離。下面是我們剛剛層次聚類的過程。

一文讀懂層次聚類(Python程式碼)

然後開始對上面的過程進行樹狀圖的繪製。從合併樣本 1 和 2 開始,這兩個樣本之間的距離為 3。

一文讀懂層次聚類(Python程式碼)

可以看到已經合併了 1 和 2。垂直線代表 1 和 2 的距離。同理,按照層次聚類過程繪製合併簇類別的所有步驟,最後得到了這樣的樹狀圖:

一文讀懂層次聚類(Python程式碼)

透過樹狀圖,我們可以清楚地形象化層次聚類的步驟。樹狀圖中垂直線的距離越遠代表簇之間的距離越大。

有了這個樹狀圖,我們決定簇類別數就方便多了。

現在我們可以設定一個閾值距離,繪製一條水平線。例如我們將閾值設為12,並繪製一條水平線,如下:

一文讀懂層次聚類(Python程式碼)

#從交點中可以看到,聚類的數量就是與閾值水平線與垂直線相交的數量(紅線與2 條垂直線相交,我們將有2 個簇)。與橫座標相對應的,一個簇將有一個樣本集合為 (1,2,4),另一個群集將有一個樣本集合 (3,5)。

這樣,我們就透過樹狀圖解決了分層聚類中要決定聚類的數量。

Python程式碼實戰案例

上面是理論基礎,有點數學基礎看得懂。以下介紹下在如何用程式碼Python來實現這個過程。這裡拿一個客戶細分的數據來展示一下。

資料集和程式碼在我的GitHub倉庫裡:

https://github.com/xiaoyusmd/PythonDataScience

#如果覺得有幫助,還請給個star!

這個資料是來自UCI 機器學習函式庫。我們的目的是根據批發分銷商的客戶在不同產品類別(如牛奶、雜貨、地區等)上的年度支出,將他們細分。

首先對資料進行一個標準化,為了讓所有資料在同一個維度便於計算,然後應用層次聚類來細分客戶。

from sklearn.preprocessing import normalize
data_scaled = normalize(data)
data_scaled = pd.DataFrame(data_scaled, columns=data.columns)
import scipy.cluster.hierarchy as shc
plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))

一文讀懂層次聚類(Python程式碼)

x 軸包含了所有樣本,y 軸代表這些樣本之間的距離。距離最大的垂直線是藍線,假如我們決定要以閾值6 切割樹狀圖:

plt.figure(figsize=(10, 7))
plt.title("Dendrograms")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
plt.axhline(y=6, color='r', linestyle='--')

一文讀懂層次聚類(Python程式碼)

現在我們有兩個簇了,我們要對這2個簇應用層次聚類:

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(data_scaled)

一文讀懂層次聚類(Python程式碼)

由於我們定義了2 個簇,因此我們可以在輸出中看到0 和1 的值。 0 代表屬於第一個簇的點,1 代表屬於第二個簇的點。 

plt.figure(figsize=(10, 7))
plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)

一文讀懂層次聚類(Python程式碼)

到這裡我們就成功的完成了聚類。

以上是一文讀懂層次聚類(Python程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:51CTO.COM。如有侵權,請聯絡admin@php.cn刪除
Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分詞在景區評論分析中的準確性?如何提高jieba分詞在景區評論分析中的準確性?Apr 02, 2025 am 07:09 AM

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器