一种基于spark的支持向量机参数优选并行粒子群寻优方法与流程

文档序号:11323826阅读:499来源:国知局
一种基于spark的支持向量机参数优选并行粒子群寻优方法与流程

本发明涉及一种并行粒子群算法,尤其适用于机器学习模型训练使用的基于spark的支持向量机参数优选并行粒子群寻优方法。



背景技术:

支持向量机是一种机器学习方法。首先通过对训练数据集交叉验证得到最优模型参数,然后利用上一步寻到的最优模型参数去训练得到预测模型,最后用训练得到的预测模型对未知数据进行预测。

网格算法对参数寻优早已实现,网格算法具有局部最优的局限性,而粒子群算法的全局寻优能力则很好的解决了局部最优问题。粒子群算法是一种模仿鸟群觅食的生物进化算法,相比基于贪婪搜索的算法,可更快速地找到更优的参数。pso涉及多次迭代,计算较复杂,单机实现时间较长。特别在数据量较大、迭代次数很多的情形下,pso单机算法效率往往难以被接受。解决pso单机算法效率低下的最好方法就是算法并行化。



技术实现要素:

本发明的目的是针对上述技术的不足之处,提出一种粒子参数寻优过程运行速度快,粒子群算法寻找全局最优准确迅速的基于spark的支持向量机参数优选并行粒子群算法。

为实现上述技术目的,本发明的基于spark的支持向量机参数优选并行粒子群算法,包括如下步骤:

初始化节点粒子群中所有的节点粒子,并将节点粒子的初始化信息转化成rdd的形式存储于数据库中;

在rdd中针对不同地址坐标参数的节点粒子分别并行的做交叉验证,节点粒子映射为交叉验证的正确率、粒子的个体极值,并将rdd中的这些映射结果缓存到服务器内存中,以方便下一次计算时被再次调用;

利用rdd中所有节点粒子的个体极值找到全局极值;

根据全局极值在各个rdd中更新节点粒子;

判断该全局极值是否达到目标正确率或迭代次数达到上限,达到就退出寻优过程,否则重复对节点粒子分别并行的做交叉验证。

具体步骤如下:

步骤1、利用spark集群平台的固有定义函数api的转换操作符map函数,对预设的所有主节点和从节点中的节点粒子进行初始化,从而获得基于spark的支持向量机的n个节点粒子的初始化信息包括速度、位置、个体极值、全局极值信息,并将n个节点粒子的初始化信息转化成弹性分布式数据集rdd的形式保存在数据库中;

步骤2、在数据库中弹性分布式数据集rdd中调用spark集群平台的固有定义函数api的转换操作符map函数,获取弹性分布式数据集rdd中各个节点粒子的坐标参数组<c,g>:将带有不同坐标参数组<c,g>的节点粒子同时并行进行交叉验证,从而获取各个节点粒子通过map函数映射为交叉验证的正确率、节点粒子的个体极值,将各个节点粒子的交叉验证结果以相互独立的方式保存在弹性分布式数据集rdd中,使每个粒子都被映射成独立的新的弹性分布式数据集rdd中;

步骤3:利用集群中所有节点粒子的个体极大值中找到全局极大值;

步骤4:利用集群中节点粒子全局极大值,在弹性分布式数据集rdd中更新每个节点粒子的位置与速度;

步骤5:判断当前全局极值是否达到预设的目标正确率或当前迭代次数达到预设上限,当满足任意条件则退出寻优过程,完成整个寻优方法,输出最后一次的全局极值,否则返回步骤2。

所述所有不同的节点粒子的坐标参数组<c,g>,经过map函数映射后,参数c映射为节点粒子x轴方向的位置,参数g映射为节点粒子y轴方向的位置,初始化粒子在x轴方向的速度和在y轴方向上的速度,将不同的节点粒子的坐标参数组<x,y>缓存到内存中去,以便下一次计算时被调用。

利用map函数将步骤1的所有粒子映射结果再次进行交叉验证得到每个粒子的正确率及粒子的个体极值,并将新的映射结果缓存到内存中方便下一次调用。

在rdd的个体极值找到全局极值的方法为:利用reduce函数对步骤2的映射结果归纳出与n个节点粒子对应的n个个体极值中的最大值,若该最大值大于全局极值,则更新全局极值为最大值,否则全局极值不变。

根据全局极值更新节点粒子的方法为:利用map函数对步骤3的映射结果映射为更新后粒子的x轴方向的速度和位置,以及y轴方向的速度和位置。

有益效果:

本方法相对于原来的串行粒子群算法,基于spark并行平台采用的并行粒子群算法使参数寻优过程显著加快:

1)基于spark并行平台生成n个节点粒子,节点粒子初始化以rdd的形式并行完成的,所有数据和信息均相对独立的以rdd的形式并行执行,相比现有的串行执行方式运行速度快,执行效率高;

2)在rdd中并行完成对n个节点粒子的交叉验证,使用map函数将每个节点粒子都被映射成新的数据集rdd中并行,新生成的rdd中记录转换的相关信息,执行效率高,可靠性高;

3)在rdd中并行找出n个节点粒子的个体极值和共有的全局极值,只要再将交叉验证的结果调用reduce方法,会产生新的键值对并对新的键值对进行归纳,逐个比较即可得到全局最优值;

4)以rdd形式对n个节点粒子并行更新,将n个节点粒子的更新任务分配到不同的任务执行器上,一般是根据主节点和从节点的核数目来分配任务,因此集群的节点数越多,任务并行计算的速度就越快;

b相比网格算法的局部最优限制,粒子群算法可以更快、更好地找到全局最优:

网格算法用于参数寻优原理简单,方便实现,但随着数据集的增大,网格算法的结果往往需要人为提前设置好基准参数c和g,这就需要根据以往的大量经验来设置,无形中提高了很大难度且效果往往不理想。

粒子群算法只是在开始时候初始化c和g,在后续迭代过程中每个粒子会自由的在解空间移动,显著增加随机性,大大扩展了搜索范围,更容易达到全局最优。

附图说明

图1为本发明基于spark的支持向量机参数优选并行粒子群算法整体流程图。

图2为本发明基于并行粒子群算法的交叉验证及搜寻个体极值示例图。

图3为本发明基于并行粒子群算法的交叉验证流程图。

图4为本发明基于并行粒子群算法的全局极值寻优过程示例图。

图5为本发明基于并行粒子群算法的40个粒子迭代更新示例图。

图6为本发明并行化网格算法和并行化粒子群算法性能比较图。

具体实施方式

下面结合附图对本申请的一个实施例做进一步说明:

本发明的基于spark的支持向量机参数优选并行粒子群寻优方法,包括如下步骤:

初始化节点粒子群中所有的节点粒子,并将节点粒子的初始化信息转化成rdd的形式存储于数据库中;

在rdd中针对不同地址坐标参数的节点粒子分别并行的做交叉验证,节点粒子映射为交叉验证的正确率、粒子的个体极值,并将rdd中的这些映射结果缓存到服务器内存中,以方便下一次计算时被再次调用;

利用rdd中所有节点粒子的个体极值找到全局极值;

根据全局极值在各个rdd中更新节点粒子;

判断该全局极值是否达到目标正确率或迭代次数达到上限,达到就退出寻优过程,否则重复对节点粒子分别并行的做交叉验证。

具体步骤如下:

步骤1、利用spark集群平台的固有定义函数api的转换操作符map函数,对预设的所有主节点和从节点中的节点粒子进行初始化,从而获得基于spark的支持向量机的n个节点粒子的初始化信息包括速度、位置、个体极值、全局极值信息,并将n个节点粒子的初始化信息转化成弹性分布式数据集rdd的形式保存在数据库中;

步骤2、在数据库中弹性分布式数据集rdd中调用spark集群平台的固有定义函数api的转换操作符map函数,获取弹性分布式数据集rdd中各个节点粒子的坐标参数组<c,g>;所述所有不同的节点粒子的坐标参数组<c,g>,经过map函数映射后,参数c映射为节点粒子x轴方向的位置,参数g映射为节点粒子y轴方向的位置,初始化粒子在x轴方向的速度和在y轴方向上的速度,将不同的节点粒子的坐标参数组<x,y>缓存到内存中去,以便下一次计算时被调用;

将带有不同坐标参数组<x,y>的节点粒子同时并行进行交叉验证,从而获取各个节点粒子通过map函数映射为交叉验证的正确率、节点粒子的个体极值,将各个节点粒子的交叉验证结果以相互独立的方式保存在弹性分布式数据集rdd中,使每个粒子都被映射成独立的新的弹性分布式数据集rdd中,并将新的映射结果缓存到内存中方便下一次调用。

步骤3:利用集群中所有节点粒子的个体极大值中找到全局极大值;在rdd的个体极值找到全局极值的方法为:利用reduce函数对步骤2的映射结果归纳出与n个节点粒子对应的n个个体极值中的最大值,若该最大值大于全局极值,则更新全局极值为最大值,否则全局极值不变;

步骤4:利用集群中节点粒子全局极大值,在弹性分布式数据集rdd中更新每个节点粒子的位置与速度;根据全局极值更新节点粒子的方法为:利用map函数对步骤3的映射结果映射为更新后粒子的x轴方向的速度和位置,以及y轴方向的速度和位置;

步骤5:判断当前全局极值是否达到预设的目标正确率或当前迭代次数达到预设上限,当满足任意条件则退出寻优过程,完成整个寻优方法,输出最后一次的全局极值,否则返回步骤2。

实施例

用粒子群算法进行参数寻优的流程图见附图1。该方法下的寻优过程有:首先对40个粒子初始化;再交叉验证;然后选出全局极值;最后更新粒子这4个步骤。从粒子群算法参数寻优开始直到寻优结束,这期间对40个粒子的全局极值的计算可能不止一次,因此对40个粒子的并行化速度和位置更新也可能不止一次。所以会出现多次迭代计算。附图1中的全局极值(前)指粒子每次更新迭代运算前的全局极值,全局极值(后)指每次粒子更新迭代运算后的全局极值。根据他们之间的大小关系,这两者的更新原则为:若粒子在某次更新迭代运算后全局极值(后)不大于全局极值(前),则全局极值(前)不改变(即全局极值不更新)否则全局极值(后)的值赋给全局极值(前),附图1中的参数end_flag指在某次粒子更新迭代运算后全局极值未被更新的次数,当全局极值未被更新次数达40次时,默认找到最优的全局极值,结束寻优过程。

该方法下的参数寻优过程分为以下几个步骤:

1对40个粒子初始化。

n个节点粒子的初始化是以rdd形式并行完成的。每个粒子的位置、速度、个体极值以及所有粒子共有的全局极值都被转换为rdd的形式。而原来的串行执行将会使代码冗长,运行速度也慢的多。

参数c取值为2-5,2-4,2-3...214,这20个值放入其中一个数组。参数g取值为2-15,2-14,2-13...24这20个值放入另一个数组。然后申请一个数组用来存放40个粒子的相关信息(位置和速度)。每个粒子的坐标x都被第一个数组(放置参数c的数组)中的元素随机初始化,每个粒子的坐标y都被第二个数组,(放置参数g的数组)中的元素随机初始化。在40个粒子的位置(x,y)随机初始化的同时对每个粒子的飞行速度进行初始化。x坐标位移速度vx统一取2.0,y坐标位移速度vy统一取0.02。40个粒子的初始信息被4个任务执行器平均转换成rdd的形式见附图2,附图2的前半部分是以rdd形式呈现的对40个粒子初始化的过程。而附图2的后半部分内容将在接下来的交叉验证的步骤中详细提到。

2交叉验证

在rdd中调用转换操作符的map(本专利中spark的api均用斜体表示)函数,将带有不同c,g参数的粒子分别并行的做交叉验证,粒子通过map函数映射为交叉验证的正确率、粒子的个体极值,并将rdd中的这些映射结果缓存到内存中,以方便下一次计算时被再次调用。

对40个粒子分别做交叉验证得到其适应值,再由适应值选出40个粒子各自对应的个体极值。每一个粒子都要做交叉验证。交叉验证的过程如下

见附图3,训练数据集被均分为编号为1、2、3、4、5的5份数据。从k=1开始,数据集k以外的其他4个数据集被当作训练数据集,用来训练得到模型,数据集k作测试数据集被用于测试。用4份训练数据集训练得到的模型对剩下的1份测试数据集进行测试,得到正确率acck。随着参数k每次增1,训练数据集和测试数据集都在这5份数据集中轮换直到k=6停止。就这样循环轮流交叉验证了5次。5份数据集,每一份都作过测试数据集,而且每一份都作过训练数据集。得到的总的正确率acci就是每个粒子(ci,gi)所对应的适应值。从粒子的适应值acci中找到个体极值的过程见附图2,附图2的后半部分中,如果粒子的适应值acci大于已有的个体极值personali,则将粒子的适应值acci赋给个体极值,否则已有的个体极值personali不更新。这样便保证了personali是每次迭代运算后的个体极值。每个独一无二的个体极值personali仅代表粒子i在每次迭代搜索结果中的最优。当然,所对应的参数(ci,gi)并不一定是我们要找的最优的参数,还需要和别的粒子(粒子i以外的粒子)的交叉验证结果比较,也就是下一个步骤:选出全局极值。

3选出全局极值

见附图4,对附图3中的结果(个体极值personali)调用reduce方法,在reduce中归纳汇总得到个体极值personali中的最大值,若该最大值比全局极值public大,则用此最大值赋值给原来的全局极值public,否则全局极值不变。

在每次迭代运算后都要把全局极值public当做判断是否继续寻优的条件之一。若全局极值public达到目标正确率,则退出寻优过程,否则进行下一步的更新粒子。下面详细介绍粒子的更新过程。

4更新粒子

对n个节点粒子的更新也是rdd中并行进行的。根据粒子更新的规律在map函数中产生新的映射关系,等待遇到动作操作指令就会执行计算。n个节点粒子的更新的任务分配到不同的任务执行器上,一般根据主节点和从节点的核数目来分配计算任务,因此集群的节点数越多,集成并发度高。

见附图5,其中w是惯性权重,w从1到0.2均匀递减,每迭代一次递减一次。对vx、vy、x、y的更新法则如下。其中出现的参数例如w、c1、c2等将在下文详细介绍。

对vx的更新:

vx=w*vx+c1*rand1*(personal._1._1-x)+c2*rand2*(public._1._1-x)

对x的更新:

x=x+vx

同理,在y方向上的速度与位置的更新规则为:

vy=w*vy+c1*rand1*(personal._1._1-y)+c2*rand2*(public._1._1-y)

y=y+vy

总的来说,本发明中涉及的基于rdd的转换操作和动作操作过程见附图6,第一步,从hdfs中读取存储的参数c和g;第二步,将每个粒子所对应的参数c和g,经map操作转换成rdd的形式;第三步,调用map函数,对40个rdd形式的粒子并行进行交叉验证,然后根据交叉验证的结果来确定每个粒子的个体极值;第四步,确定这40个粒子的40个个体极值中的最大值,将此最大值和全局极值(前)比较大小,若前者大于后者,则将此最大值赋值给全局极值(前),否则不更新全局极值(前)。那么就确定出了当前更新迭代后的全局极值;第五步,更新40个粒子,每个粒子要更新的有位置x、位置y、速度vx、速度vy,更新规则如下文所示;

第六步,将结果传入分布式文件系统hdfs中存储,以被下一次调用。

对速度vx的更新:

vx=w*vx+c1*rand1*(personal._1._1-x)+c2*rand2*(public._1._1-x)

其中w是惯性权重,w从1到0.2均匀递减,每迭代一次递减一次。c1和c2称学习因子,在这里c1=2.05,c2=2.05。rand1和rand2是随机数,在这里也可看出粒子群算法的优势,随机数rand1和rand2的出现使粒子群的搜索范围扩大,寻优结果的泛化能力更高。x是粒子i当前位置的x方向的坐标。personal._1._1是粒子i的个体极值处的x方向的坐标,public._1._1是40个粒子组成的粒子群出现全局极值处的x方向的坐标。

对x的更新:

x=x+vx

其中等式右边的x是粒子i更新前在x方向的坐标,vx是粒子i更新前x方向的速度。

同理,在y方向上的速度与位置的更新规则为:

vy=w*vy+c1*rand1*(personal._1._1-y)+c2*rand2*(public._1._1-y)

y=y+vy

与现有技术相比,本发明的有益效果是:

a相对于原来的串行粒子群算法,本发明采用的并行粒子群算法使参数寻优过程显著加快。主要原因是对数据处理都是基于spark并行平台设计实现的,将数据转化为分布式rdd处理显著提高了运行速度。

(1)n个节点粒子的初始化是以rdd的形式并行完成的。每个粒子的位置、速度、个体极值、所有粒子共有的全局极值都转换为rdd的形式并行执行。而原来的串行执行将会使代码冗长,运行速度也慢的多。

(2)对n个节点粒子的交叉验证是在所有rdd中并行完成的。在调用转换操作符map函数时,每个粒子都被映射成新的数据集,但此时并不会立即计算,因为rdd遇到转换操作符时不会计算,新生成的rdd会记录转换的相关信息,只有遇到动作操作符,比如reduce,才会连带着之前的转换操作符一起计算得到新的键值对。这种运行机制不但可以加快执行效率,而且有更高可靠性。

(3)n个节点粒子的个体极值和共有的全局极值是在rdd中并行找到的。之前在rdd中对粒子并行交叉验证,个体极值和全局极值就在交叉验证的结果中产生,只要再将交叉验证的结果调用reduce方法,会产生新的键值对并对新的键值对进行归纳,逐个比较即可得到全局最优值。

(4)对n个节点粒子的更新也是以rdd形式并行进行的。根据粒子更新的规律在map函数中产生新的映射关系,等待下一次的动作操作指令就会执行。n个节点粒子的更新任务分配到不同的任务执行器上,一般是根据主节点和从节点的核数目来分配任务,因此集群的节点数越多,任务并行计算的速度就越快。

b相比网格算法的局部最优限制,粒子群算法可以更快、更好地找到全局最优。

网格算法用于参数寻优原理简单,方便实现,但随着数据集的增大,网格算法的结果往往需要人为提前设置好基准参数c和g,这就需要根据以往的大量经验来设置,无形中提高了很大难度且效果往往不理想。

粒子群算法只是在开始时候初始化基准参数c和g,在后续迭代过程中每个粒子会自由的在解空间移动,随机性显著增加,大大扩展了搜索范围,更容易达到全局最优。网格算法并行化和粒子群算法并行化分别对4组数据集a1a、a2a、a3a、a4a进行参数寻优的结果见附图6,可以明显看到,相比于网格算法,粒子群算法在交叉验证正确率上有着明显的提高,这也证明了粒子群算法在寻优方面的效果确实优于网格算法。

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