使用整数比较的近似匹配

时间:2015-10-11 00:06:51

标签: regex pattern-matching regex-greedy approximation

我正在寻找一种能够将保存的模式与当前模式匹配的算法,即使它不完全相同。例如,保存的模式x0, 400, 900, 1500, 2000,当前模式y0, 300, 800, 1300, 1800

是否存在可以匹配xy的算法,即使它们不是完全匹配的?

或者我是否需要应用一组距离,如果xy的差异为<=到距离,则设置为true否则{ {1}}?

这是一个爆震检测门锁。 falsex的值是敲击之间的时间间隔。我想要一种能够将当前模式逼近保存模式的算法,即使它不是完全匹配的。因为在敲击的特定时间间隔内难以重复相同的敲击。

2 个答案:

答案 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。如果您的参考模式很少(可能只有一个?),则无需复杂的解决方案。

您可以考虑欧几里德或曼哈顿距离。

从参考测试集中,您应该确定什么是匹配,以及为了定义容差阈值而不是什么。