使用非精确测量(模糊逻辑)查找一系列数据

时间:2011-11-07 20:40:38

标签: sql sql-server algorithm sql-server-2008 fuzzy-search

这是一个更复杂的后续问题:Efficient way to look up sequential values

每个产品可以包含多个细分行(数千个)。每个段都有位置列,每个产品(1,2,3,4,5等)从1开始,列可以包含任何值as(323.113,5423.231,873.42,422.64,763.1等)。数据是只读的。

将产品视为一首歌并将片段视为歌曲中的一组音符可能会有所帮助。

考虑到连续片段的子集,如歌曲的片段,我想确定产品的潜在匹配。但是,由于测量中可能存在错误,子集中的段可能匹配数据库中的段

如何通过查找 最匹配 我测量的细分子集的产品细分来识别候选产品?此外,数据库是此类数据的最佳媒介吗?

-

以下是关于我如何解决这个问题的一些想法。 请不要将这些视为完全正确的要求。 我对任何类型的算法都持开放态度,以尽可能做到最好。我认为需要有多个阈值变量来确定贴近度。一种可能性是实施接近度阈值和匹配阈值。

例如,给定以下值:

Product A contains these segments: 11,21,13,13,15.
Measurement 1 has captured: 20,14,14,15.
Measurement 2 has captured: 11,21,78,13.
Measurement 3 has captured: 15,13,21,13,11.

如果接近度阈值允许测量的段高于或低于实际段1,则测量1可能与产品A匹配,因为尽管许多段与完全匹配,它们在相对于实际值的接近阈值内。

如果匹配阈值允许匹配为3或更多的测量,则测量2可能返回产品A,因为尽管其中一个段(78)远远超过接近阈值,但它仍然匹配3以正确的顺序分段,因此在匹配阈值内。

测量3与产品A不匹配,因为尽管所有测量的段都存在于实际段中,但它们不在接近或匹配阈值内。

更新:其中一个答案要求我通过 最匹配 来定义我的意思。我不确定如何回答这个问题,但我会试着通过继续这首歌的比喻来解释。假设片段代表录制歌曲的最大频率。如果我再次录制同一首歌,它会有相似之处,但是由于背景噪音和录音设备的其他限制,有些频率会匹配,有些会很接近,有些会很接近。在这种情况下,您如何定义一个录音与另一个录音“匹配”的时间?这是我想要在这个问题中使用的那种匹配逻辑。

4 个答案:

答案 0 :(得分:3)

根据您发布的信息,这可以通过edmond的开花v完美匹配算法来解决。您可以最小化或最大化功能,它将始终找到最佳匹配。也许你可以使用带有2个循环的强力解决方案。关于edmond匹配算法的维基百科:http://en.wikipedia.org/wiki/Edmonds%27s_matching_algorithm

答案 1 :(得分:2)

您需要为“最匹配”提出定义。我不知道这里有谁可以帮助你,因为这里没有人会知道数据的业务要求或复杂性。你的两种方法声音合理,但我不知道它们是否真的存在。

至于数据库是否是这类数据的正确媒介,我会说数据库可能是数据的理想媒介,但它非常像 not 正确的媒介处理数据。是否可能将取决于你最终解决方案是什么构成“最匹配”。

快速说明一下,SSIS内置了一些模糊匹配功能来处理数据。我只是玩了几年,那是几年前的事情,所以我不知道它是否适用于你正在做的事情。

答案 2 :(得分:1)

您是否可以采取按位置匹配每个段位置的测量值并计算每个位置的差异的方法。然后沿一个位置滑动测量值并计算差值。然后找出哪个幻灯片位置得分最低。对每个产品执行此操作,然后您就知道测量结果与最接近的产品匹配。

测试表和数据:

CREATE TABLE [dbo].[Segment]
(
    [ProductId] INT,
    [Position] INT,
    [Value] INT
)

INSERT  [dbo].[Segment]
VALUES  (1, 1, 300),
        (1, 2, 5000),
        (1, 3, 900),
        (1, 4, 400),
        (1, 5, 800),

        (2, 1, 400),
        (2, 2, 6000),
        (2, 3, 1000),
        (2, 4, 500),
        (2, 5, 900),

        (3, 1, 400),
        (3, 2, 5400),
        (3, 3, 900),
        (3, 4, 400),
        (3, 5, 900)

CREATE TABLE #Measurement
(
    [Position] INT,
    [Value] INT
)

INSERT  #Measurement
VALUES  (1, 5400),
        (2, 900),
        (3, 400)

如您所见,测量结果恰好与第三个产品的一部分匹配。

一些助手:

CREATE TABLE #ProductSegmentCount
(
    [ProductId] INT,
    [SegmentCount] INT
)

INSERT #ProductSegmentCount
SELECT [ProductId], MAX([Position])
FROM [dbo].[Segment]
GROUP BY [ProductId]

DECLARE @MeasurementSegmentCount INT = (SELECT MAX([Position]) FROM #Measurement)

递归公用表表达式,用于显示按最接近匹配排序的产品:

;WITH [cteRecursive] AS
(
    SELECT  s.[ProductId],
            0 AS [RecursionId],
            m.[Position] AS [MeasurementPosition],
            s.[Position] AS [SegmentPosition],
            ABS(m.[Value] - s.[Value]) AS [Difference]
    FROM #Measurement m
    INNER JOIN [dbo].[Segment] s 
        ON m.[Position] = s.[Position]
    UNION ALL
    SELECT s.[ProductId],
            [RecursionId] + 1 AS [RecursionId],
            m.[Position],
            s.[Position],
            ABS(m.[Value] - s.[Value]) AS [Difference]
    FROM [cteRecursive] r
    INNER JOIN #Measurement m
        ON m.[Position] = r.[MeasurementPosition]
    INNER JOIN [dbo].[Segment] s 
        ON r.[ProductId] = s.[ProductId]
        AND m.[Position] + (r.[RecursionId]) = s.[Position]
    INNER JOIN #ProductSegmentCount psc
        ON s.[ProductId] = psc.[ProductId]
    WHERE [RecursionId] <= ABS(@MeasurementSegmentCount - psc.[SegmentCount])
)-- select * from [cteRecursive] where [ProductId] = 3 order by RecursionId, SegmentPosition
, [cteDifferences] AS
(
    SELECT [ProductId], [RecursionId], SUM([Difference]) AS [Difference]
    FROM [cteRecursive]
    GROUP BY [ProductId], [RecursionId]
)-- select * from [cteDifferences]
SELECT [ProductId], MIN([Difference]) AS [Difference]
FROM [cteDifferences] 
GROUP BY [ProductId]
ORDER BY MIN([Difference])
OPTION (MAXRECURSION 0)

答案 3 :(得分:1)

如果从字面上看你的歌曲示例,一种方法是将您的输入归结为位矢量指纹,然后在数据库中查找该指纹​​作为完全匹配。您可以通过从输入中提取多个指纹和/或尝试例如尝试来增加找到匹配的机会。所有比特向量只有1或比特错误的指纹。

如果可以访问到ACM数字库中,可以在ACM读这种在“The沙札姆音乐识别服务”的方法的描述= 1321038137_73cd62cf2b16cd73ca9070e7d5ea0744" &GT; HTTP://delivery.acm.org/10.1145/ ?一百十四万五千三百十二分之一百十五万/ P44-wang.pdf IP = 94.195.253.182&安培; ACC = ACTIVE%20SERVICE&安培; CFID = 53180383&安培; CFTOKEN = 41480065&安培;的 ACM = 1321038137_73cd62cf2b16cd73ca9070e7d5ea0744还有一些信息{{。 3}}。

您描述的输入格式表明您可以使用http://www.music.mcgill.ca/~alastair/621/porter11fingerprint-summary.pdf中描述的随机投影方法执行某些操作。

要回答第二个问题,根据确切位置的对应关系,您可以考虑将数字简化为散列由位或字符组成的指纹,并将其存储在文本搜索数据库中,例如Apache Lucene。 / p>