# import numpy as np
# import os
# import matplotlib.pyplot as plt
# arr = os.listdir('labels')
# list1 = []
# for i in arr:
# anchor = np.loadtxt(os.path.join('labels',i))
# # print(len(anchor.shape))
# if len(anchor.shape) == 1:
# list1.append(anchor[-2:])
# # print(anchor[-2:])
# else:
# for j in anchor:
# # print(j[-2:])
# list1.append(j[-2:])
# np.savetxt('means.txt',list1)
# arr = np.loadtxt('means.txt')
# print(arr)
# plt.scatter(arr[:,0],arr[:,1])
# plt.show()
import numpy as np
import matplotlib.pyplot as plt
import random
import math
data = np.loadtxt('means.txt')
maxx,maxy = np.max(data[:,0]),np.max(data[:,1])
minx,miny = np.min(data[:,0]),np.min(data[:,1])#找出两个特征的最大和最小区间 方便聚类中心的随机
k = 6
Karr = [[random.uniform(minx,maxx),random.uniform(miny,maxy)] for i in range(k)]#随机k个聚类中心
print(Karr)
data = data.tolist()#将矩阵转换为list
# Karr = data[0:4]
flag_k = []
while True:
class_K = [[] for i in range(k)]#建立一个list用来存每一个归属于聚类中心的样本点
for i in data:#第一层循环
# print(i)
min = 9999
for j in range(k):
num2 = math.sqrt((i[0]-Karr[j][0])**2 + (i[1]-Karr[j][1])**2)#计算欧氏距离t
if num2 < min:
min = num2#找出距离近的值
K_index = j#保存距离近的距离中心索引
class_K[K_index].append(i)#存入归属于这个聚类中心的样本点
if np.all(class_K == flag_k):
print('迭代结束')
break#判断聚类是否需要继续迭代
flag_k = class_K#保存本次的归类的样本点 方便下次比较判断
# print(flag_k)
for n in range(k):
arr_K = np.array(class_K[n])
Karr[n] = np.mean(arr_K,0).tolist()#求出归类后的样本点的均值 组成新的聚类中心
print(Karr)
for i in range(k):
plt.scatter(np.array(class_K[i])[:,0],np.array(class_K[i])[:,1])#画出样本点
plt.scatter(np.array(Karr)[:, 0], np.array(Karr)[:, 1],marker='x')#画出聚类中心
plt.show()
print([[int(j*416) for j in i] for i in Karr])#乘416
yolo_anchor
最新推荐文章于 2024-06-23 17:04:45 发布