python写一个进阶版k-means算法代码
时间: 2024-03-02 08:27:09 浏览: 62
python实现的k-means算法
5星 · 资源好评率100%
好的,我可以回答这个问题。下面是一个Python进阶版的k-means算法代码,你可以参考:
```
import numpy as np
import matplotlib.pyplot as plt
class KMeans():
"""
KMeans聚类算法
"""
def __init__(self, k=3, max_iter=100, tol=1e-4):
self.k = k # 聚类的数目
self.max_iter = max_iter # 最大迭代次数
self.tol = tol # 容差
def fit(self, X):
# 数据预处理
X = np.array(X)
m, n = X.shape
# 初始化聚类中心
centroids = X[np.random.choice(range(m), self.k, replace=False)]
# 执行KMeans聚类算法
for i in range(self.max_iter):
# 计算每个样本距离各个聚类中心的距离
distances = np.linalg.norm(X[:, np.newaxis, :] - centroids, axis=2)
# 找到每个样本所属的聚类
labels = np.argmin(distances, axis=1)
# 计算新的聚类中心
new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(self.k)])
# 判断是否需要停止聚类循环
if np.linalg.norm(new_centroids - centroids) < self.tol:
break
# 更新聚类中心
centroids = new_centroids
# 返回聚类结果
return labels
if __name__ == '__main__':
# 生成数据并进行聚类
X = np.concatenate([np.random.randn(100, 2) * 0.5 + [0, 5],
np.random.randn(100, 2) * 0.5 + [5, 0],
np.random.randn(100, 2) * 0.5 + [5, 5]])
kmeans = KMeans(k=3)
labels = kmeans.fit(X)
# 可视化聚类结果
colors = ['r', 'g', 'b']
for i in range(kmeans.k):
plt.scatter(X[labels == i][:, 0], X[labels == i][:, 1], c=colors[i])
plt.show()
```
这个代码实现了一个KMeans聚类算法,能够根据输入的数据进行聚类,并将聚类结果可视化出来。如果你有任何疑问可以继续问我哦!
阅读全文