K-means演算法是一種廣泛使用的聚類分析(Cluster Analysis)方法,旨在將n個樣本劃分為K個聚類,每個樣本屬於與其最近的均值(聚類中心)對應的聚類。下面是K-means演算法的基本步驟:
初始化:隨機選擇K個樣本作為初始聚類中心。
分配步驟:對於資料集中的每一個樣本,計算其與每個聚類中心的距離,並將其分配給最近的聚類中心所對應的聚類。
更新步驟:更新每個聚類的中心,使其成為該聚類所有樣本的均值。
反覆運算:重複步驟2和步驟3,直到聚類不再發生變化或達到預定的反覆運算次數。
下面是使用Python實現的K-means演算法的簡化版本:
python
Copy code
import numpy as np
def k_means(D, K, max_iters=100):
n = len(D) # 資料集中的樣本數量
# 隨機初始化聚類中心
indices = np.random.choice(n, K, replace=False)
centroids = D[indices]
for _ in range(max_iters):
# 分配步驟
clusters = [[] for _ in range(K)]
for xi in D:
# 計算樣本與每個聚類中心的距離
distances = np.linalg.norm(xi - centroids, axis=1)
# 分配到最近的聚類
cluster_index = np.argmin(distances)
clusters[cluster_index].append(xi)
# 更新步驟
new_centroids = np.array([np.mean(cluster, axis=0) for cluster in clusters])
# 檢查是否收斂(聚類中心是否不再變化)
if np.all(centroids == new_centroids):
break
centroids = new_centroids
return clusters, centroids
# 假設D是一個numpy陣列,其中包含n個樣本
# D = np.array([...])
# K = 目標聚類數量
# clusters, centroids = k_means(D, K)
在這個實現中,D是一個形狀為(n, m)的numpy陣列,其中n是樣本數量,m是每個樣本的特徵數量。K是目標聚類的數量。函數返回最終的聚類和聚類中心。
需要注意的是,K-means演算法對初始聚類中心的選擇非常敏感,可能會導致局部最優解。因此,在實踐中,可能需要多次運行演算法,或使用更高級的初始化方法,如K-means++。此外,K-means演算法假設聚類是球形的,並且所有的特徵維度都是同等重要的,這在某些情況下可能不是最佳的假設。