不调包实现kmeans聚类,并画出聚类效果图
时间: 2024-06-19 10:03:25 浏览: 12
K-means是一种常见的聚类算法,它可以将数据集划分为K个不同的簇,每个簇包含尽可能相似的数据点。以下是不调包实现K-means的步骤:
1. 初始化聚类中心:随机选取K个样本作为聚类中心。
2. 对于每个样本,计算其与各个聚类中心之间的距离,将其划分到距离最近的簇中。
3. 更新聚类中心:对于每个簇,计算其中所有样本的均值,将其作为新的聚类中心。
4. 重复步骤2和3直到聚类中心不再变化或达到最大迭代次数。
下面是代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
def kmeans(X, K, max_iters=100):
m, n = X.shape
centroids = X[np.random.choice(m, K), :]
idx = np.zeros(m)
for i in range(max_iters):
# cluster assignment step
for j in range(m):
distances = np.sum((X[j, :] - centroids) ** 2, axis=1)
idx[j] = np.argmin(distances)
# move centroids step
for k in range(K):
centroids[k, :] = np.mean(X[idx == k, :], axis=0)
return idx, centroids
# generate data
np.random.seed(42)
X = np.vstack((np.random.randn(100, 2) * 0.75 + np.array([1, 0]),
np.random.randn(100, 2) * 0.25 + np.array([-0.5, 0.5]),
np.random.randn(100, 2) * 0.5 + np.array([-0.5, -0.5])))
# run kmeans
idx, centroids = kmeans(X, K=3)
# plot result
colors = ['r', 'g', 'b']
fig, ax = plt.subplots()
for k in range(3):
cluster_data = X[idx == k, :]
ax.scatter(cluster_data[:, 0], cluster_data[:, 1], c=colors[k], label='cluster {}'.format(k))
ax.scatter(centroids[:, 0], centroids[:, 1], c='k', marker='*', s=200, label='centroids')
ax.legend()
plt.show()
```
运行上述代码可以得到K-means聚类的效果图:
![kmeans效果图](https://img-blog.csdn.net/20180529172718679?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTU3NTkyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)