Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学习元素排序的算法(最好是Java)_Java_Algorithm_Sorting_Machine Learning - Fatal编程技术网

学习元素排序的算法(最好是Java)

学习元素排序的算法(最好是Java),java,algorithm,sorting,machine-learning,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 } 元素没有关于其自然顺序的信息。顺序应该从列表中学习,在某些情况下,列表中的顺序可能与其他列表相矛盾,因此我需要最可

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

例如:

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

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

如果您有任何建议,我们将不胜感激

谢谢


胡安

我认为你的问题与开发多人游戏玩家评级系统的问题非常相似。不幸的是,我看不到一个简单的答案,特别是考虑到你的数据量。我倾向于将N个元素的每个列表视为N-1个两人游戏,每个游戏记录一个玩家和列表上紧挨着他们的玩家之间的比赛。如果你能负担得起,你可以将每个列表视为N(N-1)/2个两人游戏,记录列表中的所有比较。在任何一种情况下,您都可以为两人游戏应用评级系统,例如

另一种方法是为任何排序的拟合优度写下惩罚函数,然后尝试最小化惩罚。有许多函数可以相互比较两个列表,例如s_rank_correlation_coefficient和。Kendall的秩相关只是基于成对比较的数量,如果你使用另一个列表作为预测,那么在一个列表中可能会出错,因此它可能有一些很好的特性。当您依次将整个列表与每个输入列表进行比较时,您可以确定您对整个列表的惩罚是您计算的所有惩罚的总和

将这种惩罚最小化的一种方法是,从随机排序开始,然后重复从排序中删除一个项目,并将其放回使惩罚函数最小化的位置,直到没有这样的更改改善问题为止。不幸的是,考虑到你的数据量,我认为你负担不起


如果你准备将你的数据转换成一个由实力未知的玩家进行的两人博弈的列表,那么你可以采取多种方法。如果用单个向量表示所有玩家的实力,例如(strengthA、strengthB、strengthC等),那么击败B的概率可能取决于该向量与向量(1,-1,0,…)的点积。这表明您可以尝试使用逻辑回归、基于感知器的模型或支持向量机找到合适的匹配项。

您确实有很多元素,但您的字典也很大吗?或者只是从a到z的字母?元素只是对象。唯一性由它们的哈希代码定义。上面的字母是一个很容易说明我试图解决的问题的例子,字母与实际元素无关。大约有260000个独特的元素。嗯。。。如果你能负担得起2GB的数据结构(假设你的散列值大约是4个字节),我会尝试对图进行拓扑排序,每个a->b连接的权重等于前一个带的次数,然后将该数据结构(某种散列或邻接列表)折叠到一个链表中,首先考虑重量较高的连接。这种贪婪的方法甚至可能使可能性最大化,而不需要机器学习。实际上,你必须同时存储a->b和b->a权重,但我认为你可以使用2字节甚至1字节的无符号整数。当崩溃时,你只需要取最大的一个(如果你的数据集是一致的,那么应该是一个很大的差异)谢谢-当然如果你准备把数据看作两人游戏的列表,有各种各样的ML方法来适应潜在的玩家优势-我已经编辑了我的答案来添加这一点。