Algorithm 时间序列数据的拭子分割算法

Algorithm 时间序列数据的拭子分割算法,algorithm,time-series,analytics,data-analysis,Algorithm,Time Series,Analytics,Data Analysis,我试图理解如何对一组时间序列数据(每日股票价格、温度等)进行分割,并偶然发现了一本书,解释了如何进行拭子(滑动窗口和自底向上)分割算法,但我不太理解。该分割是超声算法的一部分。以下文本来自“多媒体数据挖掘和分析:颠覆性创新” 棉签分割 算法获取四个参数:输入文件(时间序列数据)、输出 文件(分段数据)、最大误差和标称属性指示。 在对不同大小的时间序列进行了大量实验之后,使用不同的 对于段数,我们选择了适当的默认段数 各部分内容如下。小于100的时间序列的时间序列大小的25–50% 观测值,100

我试图理解如何对一组时间序列数据(每日股票价格、温度等)进行分割,并偶然发现了一本书,解释了如何进行拭子(滑动窗口和自底向上)分割算法,但我不太理解。该分割是超声算法的一部分。以下文本来自“多媒体数据挖掘和分析:颠覆性创新”

棉签分割 算法获取四个参数:输入文件(时间序列数据)、输出 文件(分段数据)、最大误差和标称属性指示。 在对不同大小的时间序列进行了大量实验之后,使用不同的 对于段数,我们选择了适当的默认段数 各部分内容如下。小于100的时间序列的时间序列大小的25–50% 观测值,100-200个观测值的时间序列为20-35%,100-200个观测值的时间序列为15-25% 超过200次观测的时间序列。如果用户不想使用 默认值无论出于何种原因,他都可以输入自己的段数作为参数 对算法进行了改进。 从最小和最大错误的默认值开始,我们 第一次运行分割算法并获得最小的分割数 给定时间序列的分段(最大误差越大,分段越少 将被发现)。然后我们减少最大误差(因此增加数值) (找到的段的数量)试图通过 将基数除以2的幂(类似于二进制搜索)。每次跑步后 对于当前最大误差的分割算法,我们测试了这一点 值为最佳分段数提供了更好的近似值,a也是如此 最佳最大误差的更好上限或下限。如果是这样的话,我们将推进这一进程 适当地绑定到此值。一开始,只有上界受到影响。 然而,一旦我们找到了下限,它提供了比 最佳,我们继续通过较小的步骤寻找最佳分段数: 下一个最大误差是当前上下限之间的平均值。 根据我们对许多不同时间序列数据库的经验,如下所示 最佳最大误差通常在3-4次迭代中找到。收敛速度 取决于输入的时间序列数据库本身。如果算法没有收敛 在20次迭代中,我们停止搜索并继续下一步的超声处理步骤 使用在第20次迭代中找到的分段

例如,如果我有150个观测值的时间序列数据(对应于20-35%的默认分段数),那么我需要采取哪些具体步骤来分段数据


非常感谢您的帮助。

具体步骤

以下是该方法的简要说明:

滑动窗口算法通过锚定 时间序列第一个数据点的潜在段, 然后尝试使用 增加更长的部分。在某个时刻,我发现 潜在段大于用户指定的阈值,因此 从锚点到i-1的子序列被转换为 一段。将锚移动到位置i,并重复该过程 直到整个时间序列被转换成一个分段的 线性近似

基于此,该算法的伪代码如下。请参阅代码中的我的注释,以了解到底发生了什么

//function takes a set of points T and a max error
function Sliding_Window(T, max_error)
  anchor = 1;
  while (not finished segmenting time series) {
    i=2;

    //keep making subsets of progressively larger size
    //until the error of the subset is greater than the max error
    //t[anchor: anchor + i] represents the elements of the set
    //from index (anchor) to index (anchor + i)
    //this could be an implemented as an array
    while (calculate_error(T[anchor: anchor+i]) < max_error) { 
      i=i+1;
    }

    //add the newly found segment to the set of all segments
    Seg_TS = concat(Seg_TS, create_segment(T[anchor: anchor + (i-1)]);

    //and increment the anchor in preparation for creating a new segment
    anchor = anchor + i;
  }
}
请注意,您使用的任何方法都可能有某些优点和缺点。更多信息和参考请参见下面Jason的评论,但关键是:确保您选择的任何错误函数都能很好地响应您期望的数据类型

来源


你能解释一下“错误”这个词的意思吗?我能想到它可能是几件事;许多是相互排斥的。:)是的,这是我也不明白的事情之一。你知道会是什么吗?谢谢你的帮助@杰森抢在我前面。我使用的是相同的参考文献:)另外:对于短噪声段,“平方和”方法存在“杠杆”问题。考虑一个更健壮的方法,比如最小二乘修剪最小二乘法的一个很好的例子。使用最小二乘法估计标记为“LS”的线。“LMS”是“最小中值平方”,“WLS”是“加权最小二乘”。@Jason真的很好;我编辑这篇文章是为了警告OP关于估计误差的方法可能存在的问题。@charliekelly这里有一个我找到的使用最小二乘法的链接:。如回答中所述,如果您发现最小二乘法存在一些问题,可以使用不同的方法。
function calculateSegmentErrorUsingSumOfSquares() {
  int sum = 0;
  for each (point in set_approximated_by_segment) {
    int difference = point.y_coordinate - approximation_segment.y_at_x(point.x_coordinate)
    sum = sum + (difference * difference)
  }
  return sum
}