编写k-means代码
时间: 2024-03-02 10:21:44 浏览: 16
好的,以下是一个简单的 Python 实现 k-means 的代码:
```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(len(X), 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.mean(c, axis=0) for c in clusters]
if np.all(prev_centroids == self.centroids):
break
def predict(self, X):
return np.array([np.argmin([np.linalg.norm(x - c) for c in self.centroids]) for x in X])
```
在这个代码中,我们定义了一个 `KMeans` 类,它包含两个方法:`fit` 和 `predict`。`fit` 方法用于训练模型,`predict` 方法用于对新数据进行预测。
在 `fit` 方法中,我们首先随机初始化聚类中心,然后重复执行以下步骤:
1. 对于每个样本,计算其与每个聚类中心的距离,并将其分配到距离最近的聚类中心所属的簇中。
2. 对于每个簇,重新计算其聚类中心。
3. 如果聚类中心没有发生变化,停止训练。
在 `predict` 方法中,我们对于每个样本,计算其与每个聚类中心的距离,并将其分配到距离最近的聚类中心所属的簇中。然后返回每个样本所属的簇的索引。
我们可以使用以下代码来测试我们的 `KMeans` 类:
```python
X = np.random.randn(100, 2)
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_pred = kmeans.predict(X)
```
在这个示例中,我们生成了一个随机的二维数据集 `X`,然后使用 `KMeans` 类将其分为 3 个簇。最后,我们使用 `predict` 方法来预测每个样本所属的簇。