k_means
1、一维数据聚类:
def k_means(cen_num:int, x):
cen = torch.rand(cen_num, 1)
# x = torch.tensor(x, dtype=torch.float32)
# cen = torch.tensor(cen, dtype=torch.float32)
for i in range(50):
#SSE, 误差平方和
sse = (x - cen)**2
#取最后一行作为标签
values, label = torch.sort(sse, 0)
for i in range(cen_num):
index = torch.where(label[0]==i)[0]
cen[i] = torch.mean(x[index])
return torch.sum(values[0]).item()
sse = []
x = torch.rand(1, 10000)
for i in range(2, 50):
sse.append(k_means(i, x))
plt.plot(sse)
plt.show()
plt.pause(0.1)
2、二维数据(一维数据类似):
def k_means2dim(cen_num:int, x, iterations):
cen = torch.rand(cen_num,1, 2)
for j in range(iterations):
sse = (x - cen) **2
sse = sse.sum(axis=(2)) #输入数据与中心点距离的平方
values, label = torch.sort(sse, dim=0) #按零轴排序=分类
for i in range(cen_num):
index = torch.where(label[0]==i)[0]
cen[i] = torch.mean(x[index], axis=0) #获取新中心点
return torch.sum(values[0]).item()
sse = []
x = torch.rand(10000, 2)
for i in range(2, 50):
sse.append(k_means2dim(i, x, 50))
plt.plot(sse)
plt.show()
plt.pause(0.1)