实现k-means聚类算法,导入了python自带的数据库鸢尾花的数据作为实验数据,计算k个中心分类后的结果,结果用图像显示。
前言
这里就不详细解释什么是K-means算法了,直接上代码 ,用的是python来实现,比较简单
一、全部代码
python实现,导入的是python自带鸢尾花库
1.引入库
from sklearn.datasets import load_iris
import copy
import matplotlib.pyplot as plt
2.其他代码
iris = load_iris() # 导入鸢尾花数据
print("请输入你想要分为几类:")
k = eval(input())
# center = [[5, 3.5], [6, 3], [6.5, 3.5]] 测试中心点数据
color=["red","blue","pink","orange","yellow"]
marker=[".","+","*","s","<"]
center=[]
x=[]
y=[]
print("请输入你的起始点中心坐标:")
for i in range(k):
a=list(map(float,(input().split(","))))
center.append(a)
for i in range(len(iris.data)):
x.append(iris.data[i][0])
y.append(iris.data[i][1])
while 1:
ol=copy.deepcopy(center)
lx=[]
ly=[]
sum_x = []
sum_y = []
for i in range(k):
lx.append([])
ly.append([])
sum_x.append(0)
sum_y.append(0)
for i in range(len(x)):
ld=[]
for j in range(k):
d=((x[i]-center[j][0])**2+(y[i]-center[j][1])**2)**0.5
ld.append(d)
min_d=ld.index(min(ld))
lx[min_d].append(x[i])
ly[min_d].append(y[i])
sum_x[min_d]=sum_x[min_d]+x[i]
sum_y[min_d]=sum_y[min_d]+y[i]
for j in range(k):
center[j][0]=sum_x[j]/len(lx[j])
center[j][1] = sum_y[j] / len(ly[j])
#比较中心点是否变化,若没变化则停止循环
if center==ol:
break
for i in range(k):
plt.scatter(lx[i],ly[i],c=color[i],marker=marker[i])
plt.scatter(center[i][0],center[i][1],c="black",)
plt.show()
二、结果
1.输入
2.输出
总结
总的来说比较好理解,但是感觉好像不太严谨哈哈哈哈,要是有错误,提出来我改正!!谢谢