k=0 date=np.random.randint(0,225,size=[100,2]) dateList=[datePoint(i[0],i[1],0) for i in date] pointlist=[[random.randint(0,225),random.randint(0,225)] for i inrange(k)]
k
为中心点个数;date为随机生成的数据;dateList
保存数据与其所属中心点;pointlist
是中心,使用随机数初始化。
defcalPoint(dateList:list,pointList:list): for i in dateList: flag=10000000#一个足够大的数字 for ii inrange(len(pointList)): if(flag>((i.x-pointList[ii][0])**2+(i.y-pointList[ii][1])**2)): flag=(i.x-pointList[ii][0])**2+(i.y-pointList[ii][1])**2 i.point=ii
defchange_point(dateList:list,pointList:list): new_point_list=[[0,0] for i inrange(k)] nums_point=[0for i inrange(k)] for i in dateList: new_point_list[i.point][0]+=i.x new_point_list[i.point][1]+=i.y nums_point[i.point]+=1 for i inrange(k): pr=new_point_list[i] pr[0]=int(pr[0]/nums_point[i]) pr[1]=int(pr[1]/nums_point[i]) if new_point_list!=pointList: for i inrange(k): pointList[i][0]=new_point_list[i][0] pointList[i][1]=new_point_list[i][1] print(pointList) returnTrue else: returnFalse
先定义了一个数组 new_point_list
来储存新计算的中心点,然后 nums_point
储存属于每一个中心点的数据个数以方便最后计算平均值。在我这个精度下,点取整数即可。最后一个
if 用于判断中心发生了改变,就返回 True 反之为
False.
一些收尾工作
1 2 3
while change_point(dateList,pointlist): calPoint(dateList,pointlist) print(pointlist)