Julia中欧氏距离计算异常求助:三种PIP提取方法结果不符
感知重要点(PIP)提取:欧氏距离方法结果异常的问题分析与解决
我来帮你拆解下这个问题:你用三种方法提取PIP时,垂线距离和垂直距离结果始终一致,但欧氏距离在自定义数据集上和另外两种差异明显,而在书籍提供的数据集上结果对齐。这大概率是代码实现有疏漏,再加上三种方法的本质逻辑差异共同导致的,下面具体分析:
一、先修复代码里的致命bug:欧氏距离公式写错了
看你复现代码里的这一行:
_dde = sqrt((1-i)^2+(ys[1]-ys[i])) + sqrt((10-i)^2 + (ys[end]- ys[i])^2)
这里第一个平方根里的(ys[1]-ys[i])少了平方操作!欧氏距离的正确公式是两点间直线距离,即sqrt((x₁-x₂)² + (y₁-y₂)²),所以这行代码必须修正为:
_dde = sqrt((1-i)^2 + (ys[1]-ys[i])^2) + sqrt((10-i)^2 + (ys[end]- ys[i])^2)
这个疏漏会直接导致欧氏距离计算完全错误,这应该是你测试时结果离谱的核心原因!先把这个问题修正,再重新跑测试,结果应该会合理很多。
二、三种距离方法的本质差异:为什么数据集不同会有结果分歧
即使修正了代码,在部分数据集上三种方法的结果也可能不一致,这是由它们的定义逻辑决定的:
- 垂直距离(Vertical Distance):只计算点到线段的垂直投影在y轴上的距离,完全忽略时间维度(x轴)的权重,只关心价格偏离的幅度。
- 垂线距离(Perpendicular Distance):是点到线段的最短几何距离,本质是垂直距离的标准化(除以线段斜率的模长),所以两者的相对大小完全一致——最大值的索引必然相同,这就是你看到这两个方法结果始终同步的原因。
- 欧氏距离之和(Euclidean Distance Sum):计算当前点到线段两端点的欧氏距离之和,这个指标同时兼顾了时间维度(点在时间轴上的位置)和价格维度(价格偏离幅度)。当时间跨度较大,或者价格波动的时间分布不均匀时,它的最大值很可能和前两者不同。
举个直观的例子:假设有一个点,价格偏离线段不多,但时间上非常靠近线段中点,它的欧氏距离之和会很小;而另一个点价格偏离中等,但时间上靠近线段的某一端,它的欧氏距离之和可能更大。但垂直/垂线距离只看价格偏离的几何距离,会优先选价格偏离最大的点。
三、为什么书籍数据集的结果会一致
书籍提供的数据集大概率是特意构造的:比如价格偏离最大的点,恰好同时在时间上远离线段两端,这种情况下三种方法的最大值会重合。但这是特殊场景,不是普遍规律,换用真实的金融时间序列数据时,结果出现分歧才是正常的。
四、后续验证建议
- 先修正欧氏距离公式的平方遗漏问题,重新运行测试代码,观察结果是否更符合预期。
- 可视化三种距离的分布:把时间点
xi作为x轴,分别把dE、dP、dV作为y轴画图,直观观察最大值的位置差异,理解不同指标的侧重。 - 如果需要让欧氏距离的结果和另外两种对齐,可以考虑给时间维度和价格维度加权重(比如根据时间间隔和价格波动幅度做标准化),让两个维度的贡献更均衡。
内容的提问来源于stack exchange,提问作者jupiter
相关产品推荐
相关产品推荐

