学习元素排序的算法(理想情况下是Java)

时间:2017-05-25 03:14:27

标签: java algorithm sorting machine-learning

我有许多有序列表,大多数都包含相同的元素。我想从列表(样本)中找到最可能的元素顺序。

示例:

l1={ a, b, f, h, z }
l2={ c, e, h, x, z }
l3={ a, e, y, z }
l4={ b, e, f, z }

结果应为:

R={a, b, c, e, f, h, x, y, z}; or 
R={ a,b,c,e,f,h,y,x,z }

元素没有关于其自然顺序的信息。应该从列表中学习订单,在某些情况下,列表中的订单可能与其他列表相矛盾,因此我需要最可能的订单。 我有大约175,000个列表,大约180万个元素(总数,260k唯一),每个列表的元素数量各不相同。

我已经尝试构建有向图,其中边具有以这种顺序连接顶点的列表数,然后遍历所有路径以找到最可能的序列。这种方法适用于小问题,但对于这么大的问题来说这太复杂了。

请指点,非常感谢。

感谢。

1 个答案:

答案 0 :(得分:3)

我认为你的问题非常类似于为多人游戏开发玩家评分系统。不幸的是,我没有看到一个简单的答案,特别是考虑到你的数据量。我倾向于将N个元素的每个列表视为N-1个双人游戏,每个游戏记录一个玩家和列表上方的玩家之间的竞赛。如果你负担得起,你可以将每个列表视为N(N-1)/ 2个双人游戏,记录列表中的所有比较。在任何一种情况下,您都可以为双人游戏应用评分系统,例如https://en.wikipedia.org/wiki/Elo_rating_system

另一种方法是为任何排序的拟合优度写下惩罚函数,然后尝试最小化惩罚。有许多功能可以将两个列表相互比较,例如https://en.wikipedia.org/wiki/Spearman' s_rank_correlation_coefficient和https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient。 Kendall的排名相关性仅仅是基于成对比较的数量,如果您将另一个用作预测变量,则会在一个列表中出错,因此它可能具有一些不错的属性。您可以决定对整体列表的处罚是您在依次将整体列表与每个输入列表进行比较时计算的所有惩罚的总和。

最小化这种惩罚的一种方法是从随机排序开始,然后重复从排序中删除一个项目并将其放回到最小化惩罚函数的任何地方,直到没有这样的改变改善了事项。不幸的是,考虑到你的数据量,我认为你无法承受这一点。

如果您准备将数据转换为未知优势的玩家之间的双人游戏列表,那么您可以采取多种方法。如果你通过单个向量表示所有玩家的优势,例如(strengthA,strengthB,strengthC,...)那么A击败B的概率可能取决于该向量与向量的点积(1, - 1,0,......)。这表明您可以尝试使用逻辑回归,基于感知器的模型或支持向量机来找到合适的结果。