我正在尝试计算包含在numpy数组中的多个时间序列之间的成对距离。请参见下面的代码
print(type(sales))
print(sales.shape)
<class 'numpy.ndarray'>
(687, 157)
因此,sales
包含长度为157的687个时间序列。使用pdist计算时间序列之间的DTW距离。import fastdtw
import scipy.spatial.distance as sd
def my_fastdtw(sales1, sales2):
return fastdtw.fastdtw(sales1,sales2)[0]
distance_matrix = sd.pdist(sales, my_fastdtw)
---编辑:尝试不使用pdist()
函数实现-----
distance_matrix = []
m = len(sales)
for i in range(0, m - 1):
for j in range(i + 1, m):
distance_matrix.append(fastdtw.fastdtw(sales[i], sales[j]))
---编辑:并行化内层for循环-----
from joblib import Parallel, delayed
import multiprocessing
import fastdtw
num_cores = multiprocessing.cpu_count() - 1
N = 687
def my_fastdtw(sales1, sales2):
return fastdtw.fastdtw(sales1,sales2)[0]
results = [[] for i in range(N)]
for i in range(0, N- 1):
results[i] = Parallel(n_jobs=num_cores)(delayed(my_fastdtw) (sales[i],sales[j]) for j in range(i + 1, N) )
所有方法都非常缓慢。并行方法需要大约12分钟的时间。请问有没有人能提出一种高效的方法?
---编辑:按照下面答案中提到的步骤进行操作---
这是lib文件夹的样子:
VirtualBox:~/anaconda3/lib/python3.6/site-packages/fastdtw-0.3.2-py3.6- linux-x86_64.egg/fastdtw$ ls
_fastdtw.cpython-36m-x86_64-linux-gnu.so fastdtw.py __pycache__
_fastdtw.py __init__.py
所以,这里有一个Cython版本的fastdtw。在安装过程中,我没有收到任何错误。即使现在,在我的程序运行期间按下CTRL-C
,我也可以看到纯Python版本正在使用(fastdtw.py
):
/home/vishal/anaconda3/lib/python3.6/site-packages/fastdtw/fastdtw.py in fastdtw(x, y, radius, dist)
/home/vishal/anaconda3/lib/python3.6/site-packages/fastdtw/fastdtw.py in __fastdtw(x, y, radius, dist)
代码仍然像以前一样慢。
pdist
关于提供自己的函数的说明。注意它调用该函数的次数。fastdtw
产生什么结果?dm
中的项目是什么?我认为pdist
期望从距离函数获得一个简单的数字。 - hpauljfastdtw
都会产生一个浮点数,这个浮点数是pdist所需的距离,它还返回一条路径。请查看我的更新帖子。 - user1274878pdist
在给定Python函数时执行了相同类型的迭代。只有在使用自己编译的度量标准之一时,它才会更快。任何速度上的改进都必须来自于fastdtw
端。 - hpaulj