首页 > 解决方案 > 如何对连续时间序列的值进行聚类

问题描述

在此处输入图像描述

在图片中,我绘制了形状数组 (400,8) 中的值,我希望重新组织点以获得 8 个“连续”点系列。我们称它们为 a(t)、b(t)、..、h(t)。a(t) 是具有较小值的系列,而 h(t) 是具有较大值的系列。它们是未知的,我试图获得它们

我有一些缺失值被 0 替换。

当有0时,我不知道它属于哪个系列。零总是以高索引存储在数组中例如在时间 t=136 我只有 4 个有效值。然后 array[t,i] > 0 for i <=3 and array[t,i] = 0 for i > 3

如何以我得到“连续”时间序列的方式对点进行聚类,即在时间 t=136,array[136,0] 应该进入 d,array[136,1] 应该进入 e,array[136, 2] 应该进入 f 并且 array[136,3] 应该进入 g

我用 scikit-learn 尝试了 AgglomerativeClustering 和 DBSCAN,但没有成功。

数据可在https://drive.google.com/file/d/1DKgx95FAqAIlabq77F9f-5vO-WPj7Puw/view?usp=sharing

标签: pythonnumpyscikit-learncluster-analysis

解决方案


我的解释是你的意思是你有 400 列和 8 行的数据。数据值分配给正确的列,但不一定分配给正确的行。您的图显示 8 个信号不相互交叉,因此您应该能够简单地单独对每一列进行排序。但是现在丢失的数据是问题所在,因为代表丢失数据的零都会排序到最底部的行,从而迫使真实数据进入错误的行。

我不知道这是否是一个好的答案,但我的第一个预感是首先对每一列进行单独排序,然后从一个有多个相邻列的位置开始,其中包含完整的真实数据,然后首先远离该位置从左到右,一次一列:如果该列不包含零,则可以。如果它包含零,则计算本地行平均值紧邻的列,仅使用非零值(列数取决于缺失数据的密度和信号之间的分辨率),然后将当前列中的每个有效值放入具有最接近 'local行平均值'值,并在其余行中放置零。如何编写代码取决于您到目前为止所做的工作。如果您使用的是 numpy,那么首先将零转换为 NaN 会很方便,因为 numpy.nanmean() 将忽略 NaN。


推荐阅读