我正在寻找一种能够将保存的模式与当前模式匹配的算法,即使它不完全相同。例如,保存的模式x
为0, 400, 900, 1500, 2000
,当前模式y
为0, 300, 800, 1300, 1800
。
是否存在可以匹配x
和y
的算法,即使它们不是完全匹配的?
或者我是否需要应用一组距离,如果x
和y
的差异为<=
到距离,则设置为true
否则{ {1}}?
这是一个爆震检测门锁。 false
和x
的值是敲击之间的时间间隔。我想要一种能够将当前模式逼近保存模式的算法,即使它不是完全匹配的。因为在敲击的特定时间间隔内难以重复相同的敲击。
答案 0 :(得分:1)
如果我理解正确你想要什么,我建议你简单地计算每个敲击的预期和实际时间之间的总差异。正则表达式和字符串距离算法(例如Levenshtein距离)都不能为您提供更准确的结果。
下面的这个小python脚本使用绝对和相对方法(它已经考虑也缺少actualKnocks
):
#!/usr/bin/python
expectedKnocks = [0, 400, 900, 1500, 2000]
actualKnocks = [0, 300, 800, 1300, 1800]
# absolute approach
tolerance = 500
totalDifference = 0
# relative approach
relativeTolerance = 0.15 # 15%
errorRate = 0
for (i, item) in enumerate(expectedKnocks):
if i < len(actualKnocks):
totalDifference += (item - actualKnocks[i])
if (item > 0):
errorRate += (totalDifference / float(item))/len(expectedKnocks)
else:
totalDifference += item
errorRate += 100.0 / len(expectedKnocks)
if (totalDifference <= tolerance):
print "[Absolute] OK, come in.", # ',' prevent newline
else:
print "[Absolute] Go away!",
print "Absolute time diff %s under %s" % (totalDifference, tolerance)
if (errorRate <= relativeTolerance):
print "[Relative] OK, come in.",
else:
print "[Relative] Go away!",
print "Relative time diff %.2f%% under %s%%" % (errorRate, relativeTolerance)
绝对方法只是所有预期和实际敲击之间的总(ms?)差异。在相对方法中,脚本计算每个爆震对的相对误差,使其与预期的爆震数成比例。
答案 1 :(得分:0)
这看起来像是基于5D连续空间中的距离函数的最近邻搜索的情况。看看那里:https://en.wikipedia.org/wiki/Nearest_neighbor_search。如果您的参考模式很少(可能只有一个?),则无需复杂的解决方案。
您可以考虑欧几里德或曼哈顿距离。
从参考测试集中,您应该确定什么是匹配,以及为了定义容差阈值而不是什么。