一种基于机器学习模型的排序方法与流程

文档序号:16734731发布日期:2019-01-28 12:32阅读:181来源:国知局
一种基于机器学习模型的排序方法与流程

本发明涉及排序算法/系统和机器学习模型领域,具体涉及一种基于机器学习模型的排序方法。



背景技术:

排序算法作为经典算法在各类软件开发中都有非常高的使用频率,甚至是在今年来较为火热的聚类分析、机器学习、推荐算法等人工智能领域的基础算法之一。从排序问题提出至今,研究人员和工程人员对排序算法进行了全方位的改进,但是其理论时间复杂度一直停滞在o(nlogn)。随着大数据和机器学习的兴起,计算机需要处理的数据量也越来越大,已有的排序算法难以适应。目前来说对排序算法的优化仅停留在实际运行时间的减少,并没有对理论时间和最坏时间进行进一步优化。目前来说,快速排序和归并排序作为应用较为广泛的排序算法之一,在众多学者和工程师的研究和优化后可以使得大部分的排序过程的时间消耗略微低于理论时间复杂度o(nlogn),效果并不是很理想,没有达到质的改变。

分布模型是由分布函数来表示的一种模型,分布函数既可以是基本函数也可以是不能用解析式表达的抽象函数。目前常见的分布有均匀分布、正态分布、指数分布、二项分布等都是能用解析式表达的分布函数,但是在实际的数据中几乎没有数据是完全符合已知的分布模型且难以用解析式表示。因此通过一般编码的方式难以获得数据的分布情况,可以通过机器学习相关理论和工具来完成对分布函数的拟合和估算。



技术实现要素:

为了解决上述技术问题,本发明提供一种新的排序方法,通过数据分布模型对待排元素在有序数组中的位置进行预测,然后根据元素预测位置将元素放入有序数组从而完成排序操作。这种方法极大的提高了运行的时间效率,且稳定性很强。

为了实现上述技术目的,本发明的技术方案是:

一种使用机器学习模型的排序方法,包括以下步骤:

步骤1):根据待排元素集构建频率分布直方图,并基于直方图中每个区间的值和区间高度分别生成两个序列,将两个序列中的元素分别一一对应形成键值对并汇总为一个集合,来作为数据分布模型的训练数据;

步骤2):先利用单调投影方法对模型的单调性和模型函数的取值区间进行约束,基于上述约束生成初始随机模型,然后使用步骤1)获得的训练数据对初始随机模型进行训练,训练完成后得到数据分布模型;

步骤3):将待排元素集中的元素输入步骤2)获得的数据分布模型,并基于模型输出和待排元素集规模来预测待排元素集中每一个元素在有序数组中的位置;

步骤4):根据步骤3)中获得的预测位置,将各个元素放置在有序数组中。

所述的方法,步骤1)包括以下步骤:

步骤1.1):获得待排元素集规模为n,以横坐标代表待排元素的值,纵坐标代表整个待排元素集在该数值区间的元素个数,构建待排序元素集的频率分布直方图;

步骤1.2):将频率直方图中每个区间的最右侧的值依次汇总形成序列k,将每个区间的高度依次汇总形成序列v;

步骤1.3):针对序列v中的第i项,计算从第一项到该项的和,再将这个和值除以n,从而形成序列s,序列s中第i项的vi计算式为:

步骤1.4):将序列k和序列s中的元素按下标顺序一一对应,形成键值对,将这些键值对汇总成集合d作为训练数据,集合d的表达数如下:

d={(ki,si)|0≤i≤n}。

所述的方法,在步骤2)中,数据分布模型需满足单调不递减且模型函数取值范围为[0,1],在对模型的性质进行了限制后才能进行模型的构建,包括以下步骤:

步骤2.1):利用单调投影设置输入维度的单调性,并将模型的取值范围设置为[0,1];

步骤2.2):使用由权利要求1构建出的训练数据,生成一个初始随机模型,然后将训练数据输入输入模型并获得模型的输出值,计算模型的输出值与训练数据中的输出数据的误差,若误差在指定误差范围内则模型构建完毕,否则,继续迭代训练数据对模型进行调整。

所述的方法,步骤3)包括以下步骤:

将待排元素依次输入数据分布模型,并将获得的模型输出值与待排元素集规模的乘积作为元素的预测位置,即模型输出值与最终得到的有序数组的长度的乘积为元素的预测位置。

所述的方法,在步骤4)中,还包括分别构建两个由数组实现的索引结构,并分别用于待排元素和待放位置,以解决由于多个待排元素拥有相同预测位置而导致的冲突的步骤:

步骤4.1):针对每个待排元素构建一个next数组形成的索引,用来指向与该待排元素有相同预测位置的前一个待排元素;然后,针对每一个可能的预测位置构建一个head数组形成的索引,用来指向该预测位置对应的最后一个待排元素;

步骤4.2):根据步骤3)产生的待排元素的预测位置,对待排元素的索引和待放位置的索引进行更新和维护;

步骤4.3):依次遍历待放位置的索引,并循环递归每个待排元素的索引,将索引到的待排元素依次放入结果数组,结果数组即为有序数组。

所述的方法,所述的步骤4.2)中,以任一待排元素c的预测位置为p,则对索引结构的维护包括以下步骤:

如果head数组中序号p的单元没有值,则只维护head数组,将head数组中序号p的单元直接指向数组序号为i的元素,于是head[p]被赋值为i;

如果head数组中序号p的单元有值,则先维护next数组再维护head数组,先将next数组序号为i的单元指向前一个预测位置也是p的元素,将next[i]赋值为head[p],再将head数组中序号p的单元直接指向数组序号为i的元素,也就是将head[p]赋值为i。

所述的方法,所述的步骤4.3)包括以下步骤:

根据索引结构依次放置元素,依次访问每一个预测位置,也就是head数组中每一个单元,先将head数组中某个单元指向的元素放入结果数组,接着通过next数组将与该元素串联在一起的其他元素依次放入结果数组,得到的结果数组即有序数组。

本发明的技术效果在于,采用本发明提出的排序算法,其运行时间消耗更短。本发明提出的排序算法是一种非基于比较的排序算法,非基于比较的排序算法的理论时间复杂度最低为o(n),而基于比较的排序算法理论时间复杂度最低是o(nlogn)。本发明提出的排序算法时间复杂度为o(rn),其中n是数据规模,r是数据平均重复度,在稀疏数据中的时间复杂度可看为o(n)。

本发明提出的排序算法运行时间更加稳定。目前常用的算法对待排元素出现的顺序非常敏感,待排元素集中的元素以不同顺序出现时,已有的排序算法在运行时间上会有较大差异。而这种情况对本发明提出的排序算法没有任何影响。因此本发明提出的排序算法具备良好的稳定性。

本发明提出的排序算法更易部署在分布式系统。在整个排序过程中,每个元素的操作对其他元素没有任何影响,在分布式系统中,只需将整个数据简单的切分成多个小块由不同的设备进行位置预测和放置,最后进行汇总合并即可完成排序工作。

附图说明

图1是本发明流程图;

图2是构建训练数据示意图;

图3是用于解决放置冲突的存储结构示意图;

图4是利用存储结构将元素放入有序数组的示意图。

具体实施方式

为使本发明的目的、设计思路和优点更加清楚,以下结合具体实例,并参照附图,对本发明作进一步详细说明。

本发明提供了一种基于机器学习模型的排序算法,包括以下步骤:1)根据待排元素集生成数据分布模型的训练数据;2)根据获得的训练数据构建数据分布模型;3)根据数据分布模型来预测待排元素集中每一个元素在有序数组中的位置;4)根据获得的预测位置,将各个元素放置在有序数组中。

其中步骤1):由待排元素集生成数据分布模型的训练数据。获得待排元素集规模为n,构建待排序元素集的频率分布直方图。将频率直方图中每个区间的最右侧的值依次汇总形成序列k,将每个区间的高度依次汇总形成序列v。针对序列v中的每一项,计算从第一项到该项的和,再将这个和值除以n,从而形成序列s。将序列k和序列s中的元素一一对应,形成键值对。将这些键值对汇总成集合d,集合d就是训练数据。

步骤2):构建数据分布模型。利用先验知识对模型进行约束。先验知识就是我们事先就知道的模型特点,例如在数据分布模型中,模型是单调不递减的且模型的取值范围是[0,1]就是先验知识。对数据分布模型的单调性和取值范围进行约束后,生成一个随机初始模型,先将训练数据的输入数据输入模型得到输出值,再根据输出值和训练数据中的输出数据进行对比并计算误差,根据计算得到的误差对模型进行调整。通过不断的迭代训练数据来对模型进行调整,直到计算出的误差值在指定的接受范围内。

步骤3):使用数据分布模型来预测待排元素集中每一个元素在有序数组中的位置。将待排元素集依次输入数据分布模型,模型的输出乘以待排元素集规模就是该元素的预测位置。

步骤4):根据获得的预测位置,将各个元素放置在有序数组中。最终的有序数组就是待排元素的排序结果。

进一步的,在步骤4)中,由于可能会有多个元素的值相同从而导致它们有相同的预测位置。这会使得在将元素放置到有序数组的过程中可能会发生冲突。我们提供了一种存储结构来解决冲突的问题。首先,针对每个元素构建一个索引,用来指向与该元素有相同预测位置的前一个元素。然后,针对每一个可能的预测位置构建一个索引,用来指向该预测位置对应的最后一个元素。最后将元素放入有序数组时需要一次访问每一个预测位置,将预测位置索引到的元素和通过该元素迭代索引到的其他元素依次放入有序数组。

下面对本发明的方法涉及的关键步骤进行逐一详细说明,具体步骤如下所示:

步骤一,根据待排元素集生成数据分布模型的训练数据。主要包含以下工作:构建待排元素集的频率分布直方图,如图2(a)所示,横坐标代表待排元素的值,纵坐标代表了整个待排元素集在该区间的元素个数。将频率分布图各个区间的高度进行累加,得到图2(b),其中,蓝色部分代表的值与图2(a)对应区间的值相等,橙色部分的值是该区间左侧所有区间的高度和。取图2(b)中的每个区间最右侧点的横坐标作为训练数据输入数据,将图2(b)中每个区间整体高度对应的元素个数占待排元素集中元素总个数的比例作为训练数据的输出数据。

步骤二,构建数据分布模型。主要包含以下工作:利用单调投影方法对模型的单调性和模型函数的取值区间进行约束。生成一个初始随机模型,然后将训练数据输入输入模型并获得模型的输出值,计算模型的输出值与训练数据中的输出数据的误差,若误差在指定误差范围内则模型构建完毕,否则,继续迭代训练数据对模型进行调整。

步骤三,获得待排元素的预测位置。主要包括以下工作:将待排元素依次输入数据分布模型,将获得的模型输出值与待排元素集规模的乘积作为元素的预测位置。也就是模型输出值与最终有序数组长度的乘积是元素的预测位置。

步骤四,根据待排元素的预测位置构建索引结构。主要包括以下工作:

1)构建索引结构。假设待排元素集中各个元素的值分别为3,4,8,7,4,8,4。索引结构示意图如图3所示,待排元素集的序号表示了该元素在元素集中出现的位置;head数组是预测位置的索引,其序号表示预测位置的值,例如head[3]表示预测位置为3的索引;next数组是每个元素的索引,其序号表示元素序号,例如,next[4]是序号为4的元素的索引。假定待排元素集中数组序号为i的元素的预测位置是p,我们分两种情况对索引结构进行维护:

如果head数组中序号p的单元没有值。这意味着在排元素集的第i个元素之前没有元素的预测位置是p,因此我们只需要维护head数组,将head数组中序号p的单元直接指向数组序号为i的元素,于是head[p]被赋值为i。

如果head数组中序号p的单元已经有值了。这意味着在待排元素集的第i个元素之前有其他元素的预测位置也是p,我们需要先维护next数组才能维护head数组。先将next数组序号为i的单元指向前一个预测位置也是p的元素,由于head[p]已经记录了前一个预测位置是p的元素的数组序号,因此将next[i]赋值为head[p]。再将head数组中序号p的单元直接指向数组序号为i的元素,也就是将head[p]赋值为i。

2)根据索引结构依次放置元素。如图4所示,依次访问每一个预测位置,也就是head数组中每一个单元,先将head数组中某个单元指向的元素放入结果数组,紧接着通过next数组将与该元素串联在一起的其他元素依次放入结果数组。在图4中,首先访问head数组中序号为0的单元,由于head[0]的值是0,因此将待排元素集中数组序号为0的元素放入结果数组;然后访问head数组序号为3的单元,因为head[3]的值是6,所以将待排元素集中数组序号为6元素也放入结果数组,由于next数组中序号为6的单元有值且值为4,这意味着有待排元素中序号为4的元素的预测位置也是3,因此将待排元素集中序号为4的元素也放入结果数组,又由于next数组中序号为4的单元有值且值为1,这意味着有待排元素中序号为1的元素的预测位置也是3,因此将待排元素集中序号为1的元素也放入结果数组;然后访问head数组中序号为5的单元,由于head[5]的值是3,因此将待排元素集中序号为3的元素放入结果数组;最后访问head数组中序号为6的单元,head[6]的值是5,因此将待排元素集序号为5的元素放入结果数组,由于next数组中序号为5的单元有值且值为2,这意味着有待排元素中序号为2的元素的预测位置也是6,因此将待排元素集中序号为2的元素也放入结果数组。这样就完成了整个放置过程,得到的结果数组就是我们需要的有序数组。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1