總之,K-均值聚類是一種把數(shù)據(jù)分組的方法,它通過找到每組數(shù)據(jù)的中心點(diǎn),并不斷調(diào)整這些中心點(diǎn)的位置,來達(dá)到分組的目的。

理論基礎(chǔ)

數(shù)學(xué)原理與公式推理

1. 目標(biāo)函數(shù)

K-均值聚類的目標(biāo)是最小化每個(gè)簇內(nèi)樣本到簇中心的距離之和。用數(shù)學(xué)符號表示,即最小化以下目標(biāo)函數(shù):

其中:

2. 質(zhì)心的計(jì)算

質(zhì)心是簇內(nèi)所有點(diǎn)的平均值。第??個(gè)簇的質(zhì)心??的計(jì)算公式為:

其中  是簇  中的樣本點(diǎn)數(shù)量。

算法流程

  1. 初始化
  1. 分配樣本到最近的質(zhì)心

將??分配到最近的質(zhì)心所對應(yīng)的簇?:

  1. 更新質(zhì)心
  1. 檢查收斂條件

詳細(xì)推導(dǎo)

  1. 目標(biāo)函數(shù)的推導(dǎo)
  1. 質(zhì)心計(jì)算的推導(dǎo)
  1. 迭代更新

收斂性與復(fù)雜度分析

綜上,K-均值聚類通過迭代優(yōu)化,逐步最小化樣本點(diǎn)到質(zhì)心的距離平方和,達(dá)到將數(shù)據(jù)分成多個(gè)相似簇的目的。

完整案例

我們來進(jìn)行一個(gè)完整的K-均值聚類實(shí)際案例示例。

還是使用經(jīng)典的鳶尾花數(shù)據(jù)集(Iris Dataset),這個(gè)數(shù)據(jù)集包含150個(gè)樣本,每個(gè)樣本有4個(gè)特征:花萼長度、花萼寬度、花瓣長度和花瓣寬度。此外,每個(gè)樣本還標(biāo)注了其所屬的花的品種(鳶尾花的三種品種:Iris-setosa、Iris-versicolor和Iris-virginica)。

完整代碼,大家可以根據(jù)注釋進(jìn)行理解,后面可以使用自己的數(shù)據(jù)集進(jìn)行實(shí)現(xiàn),加強(qiáng)理解。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

# 加載數(shù)據(jù)集
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names

# 將數(shù)據(jù)集轉(zhuǎn)換為DataFrame,便于處理
df = pd.DataFrame(X, columns=feature_names)
df['target'] = y

# 數(shù)據(jù)可視化
sns.pairplot(df, hue='target', markers=["o", "s", "D"])
plt.suptitle('Iris Data Pair Plot', y=1.02)
plt.show()
# 使用PCA進(jìn)行降維到2D,以便于可視化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
df_pca = pd.DataFrame(X_pca, columns=['PCA1', 'PCA2'])
df_pca['target'] = y

# 可視化降維后的數(shù)據(jù)
plt.figure(figsize=(10, 6))
sns.scatterplot(x='PCA1', y='PCA2', hue='target', data=df_pca, palette='deep', markers=["o", "s", "D"])
plt.title('PCA of Iris Dataset')
plt.show()
# 確定最優(yōu)的簇?cái)?shù)
inertia = []
silhouette_scores = []
K_range = range(2, 11)

for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
inertia.append(kmeans.inertia_)
score = silhouette_score(X, kmeans.labels_)
silhouette_scores.append(score)

# 繪制肘部法圖和輪廓系數(shù)圖
fig, ax1 = plt.subplots(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(K_range, inertia, 'bo-')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Inertia')
plt.title('Elbow Method For Optimal k')

plt.subplot(1, 2, 2)
plt.plot(K_range, silhouette_scores, 'bo-')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Scores For Optimal k')

plt.show()
# 選擇最優(yōu)簇?cái)?shù)并進(jìn)行K-均值聚類
optimal_k = 3 # 根據(jù)肘部法和輪廓系數(shù)選擇
kmeans = KMeans(n_clusters=optimal_k, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_

# 將聚類結(jié)果加入到DataFrame
df_pca['cluster'] = labels

# 可視化聚類結(jié)果
plt.figure(figsize=(10, 6))
sns.scatterplot(x='PCA1', y='PCA2', hue='cluster', data=df_pca, palette='deep', markers=["o", "s", "D"])
plt.title('K-means Clustering of Iris Dataset')
plt.show()

# 打印聚類中心
centroids = kmeans.cluster_centers_
centroids_df = pd.DataFrame(centroids, columns=feature_names)
print("Cluster Centers (Centroids):\n", centroids_df)

# 打印輪廓系數(shù)
final_silhouette_score = silhouette_score(X, labels)
print(f"Final Silhouette Score: {final_silhouette_score}")

其中需要注意的幾個(gè)步驟:

  1. 數(shù)據(jù)加載與初步處理
  1. 降維與可視化
  1. 確定最優(yōu)的簇?cái)?shù)
  1. K-均值聚類
  1. 聚類中心與輪廓系數(shù)

算法優(yōu)化

算法優(yōu)化方面,可以考慮三方面:

1. 初始質(zhì)心選擇優(yōu)化:使用k-means++算法來優(yōu)化初始質(zhì)心的選擇,從而提高聚類的穩(wěn)定性和準(zhǔn)確性。

kmeans = KMeans(n_clusters=optimal_k, init='k-means++', random_state=42)

2. 數(shù)據(jù)標(biāo)準(zhǔn)化:在聚類之前,對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,使得每個(gè)特征的均值為0,方差為1。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

3. 重復(fù)實(shí)驗(yàn):運(yùn)行多次K-均值聚類,并選擇最小的目標(biāo)函數(shù)值對應(yīng)的聚類結(jié)果。

kmeans = KMeans(n_clusters=optimal_k, init='k-means++', n_init=10, random_state=42)

通過整個(gè)的代碼和優(yōu)化策略,大家可以感受整個(gè)過程。代碼中,實(shí)現(xiàn)了鳶尾花數(shù)據(jù)集的聚類分析,并且通過可視化、評估指標(biāo)等手段對聚類效果進(jìn)行了詳細(xì)的評估和優(yōu)化。

模型分析

K-均值聚類模型的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  1. 簡單易實(shí)現(xiàn):K-均值聚類算法簡單直觀,易于理解和實(shí)現(xiàn)。
  2. 計(jì)算速度快:適用于大規(guī)模數(shù)據(jù)集,計(jì)算復(fù)雜度較低。
  3. 適用范圍廣:對于球狀分布的數(shù)據(jù)效果較好,特別是在數(shù)據(jù)量不是很大、簇的形狀規(guī)則且差異明顯時(shí)表現(xiàn)良好。

缺點(diǎn)

  1. 需要預(yù)先指定簇的數(shù)量K:對于不知道簇?cái)?shù)量的數(shù)據(jù),難以確定合適的K值。
  2. 對初始質(zhì)心的選擇敏感:初始質(zhì)心的選擇會影響最終的聚類結(jié)果,可能導(dǎo)致局部最優(yōu)解。
  3. 對異常值敏感:異常值或噪聲會對質(zhì)心的計(jì)算和最終的聚類結(jié)果產(chǎn)生較大影響。

與相似算法的對比

K-均值聚類 vs 層次聚類(Hierarchical Clustering)

K-均值聚類 vs 密度聚類(Density-Based Clustering,如DBSCAN)

優(yōu)選和考慮其他算法的情況

K-均值聚類適用情況

考慮其他算法的情況

最后

K-均值聚類是一種簡單且有效的聚類算法,特別適合處理大規(guī)模數(shù)據(jù)集和具有明顯球狀分布的數(shù)據(jù)。在選擇算法時(shí),需要根據(jù)數(shù)據(jù)的特點(diǎn)(如簇的形狀、數(shù)據(jù)量、簇?cái)?shù)量的確定性等)來權(quán)衡不同算法的優(yōu)缺點(diǎn),以達(dá)到最佳的聚類效果。

本文章轉(zhuǎn)載微信公眾號@深夜努力寫Python

上一篇:

講透一個(gè)強(qiáng)大算法模型,層次聚類?。?/h5>

下一篇:

快速突破PyTorch,構(gòu)建CNN圖像分類模型??!
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)