请问下,一个list是这样的
a_list=[220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]。
我想要类似于聚类的方式,将这一个列表,根据他们间的距离,分成三份,该如何做啊?
最后变成这一样子:
[[219, 219.9, 220, 221, 221.6], [300.3, 310], [399, 400, 401]]
就满意了。谢谢
def cluster(data, maxgap):
data.sort()
groups = [[data[0]]]
for x in data[1:]:
if abs(x - groups[-1][-1]) <= maxgap:
groups[-1].append(x)
else:
groups.append([x])
return groups
if __name__ == '__main__':
data = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
maxgap = 15
print(cluster(data, maxgap))
a_list = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
a_list.sort()
b=[]
while len(a_list)>0:
k = a_list[0]
c=[x for x in a_list if x<k+80]
b.append(c)
for i in c:
a_list.remove(i)
print(b)
运行结果
聚类的话 用KMEANS算法啊 这个的学,不然写了你也看不懂
import numpy as np
def cluster_oneDimensional(a, center_num):
center_dist_min = 30
center = np.asarray(list(set(a)))[:center_num]
while True:
centero = center
# cls = [[a[0]], [a[1]], [a[2]]]
cls = [[a[i]] for i in range(center_num)]
# cls = center.reshape((-1, 1)).tolist()
for ai in a:
dist = np.abs(center-ai)
for c in cls:
if ai in c:
c.remove(ai)
cls[dist.argmin()].append(ai)
center = np.asarray([sum(i)/len(i) for i in cls])
center_dist = center[1:]-center[:-1]
for idx,cd in enumerate(center_dist):
if cd<center_dist_min:
center[idx:] += center_dist_min
if np.all(center==centero):
# print(cls)
# print(center)
# break
return cls
x_center_list = [220, 221, 221.6, 399, 300.3, 310, 219, 219.9, 400, 401]
a = np.asarray(x_center_list)
cluster_list = cluster_oneDimensional(a, center_num=3)
print(cluster_list)
输出结果:
[[300.3, 310.0], [220.0, 221.0, 221.6, 219.0, 219.9], [399.0, 400.0, 401.0]]