我有一个关于识别数组中模式的问题。我正在使用以下数组:
A = [1.0, 1.1, 9.0, 9.2, 0.9, 9.1, 1.0, 1.0, 1.2, 9.2, 8.9, 1.1]
现在,这个数组显然是由关于~1
的元素和关于~9
的元素组成的。
有没有办法将这些集群分开?即,得到类似的东西:
a_1 = [1.0, 1.1, 0.9, 1.0, 1.0, 1.2, 1.1] # elements around ~1
a_2 = [9.0, 9.2, 9.1, 9.2, 8.9] # elements around ~9
非常感谢。最好的。
答案 0 :(得分:1)
您可以通过比较更接近的每个元素来做到这一点。是否接近1或9:
a_1 = [i for i in A if abs(i-1)<=abs(i-9)]
a_2 = [i for i in A if abs(i-1)>abs(i-9)]
但当然这不是群集的一般解决方案。只有当您知道群集的中心(1和9)时,它才适用于此情况。
如果您不知道群集的中心,我认为您应该使用像K-Means这样的聚类算法
这是一个简单的K-Means实现(k = 2和100作为极限迭代)。你不需要知道集群的中心,它首先随机选择。
from random import randint
A = [1.0, 1.1, 9.0, 9.2, 0.9, 9.1, 1.0, 1.0, 1.2, 9.2, 8.9, 1.1]
x = A[randint(0,len(A)-1)]
y = A[randint(0,len(A)-1)]
for _ in range(100):
a_1 = [i for i in A if abs(i-x)<=abs(i-y)]
a_2 = [i for i in A if abs(i-x)>abs(i-y)]
print(x,y)
x = sum(a_1)/len(a_1)
y = sum(a_2)/len(a_2)
print a_1
print a_2