浅谈SciPy中的optimize.minimize实现受限优化问题
问题描述:有一批样本x,每个样本都有几个固定的标签,如(男,24岁,上海),需要从中抽取一批样本,使样本总的标签比例满足分布P(x),如(男:女=49%:51%、20岁:30岁=9%:11%、..........)
采用KL-散度作为优化目标函数。
KL-散度又叫相对熵
KL-散度在机器学习中,P用来表示样本的真实分布,比如[1,0,0]表示当前样本属于第一类。Q用来表示模型所预测的分布,比如[0.7,0.2,0.1]
KL-散度直观的理解就是如果用P来描述样本,那么就非常完美。而用Q来描述样本,虽然可以大致描述,但是不是那么的完美,信息量不足,需要额外的一些“信息增量”才能达到和P一样完美的描述。如果我们的Q通过反复训练,也能完美的描述样本,那么就不再需要额外的“信息增量”,Q等价于P。
公式:
使用SciPy中的optimize.minimize来进行优化。
defminimize(fun,x0,args=(),method=None,jac=None,hess=None, hessp=None,bounds=None,constraints=(),tol=None, callback=None,options=None):
几个重要的参数:
fun:目标函数(heobjectivefunctiontobeminimized);
x0:参数初始值(Initialguess.Arrayofrealelementsofsize(n,));
bounds:参数取值范围限制(BoundsonvariablesforL-BFGS-B,TNC,SLSQPandtrust-constrmethods.)
constraints:约束函数(Constraintsdefinition(onlyforCOBYLA,SLSQPandtrust-constr)
ConstraintsforCOBYLA,SLSQParedefinedasalistofdictionaries. Eachdictionarywithfields: type:str Constrainttype:'eq'forequality,'ineq'forinequality. fun:callable Thefunctiondefiningtheconstraint. jac:callable,optional TheJacobianof`fun`(onlyforSLSQP). args:sequence,optional ExtraargumentstobepassedtothefunctionandJacobian. )
tol:目标函数误差范围,控制迭代结束(optionalTolerancefortermination.Fordetailedcontrol,usesolver-specificoptions.)options:其他一些可选参数(dict,optionalAdictionaryofsolveroptions.Allmethodsacceptthefollowinggenericoptions:)
求解过程:
定义优化函数:
defobj_function(x):其中x为要优化的变量,在本问题中有480类的样本(如:男,24岁,上海),每类样本10-1000个不等,x为每类抽取的比例。要从中抽取50000个样本,满足22个约束条件(男:女=50%:50%、20岁:30岁=9%:11%等等)。
例如:男性要占总样本的50%,则
选择优化函数。SciPy中可以使用bounds参数的算法有:L-BFGS-B,TNC,SLSQPandtrust-constr,可以使用constraints参数的算法有:COBYLA,SLSQPandtrust-constr
调参:optimize.minimize有统一的参数,但每个优化算法都有自己特有的参数,可以看源码中的参数列表。
运行:res=optimize.minimize(sample_fun,np.array(x0),bounds=bound,method='L-BFGS-B',tol=1e-11,options={'disp':True,'maxiter':300,'maxfun':1500000}),最终的结果保存在res.x中
如果程序没达到指定的迭代次数就停止,可能有两种原因:
STOP:TOTALNO.offANDgEVALUATIONSEXCEEDSLIMIT增大参数maxfun;
CONVERGENCE:REL_REDUCTION_OF_F_<=_FACTR*EPSMCH调小参数tol
以上这篇浅谈SciPy中的optimize.minimize实现受限优化问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。