使用 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 是最佳選擇。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP