集群顺序数据

时间:2015-04-08 05:26:34

标签: python cluster-analysis

鉴于以下情况,我的街道很长。街上的每个房子都有一些孩子。如果我按顺序在每个房子中按顺序追加孩子的数量,我可以得到一些数组:

x = [1,1,1,1,2,2,2,2,1,1,1,1,3,3,3,2,1,1,1,1,2,2,2,2]

我想在位置上确定家庭聚集的区域,即我想将2组合在一起,将3组合在一起,以及将2组合在一起。通常在1D数据上我会排序,确定差异,并找到1,2和3的集群。但是在这里,我想保持这些值的索引作为一个因素。所以我想最终将群集识别为:

index: value
0-4 :  1
5-8:   2
9-12:  1
13-16: 3
17-20: 1
21-24: 2

我已经看到用于此检测的均值偏移,并希望在python中实现它。我也看过内核密度函数。有谁知道如何在python中实现这个?

编辑:为了弄清楚,我简化了问题。在每个整数集群中,我试图解决的实际问题是围绕该整数值的高斯分布值。所以我会有一个更像的列表:

x = [0.8, 0.95, 1.2, 1.3, 2.2, 1.6, 1.9, 2.1, 1.1, .7, .9, .9, 3.4, 2.8, 2.9, 3.0, 1.1, 1.0, 0.9, 1.2, 2.2, 2.1, 1.7, 12.0]

1 个答案:

答案 0 :(得分:0)

一种简单的方法:

x = [0.8, 0.95, 1.2, 1.3, 2.2, 1.6, 1.9, 2.1, 1.1, .7, .9, .9, 3.4, 2.8, 2.9, 3.0, 1.1, 1.0, 0.9, 1.2, 2.2, 2.1, 1.7, 12.0]
cluster = []
for i, v in enumerate(x):
    v = round(v)
    if not cluster or cluster[-1][2] != v:
        cluster.append([i, i, v])
    else:
        cluster[-1][1] = i

这会产生一个[start, end, value]列表列表:

[[ 0,  3, 1],
 [ 4,  7, 2],
 [ 8, 11, 1],
 [12, 14, 3],
 [15, 15, 2],
 [16, 19, 1],
 [20, 23, 2]]

您想要的输出不是从零开始的,因此索引看起来有点不同


修改

更新了问题的更新版本的算法