簡體   English   中英

Haskell最近的鄰居和模式識別

[英]Nearest neighbor and pattern recognition with Haskell

這是我擁有的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。

如果您不是在談論尋找結果相交處。

對於每兩個列表,我們可以使用Data.List intersect函數,將它們相交。

因此,想法是計算所有列表的交集並對它們進行排序。

> 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 $ snd . last . sort $ snd . last . sort $並全部獲取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM