不使用sklearn.cluster.KMeans,自己编程实现k均值算法
时间: 2023-11-22 16:52:20 浏览: 79
好的,下面是一个简单的 Python 实现 k 均值算法的代码:
```python
import numpy as np
class KMeans:
def __init__(self, n_clusters=8, max_iter=300):
self.n_clusters = n_clusters
self.max_iter = max_iter
def fit(self, X):
# 初始化聚类中心
self.centroids = X[np.random.choice(X.shape[0], self.n_clusters, replace=False)]
# 开始迭代
for i in range(self.max_iter):
# 分配样本到聚类中心
clusters = [[] for _ in range(self.n_clusters)]
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.array([np.mean(cluster, axis=0) for cluster in clusters if cluster])
# 如果聚类中心没有变化,则退出循环
if np.allclose(self.centroids, prev_centroids):
break
def predict(self, X):
distances = np.array([np.linalg.norm(X - c, axis=1) for c in self.centroids])
return np.argmin(distances, axis=0)
```
这段代码实现了 KMeans 类,通过构造函数可以设置聚类数和最大迭代次数,fit 方法用于训练模型,predict 方法用于预测样本所属的聚类。
具体实现中,首先在样本中随机选择 k 个点作为聚类中心,然后进行迭代。每次迭代,首先将样本分配到最近的聚类中心所在的簇中,然后更新聚类中心,直到聚类中心不再变化或达到最大迭代次数。最后,predict 方法根据已经训练好的聚类中心,预测样本所属的聚类。
阅读全文