首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >您将如何在python中的数组中对这三个区域进行分组/集群?

您将如何在python中的数组中对这三个区域进行分组/集群?
EN

Stack Overflow用户
提问于 2012-01-20 10:35:17
回答 5查看 13.3K关注 0票数 17

所以你有一个数组

代码语言:javascript
运行
复制
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之间。注意,什么是大的,什么是小的变化,但是与组/集群的元素之间的差异相比,集群之间的差异仍然是显著的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-20 12:04:43

这是在python中实现的一个简单算法,检查一个值是否离集群的平均值太远(就标准偏差而言)。

代码语言:javascript
运行
复制
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的示例中所期望的结果。

代码语言:javascript
运行
复制
>>> 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]
票数 17
EN

Stack Overflow用户

发布于 2012-01-20 12:36:10

请注意,如果x只是表示索引,则数据点实际上是一维的。您可以使用Scipy的cluster.vq模块对点进行聚类,该模块实现了k-均值算法.

代码语言:javascript
运行
复制
>>> 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

票数 18
EN

Stack Overflow用户

发布于 2012-01-20 10:47:47

我想你想要一个很好但很简单的算法。

如果您知道您想要N个集群,那么您可以获取(排序的)输入列表的连续成员之间的差异(增量)。例如在“裸体”中:

代码语言:javascript
运行
复制
 deltas = diff( sorted(input) )

然后你可以把你的剪刀放在你发现N-2最大差异的地方。

如果你不知道N是什么,事情就更棘手了。当你看到一个大于某一尺寸的三角洲时,你就可以在这里放置切割口。然后,这将是一个手工调优的参数,这不是很好,但可能对您来说足够好。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8940049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档