使用 SciPy 的聚類方法


聚類是機器學習和資料科學中的一種技術,它涉及將相似的資料點或物件分組到聚類或子集中。聚類的目標是在資料中找到可能不明顯的模式和結構,並將相關資料點分組在一起,以便進行進一步分析。在本文中,我們將瞭解如何藉助 SciPy 庫來實現聚類。

SciPy 為我們提供了各種科學計算工具來執行數值積分、最佳化、線性代數、訊號處理等任務。它被研究人員、科學家、工程師和資料分析師用來在他們的工作中執行復雜的計算和分析。它建立在 NumPy 之上,幷包含一個用於聚類的子模組。

一些可以使用 SciPy 實現的聚類演算法包括:

  • K-Means − 這裡目標是將資料集劃分為 k 個聚類,其中 k 是一個固定數字,每個資料點都屬於其均值(或質心)最接近的聚類。

  • 層次聚類 − 這裡我們建立一個聚類的層次結構,可以表示為樹狀圖。它們進一步分為兩種型別:凝聚聚類和分裂聚類。

每種方法都有其自身的優點和缺點,選擇哪種方法取決於資料的特性和聚類的目標。scikit-learn 庫也提供了聚類演算法,具有更高階的功能,如高斯混合模型、貝葉斯高斯混合模型等。

使用 SciPy 的 K-Means 聚類

K-Means 演算法的工作原理是首先將 k 個質心隨機分配到資料集,然後迭代地將資料點重新分配到最近的質心,並根據新的聚類更新質心。重複此過程,直到聚類收斂或達到最大迭代次數。SciPy 庫在 scipy.cluster.vq 模組中提供了 k-means 演算法的實現。

使用的 dataset (kmeans_dataset.csv) 可以在此處獲得。

示例

import pandas as pd
df = pd.read_csv("kmeans_dataset.csv")
X = df.values
from scipy.cluster.vq import kmeans,vq

# number of clusters
k = 4

# compute k-means clustering
centroids,_ = kmeans(X,k)

# a cluster for each data point
clusters,_ = vq(X,centroids)

# Plotting the data points in the clusters
import matplotlib.pyplot as plt
colors = ['r','g','b','y']
for i in range(k):
   # select only data observations with cluster label == i
   ds = X[np.where(clusters==i)]
   # plot the data observations
   plt.scatter(ds[:,0],ds[:,1],c=colors[i])
   # plot the centroids
   plt.scatter(centroids[i,0],centroids[i,1],marker='x',s=200, c='black')
plt.show()

輸出

上述程式碼將資料點分組為 4 個聚類,並根據其聚類分配用不同的顏色繪製資料點。聚類質心用“x”標記表示。

可以調整聚類數量以適應您的資料和問題。

在本例中,我使用了上面給出的連結中的資料集,然後使用 k-means 演算法進行聚類並可視化結果。

請記住,k-means 演算法對初始條件敏感,因此如果使用不同的初始質心多次執行它,結果可能會有所不同。

使用 SciPy 的層次聚類

層次聚類是一種聚類方法,它建立聚類的層次結構,其中每個聚類都是前一個聚類的子集。層次結構表示為樹狀結構,稱為樹狀圖。這是一種強大的方法,用於探索和視覺化大型資料集的結構。儘管如此,對於大型資料集來說,它在計算上可能代價高昂,並且對所使用的連結方法敏感。

示例

from scipy.cluster.hierarchy import linkage, dendrogram, cut_tree

# sample data points
data = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]

# create linkage matrix
Z = linkage(data, method='ward')

# create dendrogram
dendrogram(Z)

# cut the dendrogram at a threshold to obtain clusters
clusters = cut_tree(Z, height=2)

import matplotlib.pyplot as plt
plt.figure()
dendrogram(Z, labels = ["data1","data2","data3","data4","data5","data6"])
plt.show()

輸出

上述程式碼將使用連結方法“ward”將資料點分組到聚類中,該方法最大程度地減少了被連結的聚類之間距離的方差。dendrogram 函式用於繪製樹狀圖,它是層次聚類解決方案的視覺化。cut_tree 函式用於在給定閾值處從樹狀圖中提取聚類。cut_tree 函式的輸出是每個資料點的聚類標籤列表。也可以使用 matplotlib 庫視覺化樹狀圖並自定義外觀,例如線條、標籤等的顏色和大小。

結論

SciPy 並非適用於所有型別的聚類,但它可以高效地執行 k-means 和層次聚類。SciPy 的 k-means 演算法是一種簡單有效的方法,用於將資料集劃分為固定數量的聚類。層次聚類是一種建立聚類層次結構的方法,其中每個聚類都是前一個聚類的子集。像 DBSCAN 這樣廣泛使用的演算法無法使用 SciPy 實現。

因此,如果您正在尋找各種聚類演算法,並內建支援預處理、評估和更多靈活性,那麼 scikit-learn 是最佳選擇。

更新於: 2023年10月4日

142 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.