[英]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.