2015-04-08 55 views
-1

鉴于以下情况,我有一条很长的街道。街上的每个房子都有一些孩子。如果我是按顺序追加在沿着阵列中的每个房子的儿童人数,我能得到一些阵列,如:连续数据的聚类

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] 

我想locationally确定在家庭组,也就是我要组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] 
+0

更新版本python'标签添加'你的问题。 –

+0

交叉帖子:http://stats.stackexchange.com/questions/145248/clustering-of-sequential-data/145263 –

回答

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]] 

所需输出不为0因此,这些指数看起来有点不同


编辑

更新算法的问题