【问题标题】:Nearest neighbor and pattern recognition with Haskell使用 Haskell 进行最近邻和模式识别
【发布时间】:2012-03-27 05:47:33
【问题描述】:

这是我拥有的 3 个数据集的简化版本:

Set A = [1, 1, 2, 2, 1, 2, 2, 1]
Set B = [2, 2, 1, 2, 2, 1, 1, 3]
Set C = [8, 4, 4, 4, 4, 9, 8, 4]

Haskell 是否有任何内置功能可用于查找数据集之间的未指定模式?我想在 2 个或更多数据集上运行我的程序,并让它报告哪些是相似的,在这种情况下,它们是 A 和 B。

【问题讨论】:

    标签: algorithm haskell pattern-matching cluster-analysis nearest-neighbor


    【解决方案1】:

    如果您不是在谈论寻找结果相交。

    对于每两个列表,我们可以使用来自Data.Listintersect 函数,该函数取它们的交集。

    所以,想法是计算所有列表的交集并对它们进行排序。

    > snd . last . sort $ [ (length $ intersect x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
    ([1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3])
    

    如果您有兴趣创建后交集,可以使用类似的方法:

    import Data.List (sort, subsequences)
    
    intersectCons :: (Ord a) => [a] -> [a] -> [a]
    intersectCons x y = snd . last . sort $
      [ (length x1, x1) | x1 <- subsequences x
                        , x2 <- subsequences y
                        , x1 == x2 ]
    

    例如:

    > intersectCons [1, 1, 2, 2, 1, 2, 2, 1] [2, 2, 1, 2, 2, 1, 1, 3]
    [2,2,1,2,2,1]
    

    我们还可以使用它来查找最相似的列表对:

    > snd . last . sort $ [ (length $ intersectCons x y, (x,y)) | let list = [[1,1,2,2,1,2,2,1],[2,2,1,2,2,1,1,3],[8,4,4,4,4,9,8,4]], x <- list, y <- list, x /= y ]
    ([2,2,1,2,2,1,1,3],[1,1,2,2,1,2,2,1])
    

    实际上,如果您不仅想获取一对列表,还想获取所有“相似”的对,您可以删除snd . last . sort $ 并获取所有列表。

    【讨论】:

    • 多么优雅的解决方案。感谢您的时间和帮助。
    猜你喜欢
    • 2011-02-14
    • 2019-01-03
    • 2014-02-23
    • 2015-12-06
    • 2011-06-30
    • 2023-03-17
    • 2017-07-11
    • 2016-03-06
    • 2015-03-18
    相关资源
    最近更新 更多