<p>我不知道Python中有什么内置函数可以做到这一点。在</p>
<p>我可以给您一个在Python生态系统中可以使用的函数的列表。这绝不是一个完整的函数列表,可能有很多方法我不知道。在</p>
<p>如果数据已排序,但您不知道哪个数据点是第一个,哪个数据点是最后一个:</p>
<ol>
<li>使用定向Hausdorff距离</li>
</ol>
<p>如果数据是有序的,并且您知道第一点和最后一点是正确的:</p>
<ol>
<li>离散Fréchet距离<sup>*</sup></li>
<li>动态时间扭曲(DTW)<sup>*</sup></li>
<li>部分曲线映射(PCM)<sup>**</sup></li>
<li>曲线长度距离度量(使用从开始到结束的弧长距离)<sup>**</sup></li>
<li>两条曲线之间的面积<sup>**</sup></li>
</ol>
<p><sup>*</sup>用于各种机器学习任务的一般数学方法</p>
<p><sup>**</sup>我用来识别独特材料滞后响应的方法</p>
<p>首先让我们假设我们有两个完全相同的随机X-Y数据。请注意,所有这些方法都将返回零。如果没有,可以从pip安装similaritymeasures。在</p>
<pre><code>import numpy as np
from scipy.spatial.distance import directed_hausdorff
import similaritymeasures
import matplotlib.pyplot as plt
# Generate random experimental data
np.random.seed(121)
x = np.random.random(100)
y = np.random.random(100)
P = np.array([x, y]).T
# Generate an exact copy of P, Q, which we will use to compare
Q = P.copy()
dh, ind1, ind2 = directed_hausdorff(P, Q)
df = similaritymeasures.frechet_dist(P, Q)
dtw, d = similaritymeasures.dtw(P, Q)
pcm = similaritymeasures.pcm(P, Q)
area = similaritymeasures.area_between_two_curves(P, Q)
cl = similaritymeasures.curve_length_measure(P, Q)
# all methods will return 0.0 when P and Q are the same
print(dh, df, dtw, pcm, cl, area)
</code></pre>
<p>打印输出为
0.0,0.0,0.0,0.0,0.0,0.0
这是因为曲线P和Q完全相同!在</p>
<p>现在假设p和Q是不同的。在</p>
^{pr2}$
<p>打印输出为
0.107、0.743、37.69、21.5、6.86、11.8
根据每种方法量化P和Q的不同。在</p>
<p>现在有许多方法可以比较这两条曲线。我将从DTW开始,因为这已经在许多时间序列应用程序中使用,这些应用程序看起来像您上传的数据。在</p>
<p>我们可以用下面的代码直观地看到p和Q是什么样子。在</p>
<pre><code>plt.figure()
plt.plot(P[:, 0], P[:, 1])
plt.plot(Q[:, 0], Q[:, 1])
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/hf24M.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/hf24M.png" alt="Two random paths in the XY space"/></a></p>