基本概念
K-Means 聚类算法的目标是将数据集分成 ( K ) 个簇,使得每个簇内的数据点尽可能相似,而簇与簇之间尽可能不同。这种相似度是通过计算数据点与簇中心的距离来衡量的。
算法步骤
- 选择簇的数量 ( K ):随机选择 ( K ) 个数据点作为初始簇中心(质心)。
- 分配数据点:将每个数据点分配到距离最近的簇中心,形成 ( K ) 个簇。
- 更新簇中心:重新计算每个簇的质心,即该簇所有数据点的均值。
- 重复步骤 2 和 3:直到簇中心的位置不再发生显著变化或达到预设的最大迭代次数。
距离度量
K-Means 算法中通常使用欧氏距离来度量数据点 ( x ) 和簇中心 ( y ) 之间的距离,
实现代码
以下是使用 Python 和 NumPy 实现 K-Means 聚类算法的示例代码:
python
import numpy as np
class KMeans:
def __init__(self, k=3, max_iters=100):
self.k = k
self.max_iters = max_iters
self.centroids = None
def fit(self, X):
# 随机初始化簇中心
self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
for _ in range(self.max_iters):
# 分配每个样本到最近的簇中心
labels = self._assign_clusters(X)
# 计算新的簇中心
new_centroids = self._calculate_centroids(X, labels)
# 检查簇中心是否发生变化
if np.all(new_centroids == self.centroids):
break
self.centroids = new_centroids
return labels
def _assign_clusters(self, X):
# 计算每个数据点到簇中心的距离,并分配到最近的簇中心
distances = np.sqrt(((self.centroids[:, np.newaxis, :] - X[np.newaxis, :, :]) ** 2).sum(axis=2))
return np.argmin(distances, axis=0)
def _calculate_centroids(self, X, labels):
# 计算每个簇的新簇中心
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
return new_centroids
def predict(self, X):
# 预测数据点的簇标签
return self._assign_clusters(X)
# 示例用法
if __name__ == "__main__":
# 创建示例数据
X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
# 创建KMeans实例
kmeans = KMeans(k=2, max_iters=100)
# 训练模型
kmeans.fit(X)
# 预测簇标签
predictions = kmeans.predict(X)
print("簇中心:\n", kmeans.centroids)
print("预测簇标签:", predictions)
超参数选择
- ( K ) 值的选择通常依赖于具体问题和数据集。可以使用肘部法则(Elbow Method)或轮廓系数(Silhouette Score)等方法来辅助决定最优的 ( K ) 值。
优缺点
优点
- 简单直观:算法容易理解和实现。
- 计算效率高:对于大规模数据集也相对有效。
缺点
- 对初始簇中心敏感:可能只能找到局部最优解。
- 需要指定 ( K ):簇的数量需要预先指定,这在某些情况下可能不是显而易见的。
- 对非球形簇效果差:对具有复杂形状或大小不一致的簇的识别效果不佳。
总结
K-Means 是一种简单有效的聚类算法,适用于许多实际问题。然而,它也有一些局限性,因此在选择聚类算法时应考虑数据集的特性和具体需求。