概述
K-means算法是一种常见的无监督学习算法,其目的是将一组数据点分成K个簇,每个簇的数据点与其它簇的数据点相似度较低。这个算法可以用于许多领域,例如数据挖掘、图像处理和自然语言处理等。
主要思想
1.初始化K个簇中心,可以随机选择数据集中的K个点。
2.将每个数据点分配到距离最近的簇中心所在的簇。
3.对于每个簇,重新计算簇中心的位置。
4.重复步骤2和步骤3,直到簇中心不再变化或达到最大迭代次数为止。
优点与缺点
K-means算法的优点在于简单易懂、计算效率高、可解释性强,并且对于一些数据集,其聚类效果较好。但是,K-means算法需要事先确定聚类数量K,并且对于不同的K值可能会得到不同的聚类结果,因此在使用K-means算法时需要根据实际问题对K值进行合理选择。此外,K-means算法对噪声和异常值比较敏感。
代码实现
import numpy as np
class KMeans:
def __init__(self, k=3, max_iter=100):
self.k = k
self.max_iter = max_iter
def fit(self, X):
# 随机初始化聚类中心
self.centroids = X[np.random.choice(len(X), self.k, replace=False)]
# 迭代
for i in range(self.max_iter):
# 初始化聚类簇
clusters = [[] for _ in range(self.k)]
# 遍历每个数据点
for x in X:
# 计算数据点到每个聚类中心的距离
distances = [np.linalg.norm(x - c) for c in self.centroids]
# 将数据点分配到距离最近的聚类中心所在的簇中
cluster_idx = np.argmin(distances)
clusters[cluster_idx].append(x)
# 保存上一次迭代的聚类中心
prev_centroids = self.centroids
# 重新计算每个聚类簇的中心
self.centroids = [np.mean(cluster, axis=0) if cluster else prev_centroids[i] for i, cluster in enumerate(clusters)]
# 判断聚类中心是否变化
if np.allclose(prev_centroids, self.centroids):
break
# 返回聚类中心、聚类簇和实际迭代次数
return self.centroids, clusters, i+1
上面的代码使用了NumPy库来进行向量计算。在这个实现中,KMeans类有两个参数:k是聚类数量,max_iter是最大迭代次数。fit方法用于训练模型,其中X是一个 n × d n \times d n×d的矩阵,表示 n n n个 d d d维数据点。该方法返回三个值:centroids表示聚类中心,clusters是一个长度为k的列表,每个元素是一个聚类簇中的数据点集合,i+1是实际迭代次数。
在fit方法中,我们首先随机初始化k个聚类中心,然后重复以下步骤,直到簇中心不再变化或达到最大迭代次数:
1.遍历每个数据点,将其分配到距离最近的聚类中心所在的簇中。
2.重新计算每个聚类簇的中心。
最后,我们返回计算得到的聚类中心和聚类簇。