精华内容
下载资源
问答
  • 粒子群优化SVM.rar

    2020-01-06 14:40:20
    粒子群优化SVM python代码
  • 粒子群算法优化支持向量机模型参数代码,代码包含注释和数据文件
  • 为改进工作面煤矿瓦斯涌出浓度的预测精度,基于深度学习网络、SVM和粒子群(PSO)优化算法的原理,建立1种深度学习网络与粒子群优化SVM神经网络耦合的混合算法模型,该算法首先基于深度学习理论学习样本数据较深层次的...
  • 粒子群优化SVM的两个参数,利用数据做预测,数据代码都在压缩包里,可以直接运行。
  • 粒子群优化SVM系数

    2013-01-17 21:49:52
    粒子群优化SVM系数,matlab源代码,可以使用
  • 针对支持向量机在故障诊断中参数的选取问题,提出一种改进的粒子群优化算法,对支持向量机的惩罚因子与核参数进行优化。为了克服传统粒子群算法前期收敛快、后期易陷入局部最优的缺陷,提出一种惯性权重自适应调整的...
  • 基于混合粒子群优化SVM算法的红斑鳞状皮肤病诊断.pdf
  • 行业分类-物理装置-基于粒子群优化SVM的变压器油溶解气体拉曼检测分析方法.zip
  • SVM粒子群优化参数

    2021-04-19 01:10:14
    我现在要用粒子群算法优化支持向量机的参数,请哪位大神告诉我怎么调用svmtrain函数的语法怎么写,将优化的参数传进去? 谢谢各位大神!!!!!!!!============================实例研究====================...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    下面是一个调用SVM分类的一个实例,这个例子svmtrain没有传参数。我现在要用粒子群算法优化支持向量机的参数,请哪位大神告诉我怎么调用svmtrain函数的语法怎么写,将优化的参数传进去? 谢谢各位大神!!!!!!!!

    ============================实例研究====================

    load fisheriris

    %载入matlab自带的数据[有关数据的信息可以自己到UCI查找,这是UCI的经典数据之一],得到的数据如下图:

    其中meas是150*4的矩阵代表着有150个样本每个样本有4个属性描述,species代表着这150个样本的分类.

    data = [meas(:,1), meas(:,2)];

    %在这里只取meas的第一列和第二列,即只选取前两个属性.

    groups = ismember(species,'setosa');

    %由于species分类中是有三个分类:setosa,versicolor,virginica,为了使问题简单,我们将其变为二分类问题:Setosa and non-Setosa.

    [train, test] = crossvalind('holdOut',groups);

    cp = classperf(groups);

    %随机选择训练集合测试集[有关crossvalind的使用请自己help一下]

    其中cp作用是后来用来评价分类器的.

    svmStruct = svmtrain(data(train,:),groups(train),'showplot',true);

    %使用svmtrain进行训练,得到训练后的结构svmStruct,在预测时使用.

    classes = svmclassify(svmStruct,data(test,:),'showplot',true);

    %对于未知的测试集进行分类预测,结果如图:

    tu3

    3.jpg (37.34 KB)

    2009-5-12 19:50

    classperf(cp,classes,test);

    cp.CorrectRate

    ans =

    0.9867

    展开全文
  • 一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都遵循:避免与邻域个体相撞...

    一、粒子群算法简介

    1 引言
    自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都遵循:避免与邻域个体相撞:匹配邻域个体的速度;飞向鸟群中心,且整个群体飞向目标。仿真中仅利用上面三条简单的规则,就可以非常接近地模拟出鸟群飞行的现象。1990年, 生物学家Frank Heppner也提出了鸟类模型, 它的不同之处在于:鸟类被吸引飞到栖息地。在仿真中,一开始每一只鸟都没有特定的飞行目标,只是使用简单的规则确定自己的飞行方向和飞行速度,当有一只鸟飞到栖息地时,它周围的鸟也会跟着飞向栖息地,最终整个鸟群都会落在栖息地。
    1995年, 美国社会心理学家James Kennedy和电气工程师RussellEberhart共同提出了粒子群算法(ParticleS warm Optimization, PSO) , 该算法的提出是受对鸟类群体行为进行建模与仿真的研究结果的启发。他们的模型和仿真算法主要对Frank Heppner的模型进行了修正,以使粒子飞向解空间并在最优解处降落。粒子群算法一经提出,由于其算法简单,容易实现,立刻引起了进化计算领域学者们的广泛关注, 形成一个研究热点。2001年出版的J.Kennedy与R.Eberhart合著的《群体智能》将群体智能的影响进一步扩大[] , 随后关于粒子群优化算法的研究报告和研究成果大量涌现,继而掀起了国内外研究热潮[2-7]。
    粒子群优化算法来源于鸟类群体活动的规律性,进而利用群体智能建立一个简化的模型。它模拟鸟类的觅食行为,将求解问题的搜索空间比作鸟类的飞行空间,将每只鸟抽象成一个没有质量和体积的粒
    子,用它来表征问题的一个可能解,将寻找问题最优解的过程看成鸟类寻找食物的过程,进而求解复杂的优化问题。粒子群优化算法与其他进化算法一样,也是基于“种群”和“进化”的概念,通过个体间
    的协作与竞争,实现复杂空间最优解的搜索。同时,它又不像其他进化算法那样对个体进行交叉、变异、选择等进化算子操作,而是将群体中的个体看作在l维搜索空间中没有质量和体积的粒子,每个粒子以一定的速度在解空间运动, 并向自身历史最佳位置P best和邻域历史最佳位置g best聚集, 实现对候选解的进化。粒子群算法具有很好的生物社会背景而易于理解,由于参数少而容易实现,对非线性、多峰问题均具有较强的全局搜索能力,在科学研究与工程实践中得到了广泛关注。目前,该算法已广泛应用于函数优化、神经网络训练、模式分类、模糊控制等领域。

    2 粒子群算法理论
    2.1粒子群算法描述
    鸟类在捕食过程中,鸟群成员可以通过个体之间的信息交流与共享获得其他成员的发现与飞行经历。在食物源零星分布并且不可预测的条件下,这种协作机制所带来的优势是决定性的,远远大于对食物
    的竞争所引起的劣势。粒子群算法受鸟类捕食行为的启发并对这种行为进行模仿,将优化问题的搜索空间类比于鸟类的飞行空间,将每只鸟抽象为一个粒子,粒子无质量、无体积,用以表征问题的一个可行解,优化问题所要搜索到的最优解则等同于鸟类寻找的食物源。粒子群算法为每个粒子制定了与鸟类运动类似的简单行为规则,使整个粒子群的运动表现出与鸟类捕食相似的特性,从而可以求解复杂的优化问题。
    粒子群算法的信息共享机制可以解释为一种共生合作的行为,即每个粒子都在不停地进行搜索,并且其搜索行为在不同程度上受到群体中其他个体的影响[8],同时这些粒子还具备对所经历最佳位置的记
    忆能力,即其搜索行为在受其他个体影响的同时还受到自身经验的引导。基于独特的搜索机制,粒子群算法首先生成初始种群,即在可行解空间和速度空间随机初始化粒子的速度与位置,其中粒子的位置用于表征问题的可行解,然后通过种群间粒子个体的合作与竞争来求解优化问题。
    2.2粒子群算法建模
    粒子群优化算法源自对鸟群捕食行为的研究:一群鸟在区域中随机搜索食物,所有鸟知道自己当前位置离食物多远,那么搜索的最简单有效的策略就是搜寻目前离食物最近的鸟的周围区域。粒子群算法
    利用这种模型得到启示并应用于解决优化问题。在粒子群算法中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适应度值,每个粒子还有一个速度决定它们飞翔的方向和距离。然后,粒子们就追随当前的最优粒子在解空间中搜索[9]。

    粒子群算法首先在给定的解空间中随机初始化粒子群,待优化问题的变量数决定了解空间的维数。每个粒子有了初始位置与初始速度,然后通过迭代寻优。在每一次迭代中,每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置与飞行速度:一个极值就是单个粒子本身在迭代过程中找到的最优解粒子,这个粒子叫作个体极值:另一个极值是种群所有粒子在迭代过程中所找到的最优解粒子,这个粒子是全局极值。上述的方法叫作全局粒子群算法。如果不用种群所有粒子而只用其中一部分作为该粒子的邻居粒子,那么在所有邻居粒子中的极值就是局部极值,该方法称为局部粒子群算法。

    2.3粒子群算法的特点
    粒子群算法本质是一种随机搜索算法,它是一种新兴的智能优化技术。该算法能以较大概率收敛于全局最优解。实践证明,它适合在动态、多目标优化环境中寻优,与传统优化算法相比,具有较快的计
    算速度和更好的全局搜索能力。
    (1)粒子群算法是基于群智能理论的优化算法,通过群体中粒子间的合作与竞争产生的群体智能指导优化搜索。与其他算法相比,粒子群算法是一种高效的并行搜索算法。
    (2)粒子群算法与遗传算法都是随机初始化种群,使用适应值来评价个体的优劣程度和进行一定的随机搜索。但粒子群算法根据自己的速度来决定搜索,没有遗传算法的交叉与变异。与进化算法相比,粒子群算法保留了基于种群的全局搜索策略,但是其采用的速度-位移模型操作简单,避免了复杂的遗传操作。
    (3)由于每个粒子在算法结束时仍保持其个体极值,即粒子群算法除了可以找到问题的最优解外,还会得到若干较好的次优解,因此将粒子群算法用于调度和决策问题可以给出多种有意义的方案。
    (4)粒子群算法特有的记忆使其可以动态地跟踪当前搜索情况并调整其搜索策略。另外,粒子群算法对种群的大小不敏感,即使种群数目下降时,性能下降也不是很大。

    3 粒子群算法种类
    3.1基本粒子群算法
    在这里插入图片描述
    3.2标准粒子群算法
    引入研究粒子群算法经常用到的两个概念:一是“探索”,指粒子在一定程度上离开原先的搜索轨迹,向新的方向进行搜索,体现了一种向未知区域开拓的能力,类似于全局搜索;二是“开发”,指粒子在一定程度上继续在原先的搜索轨迹上进行更细一步的搜索,主要指对探索过程中所搜索到的区域进行更进一步的搜索。探索是偏离原来的寻优轨迹去寻找一个更好的解,探索能力是一个算法的全局搜索能力。开发是利用一个好的解,继续原来的寻优轨迹去搜索更好的解,它是算法的局部搜索能力。如何确定局部搜索能力和全局搜索能力的比例, 对一个问题的求解过程很重要。1998年, Shi Yuhui等人提出了带有惯性权重的改进粒子群算法[10],由于该算法能够保证较好的收敛效果,所以被默认为标准粒子群算法。其进化过程为:
    在这里插入图片描述
    在式(6.7)中,第一部分表示粒子先前的速度,用于保证算法的全局收敛性能;第二部分、第三部分则使算法具有局部收敛能力。可以看出,式(6.7)中惯性权重w表示在多大程度上保留原来的速度:W
    较大,则全局收敛能力较强,局部收敛能力较弱;w较小,则局部收敛能力较强,全局收敛能力较弱。
    当w=1时,式(6.7)与式(6.5)完全一样,表明带惯性权重的粒子群算法是基本粒子群算法的扩展。实验结果表明:w在0.8~1.2之间时,粒子群算法有更快的收敛速度;而当w>1.2时,算法则容易陷入局部极值。
    另外,在搜索过程中可以对w进行动态调整:在算法开始时,可给w赋予较大正值,随着搜索的进行,可以线性地使w逐渐减小,这样可以保证在算法开始时,各粒子能够以较大的速度步长在全局范围内探
    测到较好的区域;而在搜索后期,较小的w值则保证粒子能够在极值点周围做精细的搜索,从而使算法有较大的概率向全局最优解位置收敛。对w进行调整,可以权衡全局搜索和局部搜索能力。目前,采用较多的动态惯性权重值是Shi提出的线性递减权值策略, 其表达式如下:
    在这里插入图片描述
    3.3压缩因子粒子群算法
    Clerc等人提出利用约束因子来控制系统行为的最终收敛[11] , 该方法可以有效搜索不同的区域,并且能得到高质量的解。压缩因子法的速度更新公式为:
    在这里插入图片描述
    实验结果表明:与使用惯性权重的粒子群优化算法相比,使用具
    有约束因子的粒子群算法具有更快的收敛速度。
    3.4离散粒子群算法
    基本的粒子群算法是在连续域中搜索函数极值的有力工具。继基本粒子群算法之后, Kennedy和Eberhart又提出了一种离散二进制版的粒子群算法[12]。在此离散粒子群方法中,将离散问题空间映射到连续粒子运动空间,并适当修改粒子群算法来求解,在计算上仍保留经典粒子群算法速度-位置更新运算规则。粒子在状态空间的取值和变化只限于0和1两个值, 而速度的每一维vi y代表位置每一位xi取值为1的可能性。因此, 在连续粒子群中的vij更新公式依然保持不变, 但是P best和:best只在[0, 1] 内取值。其位置更新等式表示如下:
    在这里插入图片描述
    4 粒子群算法流程
    粒子群算法基于“种群”和“进化”的概念,通过个体间的协作与竞争,实现复杂空间最优解的搜索[13],其流程如下:
    (1)初始化粒子群,包括群体规模N,每个粒子的位置x;和速度Vio
    (2) 计算每个粒子的适应度值fit[i] 。
    (3) 对每个粒子, 用它的适应度值fit[门和个体极值P best(i)比较。如果fit[i] <P best(i) , 则用fit[i] 替换掉P best(i) 。
    (4) 对每个粒子, 用它的适应度值fit[i] 和全局极值g best比较。如果fit[i] < 8 best, 则用fit[i] 替换g best。
    (5)迭代更新粒子的速度v;和位置xj。
    (6)进行边界条件处理。
    (7)判断算法终止条件是否满足:若是,则结束算法并输出优化结果;否则返回步骤(2)。
    粒子群算法的运算流程如图6.1所示。
    在这里插入图片描述
    5 关键参数说明
    在粒子群优化算法中,控制参数的选择能够影响算法的性能和效率;如何选择合适的控制参数使算法性能最佳,是一个复杂的优化问题。在实际的优化问题中,通常根据使用者的经验来选取控制参数。
    粒子群算法的控制参数主要包括:粒子种群规模N,惯性权重w,加速系数c和c, 最大速度Via x, 停止准则, 邻域结构的设定, 边界条件处理策略等[14],
    粒子种群规模N
    粒子种群大小的选择视具体问题而定,但是一般设置粒子数为20~50。对于大部分的问题10个粒子,已经可以取得很好的结果:不过对于比较难的问题或者特定类型的问题,粒子的数量可以取到100或
    200。另外,粒子数目越大,算法搜索的空间范围就越大,也就更容易发现全局最优解;当然,算法运行的时间也越长。
    惯性权重w
    惯性权重w是标准粒子群算法中非常重要的控制参数,可以用来控制算法的开发和探索能力。惯性权重的大小表示了对粒子当前速度继承的多少。当惯性权重值较大时,全局寻优能力较强,局部寻优能力
    较弱:当惯性权重值较小时,全局寻优能力较弱,局部寻优能力较强。惯性权重的选择通常有固定权重和时变权重。固定权重就是选择常数作为惯性权重值,在进化过程中其值保持不变,一般取值为
    [0.8,1.2]:时变权重则是设定某一变化区间,在进化过程中按照某种方式逐步减小惯性权重。时变权重的选择包括变化范围和递减率。固定的惯性权重可以使粒子保持相同的探索和开发能力,而时变权重可以使粒子在进化的不同阶段拥有不同的探索和开发能力。
    加速常数c1和c2
    加速常数c和c 2分别调节向P best和g best方向飞行的最大步长, 它们分别决定粒子个体经验和群体经验对粒子运行轨迹的影响,反映粒子群之间的信息交流。如果cr=c2=0,则粒子将以当前的飞行速度飞到边界。此时,粒子仅能搜索有限的区域,所以难以找到最优解。如果q=0,则为“社会”模型,粒子缺乏认知能力,而只有群体经验,它的收敛速度较快,但容易陷入局部最优;如果oy=0,则为“认知”模
    型,没有社会的共享信息,个体之间没有信息的交互,所以找到最优解的概率较小,一个规模为D的群体等价于运行了N个各行其是的粒子。因此一般设置c1=C2,通常可以取c1=cg=1.5。这样,个体经验和群体经验就有了同样重要的影响力,使得最后的最优解更精确。
    粒子的最大速度vmax
    粒子的速度在空间中的每一维上都有一个最大速度限制值vd max,用来对粒子的速度进行钳制, 使速度控制在范围[-Vimax, +va max] 内,这决定问题空间搜索的力度, 该值一般由用户自己设定。Vmax是一个非常重要的参数,如果该值太大,则粒子们也许会飞过优秀区域:而如果该值太小,则粒子们可能无法对局部最优区域以外的区域进行充分的探测。它们可能会陷入局部最优,而无法移动足够远的距离而跳出局部最优, 达到空间中更佳的位置。研究者指出, 设定Vmax和调整惯性权重的作用是等效的, 所以!max一般用于对种群的初始化进行设定, 即将vmax设定为每维变量的变化范围, 而不再对最大速度进行细致的选择和调节。
    停止准则
    最大迭代次数、计算精度或最优解的最大停滞步数▲t(或可以接受的满意解)通常认为是停止准则,即算法的终止条件。根据具体的优化问题,停止准则的设定需同时兼顾算法的求解时间、优化质量和
    搜索效率等多方面性能。
    邻域结构的设定
    全局版本的粒子群算法将整个群体作为粒子的邻域,具有收敛速度快的优点,但有时算法会陷入局部最优。局部版本的粒子群算法将位置相近的个体作为粒子的邻域,收敛速度较慢,不易陷入局部最优
    值。实际应用中,可先采用全局粒子群算法寻找最优解的方向,即得到大致的结果,然后采用局部粒子群算法在最优点附近进行精细搜索。
    边界条件处理
    当某一维或若干维的位置或速度超过设定值时,采用边界条件处理策略可将粒子的位置限制在可行搜索空间内,这样能避免种群的膨胀与发散,也能避免粒子大范围地盲目搜索,从而提高了搜索效率。
    具体的方法有很多种, 比如通过设置最大位置限制Xmax和最大速度限制Vmax, 当超过最大位置或最大速度时, 在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。

    二、SVM简介

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。
    1 数学部分
    1.1 二维空间
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2 算法部分
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、部分源代码

    function [bestCVmse,bestc,bestg,fit_gen] = psoSVMcgForRegress(train_label,train,T_test,P_test,pso_option)
    
    %% 参数初始化
    % c1:pso参数局部搜索能力
    % c2:pso参数全局搜索能力
    % maxgen:最大进化数量
    % sizepop:种群最大数量
    % k:k belongs to [0.1,1.0],速率和x的关系(V = kX)
    % wV:(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的弹性系数
    % wP:种群更新公式中速度前面的弹性系数
    
    % popcmax:SVM 参数c的变化的最大值.
    % popcmin:SVM 参数c的变化的最小值.
    % popgmax:SVM 参数g的变化的最大值.
    % popgmin:SVM 参数c的变化的最小值.
    % popkernel:SVM的核参数
    
    Vcmax = pso_option.k*pso_option.popcmax;
    Vcmin = -Vcmax ;
    Vgmax = pso_option.k*pso_option.popgmax;
    Vgmin = -Vgmax ;
    %% 产生初始粒子和速度
    for i=1:pso_option.sizepop
        % 随机产生种群和速度
        i
        pop(i,1) = (pso_option.popcmax-pso_option.popcmin)*rand+pso_option.popcmin;
        pop(i,2) = (pso_option.popgmax-pso_option.popgmin)*rand+pso_option.popgmin;
        V(i,1)=Vcmax*rands(1,1);
        V(i,2)=Vgmax*rands(1,1);
        
        % 计算初始适应度
        cmd = ['-s 3 -t ',num2str( pso_option.popkernel ),' -c ',num2str( pop(i,1) ),' -g ',num2str( pop(i,2) ),' -p 0.01 -d 1'];
        model= svmtrain(train_label, train, cmd);
        [l,~]= svmpredict(T_test,P_test,model);
        fitness(i)=mse(l-T_test);%以均方差作为适应度函数,均方差越小,精度越高
    end
    
    % 找极值和极值点
    [global_fitness bestindex]=min(fitness); % 全局极值
    local_fitness=fitness;   % 个体极值初始化
    
    global_x=pop(bestindex,:);   % 全局极值点
    local_x=pop;    % 个体极值点初始化
    
    % 每一代种群的平均适应度
    avgfitness_gen = zeros(1,pso_option.maxgen);
    
    %% 迭代寻优
    for i=1:pso_option.maxgen
        iter=i
        for j=1:pso_option.sizepop
            
            %速度更新
            V(j,:) = pso_option.wV*V(j,:) + pso_option.c1*rand*(local_x(j,:) - pop(j,:)) + pso_option.c2*rand*(global_x - pop(j,:));
            % 边界判断
            if V(j,1) > Vcmax
                V(j,1) = Vcmax;
            end
            if V(j,1) < Vcmin
                V(j,1) = Vcmin;
            end
            if V(j,2) > Vgmax
                V(j,2) = Vgmax;
            end
            if V(j,2) < Vgmin
                V(j,2) = Vgmin;
            end
            
            %种群更新
            pop(j,:)=pop(j,:) + pso_option.wP*V(j,:);
            %边界判断
            if pop(j,1) > pso_option.popcmax
                pop(j,1) = (pso_option.popcmax-pso_option.popcmin)*rand+pso_option.popcmin;;
            end
            if pop(j,1) < pso_option.popcmin
                pop(j,1) = (pso_option.popcmax-pso_option.popcmin)*rand+pso_option.popcmin;;
            end
            if pop(j,2) > pso_option.popgmax
                pop(j,2) = (pso_option.popgmax-pso_option.popgmin)*rand+pso_option.popgmin;;
            end
            if pop(j,2) < pso_option.popgmin
                pop(j,2) = (pso_option.popgmax-pso_option.popgmin)*rand+pso_option.popgmin;;
            end
            
            % 自适应粒子变异
            if rand>0.8
               
                    pop(j,k) = (pso_option.popcmax-pso_option.popcmin)*rand + pso_option.popcmin;
                end
                if k == 2
                    pop(j,k) = (pso_option.popgmax-pso_option.popgmin)*rand + pso_option.popgmin;
                end
            end
            
            %适应度值
            cmd = ['-t ',num2str( pso_option.popkernel ),' -c ',num2str( pop(j,1) ),' -g ',num2str( pop(j,2) ),' -s 3 -p 0.01 -d 1'];
            model= svmtrain(train_label, train, cmd);
            [l,mse1]= svmpredict(T_test,P_test,model);
            fitness(j)=mse(l-T_test);
            %个体最优更新
            if fitness(j) < local_fitness(j)
                local_x(j,:) = pop(j,:);
                local_fitness(j) = fitness(j);
            end
            
            if fitness(j) == local_fitness(j) && pop(j,1) < local_x(j,1)
                local_x(j,:) = pop(j,:);
                local_fitness(j) = fitness(j);
            end
            
            %群体最优更新
            if fitness(j) < global_fitness
               
        end
        
        fit_gen(i)=global_fitness;
        avgfitness_gen(i) = sum(fitness)/pso_option.sizepop;
    end
    
    %% 输出结果
    % 最好的参数
    bestc = global_x(1);
    bestg = global_x(2);
    bestCVmse = fit_gen(pso_option.maxgen);%最好的结果
    
    % 支持向量机用于收盘价预测,首先是未优化的,其次是优化后的
    %% 清空环境
    tic;clc;clear;close all;format compact
    %% 加载数据
    data=xlsread('EUA五分钟.xlsx','G2:G30763'); save data data
    load data
    % 归一化
    [a,inputns]=mapminmax(data',0,1);%归一化函数要求输入为行向量
    data_trans=data_process(5,a);%% 对时间序列预测建立滚动序列,即用1到m个数据预测第m+1个数据,然后用2到m+1个数据预测第m+2个数据
    input=data_trans(:,1:end-1);
    output=data_trans(:,end);
    %% 数据集 前75%训练 后25%预测
    m=round(size(data_trans,1)*0.75);
    Pn_train=input(1:m,:);
    Tn_train=output(1:m,:);
    Pn_test=input(m+1:end,:);
    Tn_test=output(m+1:end,:);
    
    %% 1.没有优化的SVM
    bestc=0.001;bestg=10;%c和g随机赋值 表示没有优化的SVM
    t=0;%t=0为线性核函数,1-多项式。2rbf核函数
    cmd = ['-s 3 -t ',num2str(t),' -c ', num2str(bestc),' -g ',num2str(bestg),' -p 0.01 -d 1'];  
        
    model = svmtrain(Tn_train,Pn_train,cmd);%训练
    [predict,~]= svmpredict(Tn_test,Pn_test,model);%测试
    % 反归一化,为后面的结果计算做准备
    predict0=mapminmax('reverse',predict',inputns);%测试实际输出反归一化
    T_test=mapminmax('reverse',Tn_test',inputns);%测试集期望输出反归一化
    T_train=mapminmax('reverse',Tn_train',inputns);%训练集期望输出反归一化
     
    

    三、运行结果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
    [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
    [3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
    [4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
    [5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.

    展开全文
  • 粒子群算法优化支持向量机的matlab程序,用于对股价、经济的预测作用,优化后预测精确
  • 整个粒子群优化算法的算法框架如下: step1种群初始化,可以进行随机初始化或者根据被优化的问题设计特定的初始化方法,然后计算个体的适应值,从而选择出个体的局部最优位置向量和种群的全局最优位置向量。...

    一、神经网络-支持向量机

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。 1 数学部分 1.1 二维空间 ​ 2 算法部分

    二、粒子群算法

    粒子群算法是在1995年由Eberhart博士和Kennedy博士一起提出的,它源于对鸟群捕食行为的研究。它的基本核心是利用群体中的个体对信息的共享从而使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的最优解。设想这么一个场景:一群鸟进行觅食,而远处有一片玉米地,所有的鸟都不知道玉米地到底在哪里,但是它们知道自己当前的位置距离玉米地有多远。那么找到玉米地的最佳策略,也是最简单有效的策略就是搜寻目前距离玉米地最近的鸟群的周围区域。

    在PSO中,每个优化问题的解都是搜索空间中的一只鸟,称之为"粒子",而问题的最优解就对应于鸟群中寻找的"玉米地"。所有的粒子都具有一个位置向量(粒子在解空间的位置)和速度向量(决定下次飞行的方向和速度),并可以根据目标函数来计算当前的所在位置的适应值(fitness value),可以将其理解为距离"玉米地"的距离。在每次的迭代中,种群中的例子除了根据自身的经验(历史位置)进行学习以外,还可以根据种群中最优粒子的"经验"来学习,从而确定下一次迭代时需要如何调整和改变飞行的方向和速度。就这样逐步迭代,最终整个种群的例子就会逐步趋于最优解。

    上面的解释可能还比较抽象,下面通过一个简单的例子来进行说明

    在一个湖中有两个人他们之间可以通信,并且可以探测到自己所在位置的最低点。初始位置如上图所示,由于右边比较深,因此左边的人会往右边移动一下小船。

    现在左边比较深,因此右边的人会往左边移动一下小船

    一直重复该过程,最后两个小船会相遇

    得到一个局部的最优解

    将每个个体表示为粒子。每个个体在某一时刻的位置表示为,x(t),方向表示为v(t)

    p(t)为在t时刻x个体的自己的最优解,g(t)为在t时刻所有个体的最优解,v(t)为个体在t时刻的方向,x(t)为个体在t时刻的位置

    下一个位置为上图所示由x,p,g共同决定了

    种群中的粒子通过不断地向自身和种群的历史信息进行学习,从而可以找到问题的最优解。

    但是,在后续的研究中表表明,上述原始的公式中存在一个问题:公式中V的更新太具有随机性,从而使整个PSO算法的全局优化能力很强,但是局部搜索能力较差。而实际上,我们需要在算法迭代初期PSO有着较强的全局优化能力,而在算法的后期,整个种群应该具有更强的局部搜索能力。所以根据上述的弊端,shi和Eberhart通过引入惯性权重修改了公式,从而提出了PSO的惯性权重模型:

    每一个向量的分量表示如下

    其中w称为是PSO的惯性权重,它的取值介于【0,1】区间,一般应用中均采用自适应的取值方法,即一开始令w=0.9,使得PSO全局优化能力较强,随着迭代的深入,参数w进行递减,从而使的PSO具有较强的局部优化能力,当迭代结束时,w=0.1。参数c1和c2称为学习因子,一般设置为1,4961;而r1和r2为介于[0,1]之间的随机概率值。

    整个粒子群优化算法的算法框架如下:

    step1种群初始化,可以进行随机初始化或者根据被优化的问题设计特定的初始化方法,然后计算个体的适应值,从而选择出个体的局部最优位置向量和种群的全局最优位置向量。

    step2 迭代设置:设置迭代次数,并令当前迭代次数为1

    step3 速度更新:更新每个个体的速度向量

    step4 位置更新:更新每个个体的位置向量

    step5 局部位置和全局位置向量更新:更新每个个体的局部最优解和种群的全局最优解

    step6 终止条件判断:判断迭代次数时都达到最大迭代次数,如果满足,输出全局最优解,否则继续进行迭代,跳转至step 3。

      对于粒子群优化算法的运用,主要是对速度和位置向量迭代算子的设计。迭代算子是否有效将决定整个PSO算法性能的优劣,所以如何设计PSO的迭代算子是PSO算法应用的研究重点和难点。

    ​三、代码

    clc;clear;close all;
    %% 初始化种群
    N = 500;                         % 初始种群个数
    d = 24;                          % 空间维数
    ger = 300;                      % 最大迭代次数   
    
              % 设置位置参数限制(矩阵的形式可以多维)
    vlimit = [-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
        -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
        -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;
        -0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;-0.5, 0.5;];               % 设置速度限制
    c_1 = 0.8;                        % 惯性权重
    c_2 = 0.5;                       % 自我学习因子
    c_3 = 0.5;                       % 群体学习因子 
     for i = 1:d
        x(:,i) = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, 1);%初始种群的位置
    end    
    v = 0.5*rand(N, d);                  % 初始种群的速度
    xm = x;                          % 每个个体的历史最佳位置
    ym = zeros(1, d);                % 种群的历史最佳位置
    fxm = 100000*ones(N, 1);               % 每个个体的历史最佳适应度
    fym = 10000;                      % 种群历史最佳适应度
    %% 粒子群工作
    iter = 1;
    times = 1; 
    record = zeros(ger, 1);          % 记录器
    while iter <= ger
        for i=1:N
         fx(i) = calfit(x(i,:)) ; % 个体当前适应度 
        end
         for i = 1:N      
            if fxm(i) > fx(i)
                fxm(i) = fx(i);     % 更新个体历史最佳适应度
                xm(i,:) = x(i,:);   % 更新个体历史最佳位置
            end 
         end
    if fym > min(fxm)
            [fym, nmax] = min(fxm);   % 更新群体历史最佳适应度
            ym = xm(nmax, :);      % 更新群体历史最佳位置
     end
        v = v * c_1 + c_2 * rand *(xm - x) + c_3 * rand *(repmat(ym, N, 1) - x);% 速度更新
        % 边界速度处理
        for i=1:d 
            for j=1:N
            if  v(j,i)>vlimit(i,2)
                v(j,i)=vlimit(i,2);
            end
            if  v(j,i) < vlimit(i,1)
                v(j,i)=vlimit(i,1);
            end
            end
        end       
        x = x + v;% 位置更新
        % 边界位置处理
        for i=1:d 
            for j=1:N
            if  x(j,i)>limit(i,2)
                x(j,i)=limit(i,2);
            end
            if  x(j,i) < limit(i,1)
                x(j,i)=limit(i,1);
            end
            end
        end
        record(iter) = fym;%最大值记录
        iter = iter+1;
        times=times+1;
    end
    disp(['最小值:',num2str(fym)]);
    disp(['变量取值:',num2str(ym)]);
    figure
    plot(record)
    xlabel('迭代次数');
    ylabel('适应度值')
    
    

    在这里插入图片描述

    5.参考文献:

    [1]陈资,陈春雨,张根保.基于GA-SVM的数控机床装配质量预测模型[J].制造技术与机床,2021(09):97-100+106.

     

    展开全文
  • 粒子群优化SVM 其中代码部分经过测试,实测可用 步骤讲解 1、粒子群是优化的SVM的c和g,由于SVM中的c和g难以选择最优的,故选择PSO来优化,寻找最优的粒子点来作为SVM的c和g。 2、从随机解出发,通过迭代寻找最优解,...

    粒子群优化SVM

    其中代码部分经过测试,实测可用

    步骤讲解

    1、粒子群是优化的SVM的c和g,由于SVM中的c和g难以选择最优的,故选择PSO来优化,寻找最优的粒子点来作为SVM的c和g。
    2、从随机解出发,通过迭代寻找最优解,通过适应度来评价解的质量(适应度函数中打印优化的准确度)。
    3、PSO初始化为一群随机粒子(随机解),然后通过迭代找到最优解。所有的粒子具有位置(particle_position_vector)和速度(velocity_vector)两个属性。 在每一次迭代中,粒子通过粒子本身所找到的最优解pbest和整个种群目前找到的最优解全局极值gbest来更新。
    4、适应度值(实际上是svm的一次运行)
    5、下面代码中的iris.csv前三行展示:

    在这里插入图片描述

    代码

    import pandas as pd
    import numpy as np
    import random
    from sklearn.svm import SVC
    import matplotlib.pyplot as plt
    from sklearn.model_selection import cross_val_predict
    from sklearn.metrics import confusion_matrix
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import cross_val_score
    
    
    # 1.读取训练数据集
    data = pd.read_csv(r"iris.csv")
    x = data.iloc[:, 1:]
    Y = data.iloc[:, 0]
    # print(x.shape)
    
    # 2.标准化
    scaler = StandardScaler()
    X = scaler.fit_transform(x)
    
    # 3.初始化参数
    W = 0.5                                 # 惯性因子
    c1 = 0.2                                # 学习因子
    c2 = 0.5                                # 学习因子
    n_iterations = 10                       # 迭代次数
    n_particles = 50                       # 种群规模
    
    # 4.设置适应度值 输出分类精度得分,返回比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面
    def fitness_function(position):   # 输出
        # 全局极值   svm分类器  核函数gamma  惩罚参数c
        svclassifier = SVC(kernel='rbf', gamma=position[0], C=position[1])
        # 参数gamma和惩罚参数c以实数向量的形式进行编码作为PSO的粒子的位置
        svclassifier.fit(X, Y)
        score = cross_val_score(svclassifier, X, Y, cv=10).mean()                # 交叉验证
        print('分类精度',score)                                                    # 分类精度
        Y_pred = cross_val_predict(svclassifier, X, Y, cv=10)                    # 获取预测值
    
        # 返回混淆函数,分类误差矩阵,分别是训练中的 测试中的 下面输出错误分类结果
        return confusion_matrix(Y, Y_pred)[0][1] + confusion_matrix(Y, Y_pred)[0][2] + confusion_matrix(Y, Y_pred)[1][0] + \
               confusion_matrix(Y, Y_pred)[1][2] + confusion_matrix(Y, Y_pred)[2][0] + confusion_matrix(Y, Y_pred)[2][1]\
            ,  confusion_matrix(Y, Y_pred)[0][1] + confusion_matrix(Y, Y_pred)[0][2] + confusion_matrix(Y, Y_pred)[1][0] + \
               confusion_matrix(Y, Y_pred)[1][2] + confusion_matrix(Y, Y_pred)[2][0] + confusion_matrix(Y, Y_pred)[2][1]
    
    # 5.粒子图
    def plot(position):
        x = []
        y = []
        for i in range(0, len(particle_position_vector)):
            x.append(particle_position_vector[i][0])
            y.append(particle_position_vector[i][1])
        colors = (0, 0, 0)
        plt.scatter(x, y, c = colors, alpha = 0.1)
        # 设置横纵坐标的名称以及对应字体格式
        #font2 = {'family': 'Times New Roman','weight': 'normal', 'size': 20,}
        plt.xlabel('gamma')  # 核函数
        plt.ylabel('C')      # 惩罚函数
        plt.axis([0, 10, 0, 10],)
        plt.gca().set_aspect('equal', adjustable='box') # #设置横纵坐标缩放比例相同,默认的是y轴被压缩了。
        return plt.show()
    
    # 6.初始化粒子位置,进行迭代
    # 粒子位置向量
    particle_position_vector = np.array([np.array([random.random() * 10, random.random() * 10]) for _ in range(n_particles)])
    pbest_position = particle_position_vector    #个体极值等于最初位置
    pbest_fitness_value = np.array([float('inf') for _ in range(n_particles)])   #个体极值的适应度值
    gbest_fitness_value = np.array([float('inf'), float('inf')])    #全局极值的适应度值
    gbest_position = np.array([float('inf'), float('inf')])
    velocity_vector = ([np.array([0, 0]) for _ in range(n_particles)])  # 粒子速度
    # 迭代更新
    iteration = 0
    while iteration < n_iterations:
        # plot(particle_position_vector)  #  粒子具体位置
        for i in range(n_particles):   # 对每个粒子进行循环
            fitness_cadidate = fitness_function(particle_position_vector[i])   # 每个粒子的适应度值=适应度函数(每个粒子的具体位置)
            # print("粒子误差", i, "is (training, test)", fitness_cadidate, " At (gamma, c): ",
                  # particle_position_vector[i])
    
            if (pbest_fitness_value[i] > fitness_cadidate[1]):    # 每个粒子的适应度值与其个体极值的适应度值(pbest_fitness_value)作比较,如果更优的话,则更新个体极值,
                pbest_fitness_value[i] = fitness_cadidate[1]
                pbest_position[i] = particle_position_vector[i]
    
            if (gbest_fitness_value[1] > fitness_cadidate[1]):   # 更新后的每个粒子的个体极值与全局极值(gbest_fitness_value)比较,如果更优的话,则更新全局极值
                gbest_fitness_value = fitness_cadidate
                gbest_position = particle_position_vector[i]
    
            elif (gbest_fitness_value[1] == fitness_cadidate[1] and gbest_fitness_value[0] > fitness_cadidate[0]):
                gbest_fitness_value = fitness_cadidate
                gbest_position = particle_position_vector[i]
    
        for i in range(n_particles):  # 更新速度和位置,更新新的粒子的具体位置
            new_velocity = (W * velocity_vector[i]) + (c1 * random.random()) * (
                        pbest_position[i] - particle_position_vector[i]) + (c2 * random.random()) * (
                                       gbest_position - particle_position_vector[i])
            new_position = new_velocity + particle_position_vector[i]
            particle_position_vector[i] = new_position
    
        iteration = iteration + 1
    
    # 7.输出最终结果
    print("全局最优点的位置是 ", gbest_position, "在第", iteration, "步迭代中(训练集,测试集)错误个数:",
          fitness_function(gbest_position))
    
    
    展开全文
  • 由于支持向量机的主要参数的选择能够在很大程度上影响分类性能和效果,并且目前参数优化缺乏理论指导,提出一种粒子群优化算法以优化支持向量机参数的方法.该方法通过引入非线性递减惯性权值和异步线性变化的学习...
  • 整个粒子群优化算法的算法框架如下: step1种群初始化,可以进行随机初始化或者根据被优化的问题设计特定的初始化方法,然后计算个体的适应值,从而选择出个体的局部最优位置向量和种群的全局最优位置向量。...
  • matlab源码
  • matlab环境下使用PSO算法对SVM多分类器的参数进行优化的案例,代码有详细的注释,另有一篇博客对算法的大致过程有介绍.
  • 亲测有效,可以来看看,大家一起学习。
  • 粒子群优化支持向量机代码(PSO-SVM)

    千次阅读 热门讨论 2021-05-11 20:30:04
    粒子群优化支持向量机代码 import pandas as pd import numpy as np import random from sklearn.svm import SVC import matplotlib.pyplot as plt from sklearn.model_selection import cross_val_predict from ...
  • 粒子群PSO优化LSSVM最小二乘支持向量机的完整程序。亲测可用
  • 【病灶分类】粒子群算法优化SVM病灶分类【含源码 1520期】 二、matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020. [2]杨丹,赵海滨,...
  • 因此,采用粒子群优化(Particle Swarm Optimization,PSO)算法对LS-SVM算法寻找最优超参数,进一步提高LS-SVM对电动机断条故障诊断的效率和准确率有着重要作用。实验结果表明,综合PSO与LS-SVM两种算法的优点,可有效减少...
  • 为了提高花粉浓度预报的准确率,解决现有花粉浓度预报准确率不高的问题,提出了一种基于粒子群优化( PSO)算法和支持向量机( SVM)的花粉浓度预报模型。首先,综合考虑气温、气温日较差、相对湿度、降水量、风力、...
  • 一、粒子群算法优化SVM简介 支持向量机(support vector machine,SVM)是针对有限样本情况的机器学习方法,它的提出根据统计学习理论的VC理论和结构风险最小化原则。支持向量机已经成为智能技术领域研究的热点。它有着...
  • 1 importnumpy as np2 from PSOIndividual importPSOIndividual3 importrandom4 importcopy5 importmatplotlib.pyplot as plt678 classParticleSwarmOptimization:910 '''11 the class for Particle Swarm Optim...
  • phog方法提取图像特征,svm支持向量机进行分类,分别有GA遗传算法和PSO粒子群优化算法进行寻优。
  • self.w = 0.8 self.c1 = 2 self.c2 = 2 self.r1 = 0.6 self.r2 = 0.3 self.pN = pN # 粒子数量 self.dim = dim # 搜索维度 self.max_iter = max_iter # 迭代次数 self.X = np.zeros((self.pN, self.dim)) # 所有...
  • 运行文件PSO,即可运行程序。程序给了相应中文解释。...注:使用的是MATLAB2016a版本,采用MATLAB自带的SVM,若已安装林志仁SVM,则程序可能会运行失败,解决办法:MATLAB设置路径为默认路径,再次运行即可。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 978
精华内容 391
关键字:

粒子群优化svm