【问题标题】:Approximate match using integer comparison使用整数比较的近似匹配
【发布时间】:2016-01-08 16:49:19
【问题描述】:

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

有没有一种算法可以匹配xy,即使它们不完全匹配?

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

这是一个敲门检测门锁。 xy 的值是敲击之间的时间间隔。我想要一种算法,即使它不是完全匹配,也可以将当前模式近似为保存的模式。因为很难以特定的敲击时间间隔重复相同的敲击。

【问题讨论】:

  • 我们需要更多信息才能尝试回答您。我现在只能说正则表达式 单独 无法满足您的需求。
  • 我想要一个算法,可以比较 x 和 y 的值,如果 Y 的值接近 X 的值,系统就会认为是真的。
  • 忘记所有关于使用正则表达式的事情,您使用数组和限制值的想法要好得多。
  • 顺便说一句,我完成了我的项目与你的想法。非常感谢。 :)

标签: regex pattern-matching regex-greedy approximation


【解决方案1】:

这看起来像是最近邻搜索的情况,基于 5D 连续空间中的距离函数。看看那里:https://en.wikipedia.org/wiki/Nearest_neighbor_search。如果您的参考模式很少(可能只有一个?),则无需复杂的解决方案。

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

从参考测试集中,您应该确定哪些被视为匹配,哪些不匹配,以便定义容差阈值。

【讨论】:

  • 顺便说一句,我完成了我的项目与你的想法。非常感谢。 :)
  • @Genio21:很高兴知道。
【解决方案2】:

如果我正确理解你想要什么,我建议你简单地计算每个敲门的预期时间和实际时间之间的总差异。正则表达式和字符串距离算法(如 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)

绝对方法只是所有预期和实际敲击之间的总(毫秒?)差异。在相对方法中,脚本计算每个爆震对的相对误差,使其与预期爆震数成正比。

【讨论】:

  • 顺便说一句,我完成了我的项目与你的想法。非常感谢。 :)
  • @Genio21:很高兴收到您的来信,考虑接受您认为正确的答案或报告您的答案以供将来参考!
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多