
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
總之,K-均值聚類是一種把數據分組的方法,它通過找到每組數據的中心點,并不斷調整這些中心點的位置,來達到分組的目的。
1. 目標函數
K-均值聚類的目標是最小化每個簇內樣本到簇中心的距離之和。用數學符號表示,即最小化以下目標函數:
其中:
2. 質心的計算
質心是簇內所有點的平均值。第??個簇的質心??的計算公式為:
其中 是簇 中的樣本點數量。
算法流程
將??分配到最近的質心所對應的簇?:
綜上,K-均值聚類通過迭代優化,逐步最小化樣本點到質心的距離平方和,達到將數據分成多個相似簇的目的。
我們來進行一個完整的K-均值聚類實際案例示例。
還是使用經典的鳶尾花數據集(Iris Dataset),這個數據集包含150個樣本,每個樣本有4個特征:花萼長度、花萼寬度、花瓣長度和花瓣寬度。此外,每個樣本還標注了其所屬的花的品種(鳶尾花的三種品種:Iris-setosa、Iris-versicolor和Iris-virginica)。
完整代碼,大家可以根據注釋進行理解,后面可以使用自己的數據集進行實現,加強理解。
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
# 加載數據集
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
# 將數據集轉換為DataFrame,便于處理
df = pd.DataFrame(X, columns=feature_names)
df['target'] = y
# 數據可視化
sns.pairplot(df, hue='target', markers=["o", "s", "D"])
plt.suptitle('Iris Data Pair Plot', y=1.02)
plt.show()
# 使用PCA進行降維到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
# 可視化降維后的數據
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()
# 確定最優的簇數
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)
# 繪制肘部法圖和輪廓系數圖
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()
# 選擇最優簇數并進行K-均值聚類
optimal_k = 3 # 根據肘部法和輪廓系數選擇
kmeans = KMeans(n_clusters=optimal_k, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
# 將聚類結果加入到DataFrame
df_pca['cluster'] = labels
# 可視化聚類結果
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)
# 打印輪廓系數
final_silhouette_score = silhouette_score(X, labels)
print(f"Final Silhouette Score: {final_silhouette_score}")
其中需要注意的幾個步驟:
算法優化方面,可以考慮三方面:
1. 初始質心選擇優化:使用k-means++
算法來優化初始質心的選擇,從而提高聚類的穩定性和準確性。
kmeans = KMeans(n_clusters=optimal_k, init='k-means++', random_state=42)
2. 數據標準化:在聚類之前,對數據進行標準化處理,使得每個特征的均值為0,方差為1。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
3. 重復實驗:運行多次K-均值聚類,并選擇最小的目標函數值對應的聚類結果。
kmeans = KMeans(n_clusters=optimal_k, init='k-means++', n_init=10, random_state=42)
通過整個的代碼和優化策略,大家可以感受整個過程。代碼中,實現了鳶尾花數據集的聚類分析,并且通過可視化、評估指標等手段對聚類效果進行了詳細的評估和優化。
優點:
缺點:
K-均值聚類 vs 層次聚類(Hierarchical Clustering):
K-均值聚類 vs 密度聚類(Density-Based Clustering,如DBSCAN):
K-均值聚類適用情況:
考慮其他算法的情況:
K-均值聚類是一種簡單且有效的聚類算法,特別適合處理大規模數據集和具有明顯球狀分布的數據。在選擇算法時,需要根據數據的特點(如簇的形狀、數據量、簇數量的確定性等)來權衡不同算法的優缺點,以達到最佳的聚類效果。
本文章轉載微信公眾號@深夜努力寫Python