【问题标题】:Unsupervised Clustering with Haskell使用 Haskell 进行无监督聚类
【发布时间】:2012-05-14 14:54:26
【问题描述】:

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

简单示例:

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 新手。任何建议将不胜感激。

【问题讨论】:

  • Erm,你能把你想要计算的东西弄得更清楚吗?我明白了大致的想法,但我不太确定您最终期望的数字是多少。也许你可以通过一个例子来运行?另外:当您的列表始终具有相同数量的元素并且每个元素的含义不同时,您实际上需要一个元组或代数数据类型。
  • 我基本上是在尝试开发一种无监督聚类算法,该算法可以找到并分组点坐标数据集之间的相似性。
  • 根据对象的在多个系列中的接近度来聚类对象并不常见。典型的情况是只有 unordered 个实例。

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


【解决方案1】:

好的,如果你有 1、2、3 以 the 顺序排列,那么你有计算邻近度的公式: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 在最后。

【讨论】:

  • 它的简洁性非常出色,它给了我一个起点。谢谢。
猜你喜欢
  • 2014-07-05
  • 2019-10-22
  • 2020-07-21
  • 2017-05-01
  • 2013-02-24
  • 2012-04-25
  • 2016-01-11
  • 2014-06-13
  • 2019-05-09
相关资源
最近更新 更多