原理我们就不赘述了,搜一搜都有的。使用的数据是我自己地,大概就是两列数字这个样子,有问题地话可以评论区留言或者私信。
我们使用的是python,因为是简单地实现算法,所以我们不能调用k-means的包。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
1.导入数据
data = pd.read_csv('140-2.txt.txt', header=None, sep="\s+", names=['x', 'y']) #这里names给数据的两列命名为x,y
x = data['x']
y = data['y']
2.画出数据的原始图像
plt.scatter(x,y)
#计算出样本和质心的距离
def distance(data, center):
#data:140*2 centers:2*2
#dist = np.zeros((140,2))
dist = np.zeros((data.shape[0], centers.shape[0]))
for i in range(len(data)):
for j in range(len(centers)):
#欧氏距离
dist[i,j] = np.sqrt(sum((data.iloc[i, :] - centers[j])**2)) #dadta是pandas格式,用iloc标签取i行所有列
return dist
#每个样本与质心的最近距离
def near_center(data, centers):
dist = distance(data, centers)
near_cen = np.argmin(dist, 1) #求得最短距离
return near_cen
#k-means
def kmeans(data, k):
#1,随机初始质心
centers = np.random.choice(np.arange(-20,5,0.1), (k,2))#这里的范围是图上所示的范围
print(centers)
#迭代10次
for _ in range(10):
#2点归属
near_cen = near_center(data, centers)
#3质心的更新
for ci in range(k):
centers[ci] = data[near_cen == ci].mean()
#print(data[near_cen == 0].mean()) #样本点与质心距离为0的点
return centers,near_cen
#显示初始质心和迭代后的质心位置
centers, near_cen = kmeans(data, 2)
centers
4.再次画出图像,标明质心的位置
#画出图像
plt.scatter(x, y, c=near_cen)
plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=300) #marker选择图标,s设置图标大小
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20191208225338863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc1MDkwNw==,size_16,color_FFFFFF,t_70)