sub*_*ray 1 algorithm haskell cluster-analysis pattern-matching nearest-neighbor
这是我拥有的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]
Run Code Online (Sandbox Code Playgroud)
Haskell是否具有用于在数据集之间查找未指定模式的任何内置功能?我想在2个或更多数据集上运行我的程序,并让它报告哪些数据类似,在这种情况下,它们将是集合A和B.
如果你不是在谈论找到相应的交叉点.
对于每两个列表,我们可以使用intersect函数from Data.List,它们需要交集.
所以,想法是计算所有列表的交集并对它们进行排序.
> 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])
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣建立相应的交叉点,您可以使用类似的东西:
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 ]
Run Code Online (Sandbox Code Playgroud)
例如:
> intersectCons [1, 1, 2, 2, 1, 2, 2, 1] [2, 2, 1, 2, 2, 1, 1, 3]
[2,2,1,2,2,1]
Run Code Online (Sandbox Code Playgroud)
我们也可以用它来寻找最相似的一对列表:
> 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])
Run Code Online (Sandbox Code Playgroud)
实际上,如果您不仅要获得一对列表,而且要获得"相似"的所有对,则可以删除snd . last . sort $并获取所有这些列表.