使用Haskell进行无监督聚类

时间:2012-05-05 06:12:49

标签: haskell functional-programming pattern-matching cluster-analysis unsupervised-learning

我正在尝试开发一种算法,该算法可以报告数据集之间出现类似模式的频率和接近程度。

简单示例:

set1 = [0, 1, 0, 0, 2, 0, 0, 3, 0]
set2 = [1, 2, 3, 0, 0, 0, 0, 0, 0]
set3 = [0, 0, 0, 0, 0, 1, 2, 0, 3]

这些集合中的每一个都有1,2和3,但这些数字在set2和set3中更接近。

我怀疑我可以用列表推导完成这项任务。我可以将数据绘制到变量x和y中,并将每个匹配编入一个列表列表,其中一个嵌入列表中的第一个元素是找到的匹配项的字符串,第二个和第三个元素是它们的位置。我可以通过另一个函数运行此列表,该函数计算这些匹配发生的频率和接近程度,并报告一个百分比。

或许还有一种更优雅的方法可以做到这一点?

我仍然是Haskell新手。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

好吧,如果你在 顺序中设置了1,2,3,那么你有计算接近度的公式:prox = indexOf 3 - indexOf 1 - 2.所以,prox是总数为1..2和2..3之间的零。你可以写在Haskell:

prox :: [Integer] -> Int
prox s = i3 - i1 - 2
  where
    Just i3 = findIndex (==3) s
    Just i1 = findIndex (==1) s

您可以针对这种情况进行概括,而不必假设1先行,3则是最后一次。