如何对连续时间序列的值进行聚类

Posted

技术标签:

【中文标题】如何对连续时间序列的值进行聚类【英文标题】:how to cluster values of continuous time series 【发布时间】:2021-12-23 03:28:37 【问题描述】:

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

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

当有0时,我不知道它属于哪个serie。零总是以高索引存储在数组中 例如,在时间 t=136 我只有 4 个有效值。然后 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获取

【问题讨论】:

你的数组的形状是 (400,8),你知道零在哪里。你到底想做什么? 【参考方案1】:

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

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

【讨论】:

以上是关于如何对连续时间序列的值进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何根据面部特征对人脸进行聚类?

如何对时间序列数据执行 K-means 聚类?

具有离散和连续属性的聚类算法?

opencv:如何使用kmeans()按角度聚类

如何使用 KNN /K-means 在数据框中对时间序列进行聚类

如何对标记化的文档进行聚类