我试图在不使用任何实质性优化技术的情况下,用C简单实现DTW算法。我正在尝试将此实现用于一些简单的草图识别,也就是说,从集合中找到给定草图的k个最接近的邻居。我得到了一些对我来说似乎很奇怪的结果,我想知道这是因为我的dtw实现。我需要有人来验证我的算法。
正如我所说,我正在尝试找到k个最邻近的邻居,因此,我实施以加快计算速度的唯一“优化”是,如果计算出的给定线的最小成本在任何点上都大于最大距离在当前被认为是最接近的邻居的k个草图之间,我停止计算并返回+ inf。
这是对应的算法:
(returnValue totalCost) dtw(sketch1, sketch2, curMaxDist){
distMatrix = 'empty matrix of size (sketch.size) x (sketch2.size)'
totalCostMatrix = 'empty matrix of size (sketch1.size) x (sketch2.size)'
for(i = 0 to sketch1.size - 1){
for(j = 0 to sketch2.size - 1){
distMatrix[i][j] = euclidianDistance(sketch1.point[i], sketch2.point[j])
totalCostMatrix[i][j] = +inf
}
}
//I am forcing the first points of each sketch to correspond to one
// and continue applying the algorithm from the next points.
for(i = 1 to sketch1.size - 1){
curMinDist = +inf
for(j = 1 to sketch2.size - 1){
totalCostMatrix[i][j] = min(totalCostMatrix[i-1][j-1],
totalCostMatrix[i-1][j],
totalCostMatrix[i][j-1]) + distMatrix[i][j]
if(totalCostMatrix[i][j] < curMinDist)
curMinDist = totalCostMatrix[i][j]
}
if(curMinDist > curMaxDist)
return +inf
}
return totalCostMatrix[sketch1.size - 1][sketch2.size - 1]
}
我确信就语法,C语言等而言,实现方面没有任何错误,因为我已经检查了这一点,并且始终能得到预期的结果。如果算法背后的原因出了问题,我只是在徘徊。我问这是因为它是一种非常知名的算法,而且是一种非常简单的实现,因此也许有人很容易发现那里的错误。