網(wǎng)站節(jié)日制作快速網(wǎng)站輕松排名
一、說明
????????K-means 的目標(biāo)是將一組觀測值劃分為 k 個聚類,每個觀測值分配給均值(聚類中心或質(zhì)心)最接近的聚類,從而充當(dāng)該聚類的代表。
????????在本文中,我們將全面介紹 k 均值聚類(最常用的聚類方法之一)及其組成部分的所有內(nèi)容。我們將了解聚類,為什么它很重要,以及它的應(yīng)用。
二、什么是 K-means 聚類?
????????K-Means 聚類是一種流行的無監(jiān)督機(jī)器學(xué)習(xí)算法,用于將數(shù)據(jù)集劃分為一組不同的、不重疊的組或聚類。目標(biāo)是以這樣一種方式對數(shù)據(jù)點(diǎn)進(jìn)行分組,即同一聚類中的點(diǎn)彼此之間比與其他聚類中的點(diǎn)更相似。該技術(shù)廣泛應(yīng)用于數(shù)據(jù)挖掘、市場細(xì)分、圖像壓縮以及其他需要模式識別的領(lǐng)域。
2.1 K-means 中使用的數(shù)學(xué)概念
????????在我們開始計算 k 均值之前,我們將討論 K 均值中使用的數(shù)學(xué)概念。
- 質(zhì)心:這些是聚類的中心點(diǎn),在每次迭代中都會重新計算,以作為分配給聚類的點(diǎn)的平均值。
- 歐幾里得距離:這是 K-Means 中最常用的距離度量。它計算歐幾里得空間中兩點(diǎn)之間的直線距離。
對于 n 維的 X(x1,x2,...,xn) 和 Y(y1,y2,...,yn) 2 個點(diǎn),使用此公式測量歐幾里得距離。
- 慣性:它衡量集群的分布程度。它是每個數(shù)據(jù)點(diǎn)與其分配的質(zhì)心之間的平方距離之和。目標(biāo)是將慣性降至最低。
WCSS = d12 + d22+ d32 + ...........+ dn2
2.2 K-means是如何工作的?
# Generating Data
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# Parameters
n_samples = 300
n_features = 2
centers = 4# Generate data
X, y = make_blobs(n_samples=n_samples, n_features=n_features, centers=centers, cluster_std=3, random_state=42)# Visualize the data
plt.scatter(X[:, 0], X[:, 1], s=50, cmap='viridis')
plt.title("Initial Data")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
from sklearn.cluster import KMeanskmeans = KMeans(n_init = 10, n_clusters = 4, verbose=100)
kmeans.fit(X)y_kmeans = kmeans.predict(X)plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 60, c = 'red', label = 'Cluster1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 60, c = 'blue', label = 'Cluster2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 60, c = 'green', label = 'Cluster3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 60, c = 'yellow', label = 'Cluster4')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 100, c = 'black', label = 'Centroids')plt.legend()plt.show()
- 初始化:
- 選擇簇數(shù) K。
- 隨機(jī)初始化 K 個質(zhì)心,它們是數(shù)據(jù)集中表示每個聚類中心的點(diǎn)。
2. 分配步驟:
- 根據(jù)歐幾里得距離將每個數(shù)據(jù)點(diǎn)分配給最近的質(zhì)心。這將創(chuàng)建 K 個聚類。
我們計算一個點(diǎn)到每個質(zhì)心的歐幾里得距離,并將其放入距離最小的聚類中。
3. 更新步驟:
- 通過取分配給每個聚類的所有數(shù)據(jù)點(diǎn)的平均值來計算新的質(zhì)心。
我們計算聚類中所有點(diǎn)的平均值,以獲得新的質(zhì)心。
4.重復(fù):
- 使用新的質(zhì)心重復(fù)分配和更新步驟,直到質(zhì)心不再更改或更改低于預(yù)定義的閾值。
生成上述圖像的代碼在此處。
三、如何確定質(zhì)心的數(shù)量?
3.1 彎頭法
肘部方法是一種用于確定 K-Means 聚類中最佳聚類數(shù)的技術(shù)。這個想法是對 K 的值范圍運(yùn)行 K-Means,并計算從每個點(diǎn)到其分配的質(zhì)心的距離平方和(稱為慣性或簇內(nèi)平方和)。隨著 K 的增加,慣性減小,因?yàn)辄c(diǎn)更接近它們的質(zhì)心。
目標(biāo)是找到“肘點(diǎn)”,其中下降速度急劇減慢,表明隨著 K 的增加,回報遞減,即在肘點(diǎn)之后增加 K 的值沒有多大好處。
WCSS = d12 + d22 + d32 + ...........+ dn2
我們通常計算前 10 個聚類的慣性。對于 K = 數(shù)據(jù)點(diǎn)數(shù),慣性將為零。
from sklearn.cluster import KMeanswcss = []
for i in range(1, 11):kmeans = KMeans(n_init = 10, n_clusters = i)kmeans.fit(X)wcss.append(kmeans.inertia_)plt.title("Elbow Method")
plt.xlabel("Number of Clusters(k)")
plt.ylabel("WCSS")
plt.plot(range(1,11),wcss)
因此,集群的數(shù)量可以是 3 個或 4 個。
肘部方法有一些限制,例如:
- 肘點(diǎn)的選擇是主觀的。
- 它不適用于所有數(shù)據(jù)集,例如當(dāng)聚類具有不規(guī)則形狀或大量特征時。
3.2 剪影分?jǐn)?shù)
Silhouette 分?jǐn)?shù)是一個指標(biāo),用于量化集群的質(zhì)量。它適用于任何聚類算法。
剪影分?jǐn)?shù)的值從 -1 到 +1 不等。
- +1 : 良好(集群分離良好)
- 0 : 集群彼此靠近
- -1 : 錯誤(錯誤的聚類)
內(nèi)聚力:?同一聚類中元素彼此接近的程度。(它衡量集群的緊湊性。
分離:?它指的是不同的集群彼此之間有多么不同或分辨得多么好。
S(i)?是剪影分?jǐn)?shù)。
a(i)?是所取點(diǎn)與其自身聚類中所有點(diǎn)的平均距離。它代表著凝聚力。
b(i)?是所取點(diǎn)與剩余最近聚類的所有點(diǎn)之間的平均聚類距離。它代表分離。
from sklearn.metrics import silhouette_score
sil = []
for i in range(2, 11):kmeans = KMeans(n_clusters=i)cluster_labels = kmeans.fit_predict(X)silhouette_avg = silhouette_score(X, cluster_labels)sil.append(silhouette_avg)plt.xlabel("Number of Clusters(k)")
plt.ylabel("Silhouette Score")
plt.plot(range(2,11),sil)
根據(jù)輪廓分?jǐn)?shù),我們應(yīng)該假設(shè) k=3,因?yàn)閷τ?3 個聚類,分?jǐn)?shù)是最大的。
四、如何初始化質(zhì)心?
4.1 K-均值++
K-Means++ 是 K-Means 聚類算法的高級版本,它改進(jìn)了質(zhì)心的初始選擇,旨在提高聚類結(jié)果和收斂速度。標(biāo)準(zhǔn)的 K-Means 算法對質(zhì)心的初始放置很敏感,初始化不良會導(dǎo)致聚類次優(yōu)和收斂速度變慢。K-Means++ 通過使用更智能的初始化策略來解決這個問題。
4.2 K-Means++ 初始化的步驟
1. 選擇第一個質(zhì)心:
? 從數(shù)據(jù)集中隨機(jī)選擇第一個質(zhì)心。
2. 選擇后續(xù)質(zhì)心:
? 對于每個后續(xù)質(zhì)心,計算從每個
數(shù)據(jù)點(diǎn) x 到最近的已選質(zhì)心的距離 D(x)。
? 從數(shù)據(jù)點(diǎn)中選擇下一個質(zhì)心,其概率與 D(x)2 成正比。概率最大的點(diǎn)作為質(zhì)心。(我們采用概率而不是距離本身來減少異常值的影響。
3. 重復(fù):
? 重復(fù)該過程,直到選擇 K 個質(zhì)心。
4. 繼續(xù)使用標(biāo)準(zhǔn) K-Means:
? 使用這些 K 質(zhì)心作為初始起點(diǎn),并運(yùn)行標(biāo)準(zhǔn) K-Means 算法
五、K-means的假設(shè)和局限性
- 假設(shè)簇是球形和各向同性(不是不規(guī)則形狀)。
- 假定聚類具有相似的大小。
- 假設(shè)所有聚類都具有相似的方差。
- 集群的數(shù)量是預(yù)定義的。
- 當(dāng)聚類分離良好時,此算法效果最佳。
- K 均值不能在存在異常值的情況下應(yīng)用(因?yàn)橘|(zhì)心會移動太多并且無法正確分配)
六、結(jié)論
K-Means 簡單性和效率使其成為各種應(yīng)用的熱門選擇,包括圖像分割、市場分割和模式識別。盡管它很簡單,但它為各個領(lǐng)域的許多應(yīng)用程序提供了堅(jiān)實(shí)的基礎(chǔ)。但是,它對質(zhì)心的初始放置很敏感,這可能導(dǎo)致次優(yōu)聚類。盡管存在一些局限性,例如對 K 選擇的敏感性以及卡在局部最小值中的可能性,但 K-Means 仍然是數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中一種基本且高效的聚類技術(shù)。
K-Means 有其局限性,其他聚類算法(如 DBSCAN 和 GMM)可以克服這些局限性。