在python中识别数组中的模式

时间:2018-01-19 12:11:46

标签: python arrays

我有一个关于识别数组中模式的问题。我正在使用以下数组:

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

非常感谢。最好的。

1 个答案:

答案 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