鉴于以下情况,我的街道很长。街上的每个房子都有一些孩子。如果我按顺序在每个房子中按顺序追加孩子的数量,我可以得到一些数组:
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]
答案 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]]
您想要的输出不是从零开始的,因此索引看起来有点不同
修改强>:
更新了问题的更新版本的算法