首先我们导入科学计算的库
python
import numpy as np
import matplotlib.pyplot as plt
直接我们生成一组数据,为了保证每次的数据是一致的,我们设置一个随机种子。
python
np.random.seed(0)
X=np.random.rand(100,2)
print(X)
结果
然后我们就要开始写K-means算法
写一个模块函数
python
def k_means(X,K,max_iters=100):
#随机选择k个初始中心
centroids=X[np.random.choice(X.shape[0],K,replace=False)]
#X.shape[0]告诉np.random.choice函数需要从0到数据点总数之间随机选择索引。
#K是指选择几个 replace指选择不重复的 然后用np.random.choice函数来从X里面选择几个不重复的
for _ in range(max_iters):
#1.分配每个数据点到最近的中心
distances=np.linalg.norm(X[:,np.newaxis]-centroids,axis=2)#计算距离
labels=np.argmin(distances,axis=1)#分配标签
#2.更新中心
new_centroids=np.array([X[labels==k].mean(axis=0) for k in range(K)])
#如果中心不再变化,则停止
if np.all(centroids==new_centroids):
break
centroids=new_centroids
return labels,centroids
python
K=3 #簇的数量
labels,centroids=k_means(X,K)
设置一下簇的数量,k-means算法每次都要设置k值
然后把最后的中心点和分类后的数据用matplotlib画出来
python
plt.scatter(X[:,0],X[:,1],c=labels,cmap='viridis',marker='o')#绘制数据点
plt.scatter(centroids[:,0],centroids[:,1],c='red',marker='x',s=200)#绘制中心点
plt.title('k-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()