基于Haskell的无监督聚类

基于Haskell的无监督聚类,haskell,functional-programming,pattern-matching,cluster-analysis,unsupervised-learning,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,但这些数字在集合2中和集合3中更接近 我想我可以通过理解列表来完成这项任务。我可以将数据绘制到变量x和y中,并将每个匹配项分类到列表中,其中一个嵌入列表中的第一个元素

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

简单的例子:

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,但这些数字在集合2中和集合3中更接近

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

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


我还是个哈斯克尔新手。任何建议都将不胜感激。

好的,如果按顺序有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在后。

Erm,你能把你想要计算的东西弄清楚吗?我知道大概的意思,但我不太确定你到底期望得到什么数字。也许你可以举出一个例子?另外:当你有一个列表,它总是有相同数量的元素,并且每个元素的含义不同,你实际上需要一个元组或代数数据类型。我基本上是在尝试开发一个无监督的聚类算法,可以发现点坐标数据集之间的相似性并对其进行分组的东西。在多个系列中,根据对象的接近程度对其进行聚类是不常见的。典型的情况是只有无序的实例,这在简单性方面非常出色,这给了我一个起点。非常感谢。