所以你有一个数组
1
2
3
60
70
80
100
220
230
250为了更好地理解:

如何在python(v2.6)中对数组中的三个区域进行分组/集群,以便在本例中获得三个数组,其中包含
1 2 3 220 230 250
背景:
Y轴是频率,x轴是数字.这些数字是用它们的频率表示的十个最高振幅。我想从它们中创建三个离散数字来进行模式识别。可能会有更多的点,但它们都是按照一个相对较大的频率差异分组的,就像在这个例子中所看到的,大约在50到大约0之间,在大约100到大约220之间。注意,什么是大的,什么是小的变化,但是与组/集群的元素之间的差异相比,集群之间的差异仍然是显著的。
发布于 2012-01-20 12:04:43
这是在python中实现的一个简单算法,检查一个值是否离集群的平均值太远(就标准偏差而言)。
from math import sqrt
def stat(lst):
"""Calculate mean and std deviation from the input list."""
n = float(len(lst))
mean = sum(lst) / n
stdev = sqrt((sum(x*x for x in lst) / n) - (mean * mean))
return mean, stdev
def parse(lst, n):
cluster = []
for i in lst:
if len(cluster) <= 1: # the first two values are going directly in
cluster.append(i)
continue
mean,stdev = stat(cluster)
if abs(mean - i) > n * stdev: # check the "distance"
yield cluster
cluster[:] = [] # reset cluster to the empty list
cluster.append(i)
yield cluster # yield the last cluster这将返回在使用5 < n < 9的示例中所期望的结果。
>>> array = [1, 2, 3, 60, 70, 80, 100, 220, 230, 250]
>>> for cluster in parse(array, 7):
... print(cluster)
[1, 2, 3]
[60, 70, 80, 100]
[220, 230, 250]发布于 2012-01-20 12:36:10
请注意,如果x只是表示索引,则数据点实际上是一维的。您可以使用Scipy的cluster.vq模块对点进行聚类,该模块实现了k-均值算法.
>>> import numpy as np
>>> from scipy.cluster.vq import kmeans, vq
>>> y = np.array([1,2,3,60,70,80,100,220,230,250])
>>> codebook, _ = kmeans(y, 3) # three clusters
>>> cluster_indices, _ = vq(y, codebook)
>>> cluster_indices
array([1, 1, 1, 0, 0, 0, 0, 2, 2, 2])其结果意味着:前三点形成集群1 (任意标记),接下来四个表单集群0和最后三个表单集群2。根据索引对原始点进行分组是留给读者的练习。
有关Python中的更多聚类算法,请查看scikit-learn。
发布于 2012-01-20 10:47:47
我想你想要一个很好但很简单的算法。
如果您知道您想要N个集群,那么您可以获取(排序的)输入列表的连续成员之间的差异(增量)。例如在“裸体”中:
deltas = diff( sorted(input) )然后你可以把你的剪刀放在你发现N-2最大差异的地方。
如果你不知道N是什么,事情就更棘手了。当你看到一个大于某一尺寸的三角洲时,你就可以在这里放置切割口。然后,这将是一个手工调优的参数,这不是很好,但可能对您来说足够好。
https://stackoverflow.com/questions/8940049
复制相似问题