算法原理:
自顶向下TD算法:时间序列的开始点和结束点是首先选中的分段点。然后,遍历两点之间的所有点,找出和这两点连成的直线距离最大的点,如果这个点到直线的距离“大于”预先给定的阀值,则将它作为第三个分段点。这样我们就有了两个线段,做了最初步的划分。
之后,这个新增点到左边相邻点和右边相邻点构成的两条线段,继续寻找距离最大的点,然后,找到的两个点,谁与相应的线段距离最大,且这个距离“大于”阀值,则该点作为第四个分段点….如此循环,直到再也找不到距离大于R的点,分段完成。
这个阀值,也就是点到线段的距离,可以使用正交距离(原始点和分段线段在该点的值的差的绝对值)、垂直距离(原始点到分段线段的直线的长度)和欧式距离,当然也可以设置其他的特性作为阀值,比如拟合误差、又比如弧度、角度、余弦等,由此可以引申很多种不同的算法。
参考文章:http://www.cnblogs.com/by1990/archive/2011/01/15/1936296.html##
具体代码
#计算点到直线的距离
def calculate_error(st, seq_range):
x = np.arange(seq_range[0], seq_range[1] + 1)
y = np.array(st[seq_range[0]:seq_range[1] + 1])
A = np.ones((len(x), 2), float)
A[:, 0] = x
# 返回回归系数、残差平方和、自变量X的秩、X的奇异值
(p, residuals, ranks, s) = np.linalg.lstsq