寻求技术支持,将一个python函数改写为ddb中可以在状态引擎里使用的函数

def DTWDistance(s1, s2):
    DTW = {}
    for i in range(len(s1)):
        DTW[(i,-1)] = float('inf') #初始化
    for j in range(len(s2)):
        DTW[(-1,j)] = float('inf')
    
    DTW[(-1,-1)] =0
    print(DTW)
    for i in range(len(s1)):
        for j in range(len(s2)):
            dist = (s1[i]-s2[j])**2
            DTW[(i,j)] = dist+min(DTW[(i-1,j)],DTW[(i,j-1)],DTW[(i-1,j-1)])
    return np.sqrt(DTW[len(s1)-1,len(s2)-1])


具体动态时间规整算法(DTW)可以百度,实现代码如上

现需要改成ddb中可以在状态引擎里使用的函数,谢谢。

请先 登录 后评论

2 个回答

peter
def index(i, j){return string(i) + "," +string(j)}
def DTWDistance(s1, s2){
    inf = 999999999999
    DTW = dict(STRING, DOUBLE)
    sizeS1 = size(s1)
    sizeS2 = size(s2)
    for(i in 0:(sizeS1)) DTW[index(i, -1)] = inf
    for(j in 0:(sizeS2)) DTW[index(-1, j)] = inf
   
    DTW["-1,-1"] =0
    print(DTW)
    for (i in 0:(sizeS1)){
        for (j in 0:(sizeS2)){
            dist = square(s1[i]-s2[j])
            DTW[index(i, j)] = dist+min([DTW[index(i-1, j)], DTW[index(i, j-1)],  DTW[index(i-1, j-1)]])
        }
    }
    print(DTW)
    return sqrt(DTW[index(s1.size()-1, s2.size()-1)])
}



s1 = 1..10
s2 = 1..5
DTWDistance(s1, s2) //497.05

请先 登录 后评论
wfHuang
@jit
def DTWDistance2(s1, s2){
    inf = 999999999999
    size1=size(s1)
    size2=size(s2)
    if(size1 * size2 < 0){
        return -1.0 //overflow
    }
    dtw = array(DOUBLE, size1*size2)

    for(i in 0:size(s1)) dtw[i*size2] = inf
    for(j in 0:size(s2)) dtw[j*size1] = inf
    dtw[0]=0
   
    for (i in 1:size(s1)){
        for (j in 1:size(s2)){
            dist = square(s1[i]-s2[j])
            dtw[i*size2+j]= dist+min([dtw[(i-1)*size2+j], dtw[i*size2+j-1], dtw[(i-1)*size2+j-1]])
        }
    }
    //print(dtw)
    return sqrt(dtw[(size1-1)*size2 + size2-1])
}
s1=1..1000
s2=1..5000
DTWDistance2(s1, s2)
请先 登录 后评论
  • 2 关注
  • 1 收藏,910 浏览
  • ddbuserex 提出于 2022-10-18 13:50

相似问题