共识/集群Python中的一组可变长度列表?

共识/集群Python中的一组可变长度列表?,python,list,cluster-analysis,average,consensus,Python,List,Cluster Analysis,Average,Consensus,我有一组传感器测量一些时间数据。在任何给定的时间步,传感器输出0或1。传感器永远不会按顺序输出两个1s 考虑到可用的传感器,我们如何找到最佳估计 例如,假设四个传感器在这些提供的索引处输出一个1 A=[178511843118015121733] B=[51484611821517361937] C=[182516848151717381939] D=[1795138451181513173519362124] 通过目视检查,我可以看到: A在列表末尾丢失了一个值 B在列表的最前面丢失了一个

我有一组传感器测量一些时间数据。在任何给定的时间步,传感器输出
0
1
。传感器永远不会按顺序输出两个
1
s

考虑到可用的传感器,我们如何找到最佳估计

例如,假设四个传感器在这些提供的索引处输出一个
1

A=[178511843118015121733]
B=[51484611821517361937]
C=[182516848151717381939]
D=[1795138451181513173519362124]
通过目视检查,我可以看到:

  • A在列表末尾丢失了一个值
  • B在列表的最前面丢失了一个值
  • C在列表中间丢失了一个值
  • D在列表的末尾有一个额外的值
#一致性算法不知道无位置
a=[178511843118015121733,无]
b=[None,51484611821517361937]
c=[182516848,无,151717381939]
d=[179513845118151317351936]#2124删除
#共识:删除“无”的列的平均值
#四舍五入到最接近的整数
s=共识((A、B、C、D))
s=[180514849118151417361937]
如果我们有两个附加传感器
E
F
,其值如下:

E=[2130]
F=[2121]
#这两个传感器只有一个尾部值
#因此,传感器D的额外读数现在是共识的一部分。
#所有其他值不变。
s=共识(A、B、C、D、E、F))
s=[1805148491181514173619372125]

是否有解决此问题的非O(n^2)解决方案?

感谢评论中的两位用户,他们能够引导我找到一个有效的解决方案

编辑:当我们将所有读数连接到一个阵列中时,我们会丢失每个传感器都是唯一的信息,因此我不太确定是否将其标记为最终答案。此外,我认为还可以使用迭代或动态规划方法,跟踪每个传感器到最近值的距离

从matplotlib导入pyplot作为plt
从sklearn.neights导入内核密度
从scipy.signal导入查找\u峰值
concat=A+B+C+D
X=np.array(concat)[:,np.newaxis]
X_plot=np.linspace(0,1.1*X.max(),1000)[,np.newaxis]
kde=内核密度(带宽=2).fit(X)
log_dens=kde.score_样本(X_图)
密度=np.exp(对数密度)
峰值,u=查找峰值(密度)
平面图(X_图[:,0],密度)
平面图(X_图[峰]、密度[峰]、“X”)
plt.show()
打印(tuple(int(i)表示X_图[peaks].squeak()中的i)
# (180, 514, 846, 1181, 1513, 1735, 1936, 2123)

这些时间值是否存在可预测的变化范围?我在想,如果另一个传感器在1000时给出正读数,这是一个新的值,还是属于~850或1180的值之一?如果和紧密性之间的间隙很明显,您可以相当容易地测试分组。@katardin,除了没有来自同一传感器的背对背输出外,没有提供关于变化的进一步信息。如果
E=[1000]
并且我们运行了
共识((A,B,C,D,E))
我预计这个新的读数会落入850位。这似乎是聚类中的一个问题。我建议您合并列表并查找值的集群。对聚集值进行分组并求平均值。群集容差是您的决定。我将向您推荐这个答案,其中他们建议哪些适用于一维变量,并且您不必指定箱子的数量。在这种情况下,箱子的数量是一个问题,因为您似乎无法从数据类型推断事件的实际数量@使用集群算法的一个挑战是我事先不知道集群的数量。