Levenberg_Marquardt神经网络算法研究_董一芬
- 格式:pdf
- 大小:111.02 KB
- 文档页数:1
第21卷第3期 2021年3月黑龙江工业学院学报JOURNAL OF HEILONGJIANG UNIVERSITY OF TECHNOLOGYVol.21 No. 3Mar. 2021文章编号:2096 -3874(2021)03-0112 -06基于 Levenberg- Marquardt算法的串联协作机器人精度标定研究李杨1,金小飞2,刘国锋1,吴明明1(1.安徽三联学院机械工程学院,安徽合肥230000;2.哈工大机器人(合肥)国际创新研究院,安徽合肥230000)摘要:目前研究的串联协作机器人精度标定方法标定误差较大,导致定位精度较低。
为 解决上述问题,基于Levenberg - M arquardt算法研究了一种新的串联协作机器人精度标定方法,参照空间坐标系转换原理和运动行为参数,将多个机器人的每个关节看作标杆,机器人通过思维规划完成需要执行的运行指令,并将指令拆分,转化为坐标的形式,通过共享模式与其他机器人行为互通,保证串联协作机器人精度标定行为的连贯性,根据Levenberg - M arquardt算法对协作机器人精度标定模型结果进行优化处理,将机器人在完成任务的基础上,需要移动的范围内固定好标定板,实现精度标定。
实验结果表明,基于Levenberg - M arquardt算法的串联协作机器人精度标定方法能够有效减少标定误差,提高定位精度。
关键词:Levenberg - M arquardt算法;串联协作机器人;标定原理;机器人行为中图分类号:TP242 文献标识码:A随着科技的发展,针对机器人的程序化和思 维单一的特点,在工作过程中会出现一定的偏差,因此机器人研究人员制定一系列的串联协作机器 人精度标定方法来制约机器人的行为[1<。
机器人的行为精度是评估机器人性能的重要 指标之一,串联协作机器人在完成一项任务中需 要两个或者两个以上的机器人共同完成,因此对 于机器人的行为精度要求更加严格,一旦任意一 个机器人出现错误操作,就会使任务执行失败。
求解非线性不适定算子方程的一种Landweber迭代法王美吉;潘状元【摘要】针对Landweber迭代方法在非线性不适定问题上进行研究.在非线性算子和右端数据皆为近似的前提条件下,基于Frozen Landweber迭代法,提出双扰动的双循环Landweber迭代格式.在一定的条件下,通过证明迭代格式的单调性和收敛性,得出该迭代格式是有效的.【期刊名称】《哈尔滨商业大学学报(自然科学版)》【年(卷),期】2013(029)005【总页数】4页(P588-591)【关键词】非线性不适定问题;Landweber迭代法;收敛性【作者】王美吉;潘状元【作者单位】哈尔滨理工大学应用科学学院,哈尔滨150080;哈尔滨理工大学应用科学学院,哈尔滨150080【正文语种】中文【中图分类】O2411 引言考虑非线性算子方程其中:F:D(F)⊂X→Y,X,Y为 Hilbert空间.F是Frechet可微.这里考虑算子方程的解不连续依赖于右端数据的情况.由于不稳定性并且在实际问题中只有近似数据yδ满足这里为测量误差δ>0的界.对于此类非线性问题的解法,一般通过正则化方法来得到其解的近似.由于非线性不适定问题在生活中的广泛应用,已经成为横跨应用数学和计算数学两个学科的真正的研究领域[1].其理论研究大致有以下几个方面如Tikhonov正则化方法,最大嫡方法,有限维逼近等[2-5].对于非线性问题人们对Landweber迭代法给予了很大关注,文献[5]证明了Frogen Landweber 迭代法的收敛性并进行了数值试验.由于在实际问题中,算子一般也是经测量而获得的近似值,或是由离散过程而得到的原算子的一个有限维的逼近,因此真正要求解的是式(1)的一个近似方程其中:h表示Fh逼近F的程度,假定满足因此,在考虑Landweber迭代时,也应考虑算子亦有扰动的情况.假定扰动算子Fh仍保持算子F的Frechet可微且F'h在D(F)上一致收敛于F'(当h→0),本文在前人研究成果基础上提出了非线性算子方程算子与右端皆有扰动的Landweber迭代法.迭代格式为按广义误差准则来确定迭代终止步k*,则迭代序列{xδh k*}收敛到不失一般性,假定其中:βρ(x0)为以x0为中心,ρ>0的开球.2 单调性分析对于上述迭代格式,本文以m=2为例,理论验证此迭代格式的收敛性.则此迭代带格式可以改写成引理1 [6]如果式(3)成立,x*是方程(1)在βρ(x0)中的一个解,那么任意解∈βρ(x0)满足,,反之亦然,N(·)表示算子的核空间.证明:由条件(3)可得满足对所有的x∈,此引理得证.引理 2[7-8]假设 x* 为式(1)在βρ(x0)中的一个解,对于扰动数据满足‖yδ-y‖≤δ,k*是按广义误差准则(4)所确定的迭代终止步.若条件(3)、(5)成立,则有当δ=h=0时证明:由引理2知,由式(4)和假设条件有证明方法见文献[5].3 收敛性分析定理2 如果在Bρ/2(x*)中满足式(3)、(5),算子方程(1)可解,则xk收敛到式(1)的一个解x*∈Bρ/2(x*).若x+是离x0最近的惟一解,且N(F'(x+))⊂(F'(x)),成立,则xk收敛到x+.证明:令ek:x*-xk由定理1知{‖ek‖}单调下降,下界为某ε≥0,下证{ek}是 Cauchy 列.对j≥k,取l(j≥l≥k)使成立由三角不等式,有下证明(el-ek,el)也收敛到零(当k→∞时)改写由引理 2 推知,当 k,l→∞ 时 xl,1 - xl,xk,1 - xk趋于零.令由此得{ek}为 Cauchy列,所以{xk}也为Cauchy列.设xk→x*,又因为F(xk)→y(k→∞),从而x*为式(1)的解.若式(1)有惟一的距x0最近的解,则x+满足对任何 k=0,1,2,…若,N(F'(x+))⊂N(F'(xk)),则有证毕.定理3 在定理2的前提条件下,方程(1)可解,取h=0,扰动终止于K*(δ).那么当δ→0时,收敛到式(1)的解.证明参见文献[5]中命题3.当h≠0时,设(δ,h)为由式(4)确定的迭代终止步,令K*=max{k*(δ),K'*(δ,h)}其中k*(δ)为定理3中的迭代终止步,则有因为)趋于零,易知(el-ek,el)趋于零.同理可证定理4 假设条件(3)(5)成立,方程(1)可解,则当h→0,δ→0 时,xδh k*收敛到(1)的解.证明用归纳法易证,上式第一项当h→0时趋于零,而由定理3,第二项当δ→0时也是趋于零的,从而4 结语针对非线性不适定问题的求解,本文首先从Frozen Landweber迭代法入手,提出非线性算子和右端数据皆有扰动的Landweber迭代法.并且对所提出的迭代格式给出了收敛性证明.从理论分析可以看出,Frozen Landweber迭代法确实是求解非线性不适定算子方程的一种简单而稳定的方法,适合于处理算子与右端数据皆有扰动的实际问题,并且避开了Tikhonov正则化方法正则参数选取困难以及传统的Langweber迭代法收敛太慢的问题.不足之处是没有对此迭代格式进行数值试验,这将是下一步进行的工作.参考文献:[1]DENG Y J,LIU Z H.New fast iteration for determining surface temperature and heat flux of general sideways parabolic equation[J].Nonlinear Anal.Real World Appl.,2011,12(1):156 -166.[2]ZHENG G H,WEI T.Two regularization methods for solving a Riesz-Feller space-frational backward diffusion problem[J].Inverse Problems,2010,26:1 -22.[3]JIN Q N.On a regularized Levenberg-Marquardt method for solving nonlinear inverse problems[J].Numer.Math.,2010.115:229-259.[4]YANGQQ,LIU F W,TURNER I.Numerical methods for fraction partial differential equations with Riesz space fractional derivatives[J].Appl Math Model.,2010,34:200 -218.[5]XU J,HAN B,LI L.Frozen Landweber Iteration for Nonlinear Ill-Posed problems[J].Acta Mathematicae Applicatae Sinica,2007,23(2):329 -336.[6]HANKE M.Accelerated Landweber Iterations for the Solution of Ill-Posed Equations[J].Numer.Math,1991,60(1):341 -373.[7]韩波,刘家琦,后步风.非线性不适定算子方程算子与右端项皆有扰动的Land weber迭代法[J].计算数学,2002,24(4):479-486.[8]皮丽敏,潘状元.一族求解非线性方程的高阶迭代方法[J].哈尔滨商业大学学报:自然科学版,2012,28(6):751-753,768.。
神经网络的Levenberg-Marquardt算法研究摘要:本文主要介绍LM(Levenberg-Marquardt)神经网络算法,LM算法是梯度下降法和高斯—牛顿法的结合,这种神经网络算法综合了这两种方法的优点,在一定程度上克服了基本的BP网络收敛速度慢和容易陷入局部最小点等问题。
对LM算法的计算步骤作了简要的阐述。
最后介绍了LM神经网络算法再监督控制上的应用。
关键词:神经网络;LM算法;计算步骤;监督控制0 引言神经网络BP学习算法在理论上具有逼近任意非线性连续映射的能力,在非线性系统的建模及控制领域里有着广泛的应用。
然而BP 算法存在一些不足,主要是收敛速度很慢;往往收敛于局部极小点;数值稳定性差,学习率、动量项系数和初始权值等参数难以调整,非线性神经网络学习算法LM可以有效地克服BP算法所存在的这些缺陷[1]。
LM算法是高斯—牛顿法和最速下降法的结合,具有高斯—牛顿法的局部收敛性和梯度下降法的全局特性。
它通过自适应调整阻尼因子来达到收敛特性,具有更高的迭代收敛速度,在很多非线性优化问题中得到了稳定可靠解。
在LM算法的计算过程中,初值是一个很重要的因素。
若选择的初值X0接近真值时,收敛速度很快且能够得到全局最优解,但如果初值远离真解时,优化结果往往过早的陷入局部最优解从而得到的结果完全背离真解。
要解决该问题,一是通过得到大量的原始信息来对真值有一个较准确的估计,但这在实际问题中往往不太可能达到;另外就是选择一种合理的全局最优化算法与其相结合,消除LM算法对初值的依赖且具有很快的收敛速度[2]。
1 神经网络神经网络具有高度的自学习、自组织和自适应能力,能通过学习和训练获取网络的权值和结构。
多层前向神经网络具有理论上可逼近任意非线性连续映射的能力,因而非常适合于非线性系统的建模及控制,是目前使用较多的一种神经网络模型[3]。
BP网络(Back Propagation Network)称为误差反向传播神经网络,它是一种能朝着满足给定的输入/输出关系方向进行自组织的神经网络,其典型的结构图如图1所示,由三部分组成:输入层、隐含层、输出层,三部分之间通过各层节点之间的连接权依次前向连接。
基于Levenberg-Marquardt训练算法的BP⽹络Python实现经过⼀个多⽉的努⼒,终于完成了BP⽹络,参考的资料为:1、Training feed-forward networks with the Marquardt algorithm2、The Levenberg-Marquardt method for nonlinear least squares curve-fitting problems3、Neural Network Design4、/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B 中介绍的神经⽹络部分以下给出Python脚本:import numpy as npfrom math import exp, powfrom mpl_toolkits.mplot3d import Axes3Dimport matplotlib.pyplot as pltimport sysimport copyfrom scipy.linalg import norm, pinvclass Layer:def __init__(self,w, b, neure_number, transfer_function, layer_index):self.transfer_function = transfer_functionself.neure_number = neure_numberyer_index = layer_indexself.w = wself.b = bclass NetStruct:def __init__(self, x, y, hidden_layers, activ_fun_list, performance_function = 'mse'):if len(hidden_layers) == len(activ_fun_list):activ_fun_list.append('line')self.active_fun_list = activ_fun_listself.performance_function = performance_functionx = np.array(x)y = np.array(y)if(x.shape[1] != y.shape[1]):print 'The dimension of x and y are not same.'sys.exit()self.x = xself.y = yinput_eles = self.x.shape[0]output_eles = self.y.shape[0]tmp = []tmp.append(input_eles)tmp.extend(hidden_layers)tmp.append(output_eles)self.hidden_layers = np.array(tmp)yer_num = len(self.hidden_layers)yers = []for i in range(0, len(self.hidden_layers)):if i == 0:yers.append(Layer([],[],\self.hidden_layers[i], 'none', i))continuef = self.hidden_layers[i - 1]s = self.hidden_layers[i]yers.append(Layer(np.random.randn(s, f),np.random.randn(s, 1),\self.hidden_layers[i], activ_fun_list[i-1], i))class Train:def __init__(self, net_struct, mu = 1e-3, beta = 10, iteration = 100, tol = 0.1):_struct = net_structself.mu = muself.beta = betaself.iteration = iterationself.tol = toldef train(self, method = 'lm'):if(method == 'lm'):self.lm()def sim(self, x):_struct.x = xself.forward()layer_num = len(_yers)predict = _yers[layer_num - 1].output_valreturn predictdef actFun(self, z, activ_type = 'sigm'):if activ_type == 'sigm':f = 1.0 / (1.0 + np.exp(-z))elif activ_type == 'tanh':f = (np.exp(z) + np.exp(-z)) / (np.exp(z) + np.exp(-z))elif activ_type == 'radb':f = np.exp(-z * z)elif activ_type == 'line':f = zreturn fdef actFunGrad(self, z, activ_type = 'sigm'):if activ_type == 'sigm':grad = self.actFun(z, activ_type) * (1.0 - self.actFun(z, activ_type))elif activ_type == 'tanh':grad = 1.0 - self.actFun(z, activ_type) * self.actFun(z, activ_type)elif activ_type == 'radb':grad = -2.0 * z * self.actFun(z, activ_type)elif activ_type == 'line':m = z.shape[0]n = z.shape[1]grad = np.ones((m, n))return graddef forward(self):layer_num = len(_yers)for i in range(0, layer_num):if i == 0:curr_layer = _yers[i]curr_layer.input_val = _struct.xcurr_layer.output_val = _struct.xcontinuebefore_layer = _yers[i - 1]curr_layer = _yers[i]curr_layer.input_val = curr_layer.w.dot(before_layer.output_val) + curr_layer.bcurr_layer.output_val = self.actFun(curr_layer.input_val,_struct.active_fun_list[i - 1])def backward(self):layer_num = len(_yers)last_layer = _yers[layer_num - 1]last_layer.error = -self.actFunGrad(last_layer.input_val,_struct.active_fun_list[layer_num - 2])layer_index = range(1, layer_num - 1)layer_index.reverse()for i in layer_index:curr_layer = _yers[i]curr_layer.error = (last_layer.w.transpose().dot(last_layer.error)) \* self.actFunGrad(curr_layer.input_val,_struct.active_fun_list[i - 1])last_layer = curr_layerdef parDeriv(self):layer_num = len(_yers)for i in range(1, layer_num):befor_layer = _yers[i - 1]befor_input_val = befor_layer.output_val.transpose()curr_layer = _yers[i]curr_error = curr_layer.errorcurr_error = curr_error.reshape(curr_error.shape[0]*curr_error.shape[1], 1, order='F')row = curr_error.shape[0]col = befor_input_val.shape[1]a = np.zeros((row, col))num = befor_input_val.shape[0]neure_number = curr_layer.neure_numberfor i in range(0, num):a[neure_number*i:neure_number*i + neure_number,:] = \np.repeat([befor_input_val[i,:]],neure_number,axis = 0)tmp_w_par_deriv = curr_error * acurr_layer.w_par_deriv = np.zeros((num, befor_layer.neure_number * curr_layer.neure_number)) for i in range(0, num):tmp = tmp_w_par_deriv[neure_number*i:neure_number*i + neure_number,:]tmp = tmp.reshape(tmp.shape[0] * tmp.shape[1], order='C')curr_layer.w_par_deriv[i, :] = tmpcurr_layer.b_par_deriv = curr_layer.error.transpose()def jacobian(self):layers = _struct.hidden_layersrow = _struct.x.shape[1]col = 0for i in range(0, len(layers) - 1):col = col + layers[i] * layers[i + 1] + layers[i + 1]j = np.zeros((row, col))layer_num = len(_yers)index = 0for i in range(1, layer_num):curr_layer = _yers[i]w_col = curr_layer.w_par_deriv.shape[1]b_col = curr_layer.b_par_deriv.shape[1]j[:, index : index + w_col] = curr_layer.w_par_derivindex = index + w_colj[:, index : index + b_col] = curr_layer.b_par_derivindex = index + b_colreturn jdef gradCheck(self):W1 = _yers[1].wb1 = _yers[1].bn = _yers[1].neure_numberW2 = _yers[2].wb2 = _yers[2].bx = _struct.xp = []p.extend(W1.reshape(1,W1.shape[0]*W1.shape[1],order = 'C')[0])p.extend(b1.reshape(1,b1.shape[0]*b1.shape[1],order = 'C')[0])p.extend(W2.reshape(1,W2.shape[0]*W2.shape[1],order = 'C')[0])p.extend(b2.reshape(1,b2.shape[0]*b2.shape[1],order = 'C')[0])old_p = pjac = []for i in range(0, x.shape[1]):xi = np.array([x[:,i]])xi = xi.transpose()ji = []for j in range(0, len(p)):W1 = np.array(p[0:2*n]).reshape(n,2,order='C')b1 = np.array(p[2*n:2*n+n]).reshape(n,1,order='C')W2 = np.array(p[3*n:4*n]).reshape(1,n,order='C')b2 = np.array(p[4*n:4*n+1]).reshape(1,1,order='C')z2 = W1.dot(xi) + b1a2 = self.actFun(z2)z3 = W2.dot(a2) + b2h1 = self.actFun(z3)p[j] = p[j] + 0.00001W1 = np.array(p[0:2*n]).reshape(n,2,order='C')b1 = np.array(p[2*n:2*n+n]).reshape(n,1,order='C')W2 = np.array(p[3*n:4*n]).reshape(1,n,order='C')b2 = np.array(p[4*n:4*n+1]).reshape(1,1,order='C')z2 = W1.dot(xi) + b1a2 = self.actFun(z2)z3 = W2.dot(a2) + b2h = self.actFun(z3)g = (h[0][0]-h1[0][0])/0.00001ji.append(g)jac.append(ji)p = old_preturn jacdef jjje(self):layer_number = _yer_nume = _struct.y - \_yers[layer_number - 1].output_vale = e.transpose()j = self.jacobian()#check gradient#j1 = -np.array(self.gradCheck())#jk = j.reshape(1,j.shape[0]*j.shape[1])#jk1 = j1.reshape(1,j1.shape[0]*j1.shape[1])#plt.plot(jk[0])#plt.plot(jk1[0],'.')#plt.show()jj = j.transpose().dot(j)je = -j.transpose().dot(e)return[jj, je]def lm(self):mu = self.mubeta = self.betaiteration = self.iterationtol = self.toly = _struct.yself.forward()pred = _yers[_yer_num - 1].output_val pref = self.perfermance(y, pred)for i in range(0, iteration):print 'iter:',i, 'error:', pref#1) step 1:if(pref < tol):break#2) step 2:self.backward()self.parDeriv()[jj, je] = self.jjje()while(1):#3) step 3:A = jj + mu * np.diag(np.ones(jj.shape[0]))delta_w_b = pinv(A).dot(je)#4) step 4:old_net_struct = copy.deepcopy(_struct)self.updataNetStruct(delta_w_b)self.forward()pred1 = _yers[_yer_num - 1].output_valpref1 = self.perfermance(y, pred1)if (pref1 < pref):mu = mu / betapref = pref1breakmu = mu * beta_struct = copy.deepcopy(old_net_struct)def updataNetStruct(self, delta_w_b):layer_number = _yer_numindex = 0for i in range(1, layer_number):before_layer = _yers[i - 1]curr_layer = _yers[i]w_num = before_layer.neure_number * curr_layer.neure_numberb_num = curr_layer.neure_numberw = delta_w_b[index : index + w_num]w = w.reshape(curr_layer.neure_number, before_layer.neure_number, order='C') index = index + w_numb = delta_w_b[index : index + b_num]index = index + b_numcurr_layer.w += wcurr_layer.b += bdef perfermance(self, y, pred):error = y - predreturn norm(error) / len(y)def plotSamples(self, n = 40):x = np.array([np.linspace(0, 3, n)])x = x.repeat(n, axis = 0)y = x.transpose()z = np.zeros((n, n))for i in range(0, x.shape[0]):for j in range(0, x.shape[1]):z[i][j] = self.sampleFun(x[i][j], y[i][j])fig = plt.figure()ax = fig.gca(projection='3d')surf = ax.plot_surface(x, y, z, cmap='autumn', cstride=2, rstride=2)ax.set_xlabel("X-Label")ax.set_ylabel("Y-Label")ax.set_zlabel("Z-Label")plt.show()def sinSamples(n):x = np.array([np.linspace(-0.5, 0.5, n)])#x = x.repeat(n, axis = 0)y = x + 0.2z = np.zeros((n, 1))for i in range(0, x.shape[1]):z[i] = np.sin(x[0][i] * y[0][i])X = np.zeros((n, 2))n = 0for xi, yi in zip(x.transpose(), y.transpose()):X[n][0] = xiX[n][1] = yin = n + 1return X,zdef peaksSamples(n):x = np.array([np.linspace(-3, 3, n)])x = x.repeat(n, axis = 0)y = x.transpose()z = np.zeros((n, n))for i in range(0, x.shape[0]):for j in range(0, x.shape[1]):z[i][j] = sampleFun(x[i][j], y[i][j])X = np.zeros((n*n, 2))x_list = x.reshape(n*n,1 )y_list = y.reshape(n*n,1)z_list = z.reshape(n*n,1)n = 0for xi, yi in zip(x_list, y_list):X[n][0] = xiX[n][1] = yin = n + 1return X,z_list.transpose()def sampleFun(x, y):z = 3*pow((1-x),2) * exp(-(pow(x,2)) - pow((y+1),2)) \- 10*(x/5 - pow(x, 3) - pow(y, 5)) * exp(-pow(x, 2) - pow(y, 2)) \- 1/3*exp(-pow((x+1), 2) - pow(y, 2))return zif __name__ == '__main__':hidden_layers = [10,10] #设置⽹络层数,共两层,每层10个神经元activ_fun_list = ['sigm','sigm']#设置隐层的激活函数类型,可以设置为tanh,radb,tanh,line类型,如果不显式的设置最后⼀层为line[X, z] = peaksSamples(20) #产⽣训练数据点X = X.transpose()bp = NetStruct(X, z, hidden_layers, activ_fun_list) #初始化⽹络信息tr = Train(bp) #初始化训练⽹络的类tr.train() #训练[XX, z0] = peaksSamples(40) #产⽣测试数据XX = XX.transpose()z1 = tr.sim(XX) #⽤训练好的神经⽹络预测数据,z1为预测结果fig = plt.figure()ax = fig.add_subplot(111)ax.plot(z0[0]) #真值ax.plot(z1[0],'r.') #预测值plt.legend((r'real data', r'predict data'))plt.show()以上代码计算的结果如下图,由于初始值等原因的影响偶尔收敛效果会变差,不过⼤多数时候都可以收敛到下图的结果,以后再改进,欢迎指正。
levenberg-marquardt方法Levenberg-Marquardt方法是一种数值优化方法。
该方法主要是解决非线性最小二乘问题,是用于求解参数估计、函数拟合等问题的重要手段。
本文主要介绍Levenberg-Marquardt方法的原理、算法以及应用。
一、Levenberg-Marquardt方法的原理在介绍Levenberg-Marquardt方法之前,我们先介绍最小二乘问题。
最小二乘问题可以表示为:$$\min_{x\in R^n}||f(x)||_2^2$$其中,$f(x)$是一个从$R^n$到$R^m$,$m>n$的非线性函数。
我们要找到一个向量$x$,使得$f(x)$的平方范数最小。
我们可以使用梯度下降等方法进行求解,但是,这些方法存在收敛慢、易陷入局部最优等问题。
Levenberg-Marquardt方法就是为了解决这些问题而出现的。
Levenberg-Marquardt方法的主要思想是在牛顿法中加入一个衰减因子,这个衰减因子可以保证算法更快、更稳定地收敛到最优解。
具体而言,Levenberg-Marquardt方法将牛顿法中的Hessian矩阵加上一个一定的正定矩阵,这个正定矩阵的大小可以动态调整。
当这个矩阵的大小较小时,Levenberg-Marquardt方法就相当于梯度下降法;当这个矩阵的大小较大时,Levenberg-Marquardt方法就相当于牛顿法。
这个正定矩阵的大小可以通过迭代过程中的误差大小来动态调整。
二、Levenberg-Marquardt方法的算法Levenberg-Marquardt方法的算法可以表示为:输入:函数$f(x)$,初值$x_0$,最大迭代次数$maxIter$,误差容限$eps$,衰减因子$\lambda$,正定矩阵$J^TJ$。
输出:使得$f(x)$的平方范数最小的解$x$。
1.令$x=x_0$,$k=0$。
2.计算函数$f(x)$在$x$处的梯度$g_k=J_k^T(y_k-f_k)$,其中$y_k$是$f(x)$的近似值,$J_k$是$f(x)$在$x$处的雅可比矩阵,$f_k=f(x_k)$。
求解非线性方程组的一种新的全局收敛的levenberg—marquardt算法
Levenberg-Marquardt算法是一种全局收敛的求解非线性
方程组的算法,该算法是由Levenberg和Marquardt在1950年
从拟牛顿法的基础上发展而来的。
它能有效地求解非线性方程组,它兼顾了牛顿法的全局收敛性和梯度下降法的局部收敛性,是目前公认的非线性方程组求解中最有效的方法之
Levenberg-Marquardt算法是一种局部拟牛顿法,其基本
思想是在牛顿法的基础上引入一个收敛参数,以达到牛顿法的局部收敛性和全局收敛性的综合。
因此,Levenberg-Marquardt
算法在求解非线性方程组时具有较快的收敛速度和高的精度。
Levenberg-Marquardt算法的具体步骤如下:
1、建立拟牛顿法的迭代公式:DD=(DDD+λD)D−DDD;其中,DD表示迭代步长,J为雅可比矩阵,A为单位矩阵,F
为残差向量,λ为收敛参数。
2、根据迭代公式计算迭代步长DD。
3、根据迭代步长更新变量的值:D=D+DD;
4、根据新的变量值重新计算残差:D=D(D);
5、检查收敛情况,如果迭代收敛,则结束;如果未收敛,则更新收敛参数λ,重复步骤1~
4,直到收敛结束。
Levenberg-Marquardt算法是一种全局收敛的求解非线性
方程组的算法,它能够有效地求解非线性方程组,是目前公认的求解非线性方程组的最有效方法之
一。
它在求解非线性方程组时,兼顾了牛顿法的全局收敛性和梯度下降法的局部收敛性,使得它在求解非线性方程组时具有较快的收敛速度和高的精度。
Levenberg-Marquardt神经网络算法研究作者:董一芬来源:《商场现代化》2009年第07期[摘要] 前馈神经网络中的向后传播算法(Backpropagation (BP) Algorithm)算法存在固有的缺陷,Levenberg-Marquardt神经网络算法可以有效地克服这一点BP算法的缺陷。
本文给出了Levenberg-Marquardt算法。
[关键词] 前馈神经网络 Levenberg-Marquardt算法 BP算法前馈神经网络BP学习算法在理论上具有逼近任意非线性连续映射的能力,在非线性系统的建模及控制领域里有着广泛的应用。
然而BP 算法存在一些不足, 主要是收敛速度很慢; 往往收敛于局部极小点; 数值稳定性差, 学习率、动量项系数和初始权值等参数难以调整,非线性神经网络学习算法Levenberg-Marquardt可以有效地克服BP算法所存在的这些缺陷。
一、前馈神经网络前馈神经网络由输入层、隐层和输出层组成。
令u=[u1,u2,Λ,um]T,y=[y1,y2,Λ,yn]T络的输入、输出向量, 令X=[x1,x2,Λ,xN]T为网络的权及阈值的全体所组成的向量。
给定P组输入输出训练样本定义网络的误差指标函数为:(1)(2)然后就可以按照各种学习算法开始对X进行训练, 得到最优Xopt, 使得二、Levenberg-Marquardt神经网络算法1.给定初始点X(0), 精度,σ,k=0。
2.对i=1,2,…,M求fi(X(k)),得向量对i=1,2,…,M求得Jacobi矩阵3.解线性方程组求出搜索梯度方向h(k)。
4.直线搜索,其中λk满足5.若则得到解Xopt,转向7(停止计算); 否则转向6。
6.F(X(k+1))<F(X(k)),则令,k=k+1, 转向2; 否则=*ξ,转向3。
7.停止计算在实际操作中,是一个试探性的参数,对于给定的,如果求得的h(k)能使误差函数Ep(X)降低,则被因子ξ除;若误差函数Ep(X)增加,则乘以因子ξ。
基于遗传算法改进的BP神经网络算法刘蕊蕊;于合谣;冀鹏飞【摘要】针对一般BP算法收敛速度慢,易收敛到局部极小点等问题, 通过对实验的研究分析提出基于遗传算法和Levenberg-Marquardt算法的改进的BP算法用以解决BP算法在神经网络优化过程中存在的问题, 并对改进的算法、基于Levenberg-Marquardt的BP算法、一般BP学习算法进行仿真实验.仿真结果表明:将具有整体收敛特点的遗传算法及具有快速收敛优势的Levenberg-Marquardt算法与BP算法结合起来有助于提高网络的收敛性能, 从而证明了提出的算法的有效性.【期刊名称】《德州学院学报》【年(卷),期】2017(033)004【总页数】4页(P38-41)【关键词】BP算法;遗传算法;Levenberg-Marquardt算法;神经网络【作者】刘蕊蕊;于合谣;冀鹏飞【作者单位】山东科技大学数学与系统科学学院,青岛 266590;山东科技大学数学与系统科学学院,青岛 266590;山东科技大学数学与系统科学学院,青岛 266590【正文语种】中文【中图分类】TP301.6人工神经网络(ANN)学习算法[1]在人工智能领域中有着举足轻重的影响,ANN系统是由大量的神经元以网络权值为桥梁连接而成.目前,神经网络学习算法在信息处理、模式识别、智能控制及系统建模等领域得到十分广泛的应用[2,3].尤其是误差反向传播算法(BP网络),它的应用领域更加广泛,主要因为它可以对任意非线性连续函数进行逼近, 非线性映射能力较强,而且神经网络的层数、神经元个数、训练次数及学习速率等参数可根据实际情况设定,灵活性很强.但BP网络也有它本身的局限性,BP神经网络收敛速度慢、容易收敛到局部极小等缺点[4],对于如何解决这一问题研究者们做了很大努力并提出许多方法:文献[5]提出改进共轭梯度算法来提高神经网络算法的收敛速度,文献[6]最优权值的取得是通过研究线性函数和Cauchy 不等式,文献[7,8]给出用遗传算法选取BP神经网络的最优权值,文献[9,10]是对如何将蚁群算法应用到BP神经网络的研究,文献[11,12]是利用模拟退火算法、动态增加隐含层数对BP算法进行改进.文献[13]通过加入动量因子改进BP神经算法.虽然对BP算法的改进做了许多研究,但仍存在不足.本文提出一种新的改进方法来解决神经网络算法中存在的问题,即利用遗传算法全局搜索能力和Levenberg-Marquardt(L-M)算法[14]快速收敛的特点将遗传算法和L-M算法应用到BP网络算法中,以便提高BP学习算法的全局收敛速度以及改善其容易收敛到局部极小点的问题.BP神经网络包含输入层、隐含层和输出层三部分,在学习过程中有正向传播和反向传播两种传播方式.假设输入层、输出层、隐含层的神经元个数分别为n,p,q,K为数据样本个数,则有以下的变量定义.网络输入向量:Xk=[xk1,xk2,…,xkn];网络的实际输出向量:Yk=[yk1,yk2,…,ykq];网络的期望输出向量:Dk=[dk1,dk2,…,dkq];其中k=1,…,K.ω,θ,α分别为权值、阈值、学习速率.1)正向传播.为网络选取输入样本Xk和目标样本Dk.隐含层第h个神经元的输入、输出,输出层第j个神经元的输入、输出分别为Ykh=f(Ikh), h=1,2,…,p;Ykj=f(Ikj), j=1,…,q.式中θki=ωkh0,xk0=1,θkj=ωkj0,Yk0=1,为了方便计算,将阈值和权值一块处理, f一般采用S型激活函数该样本的输出误差为网络总误差为2)反向传播.如果误差不在设定的范围内,则BP算法通过梯度下降法来调整权值,权值的修正公式为虽然通过梯度下降法可以起到优化网络的作用,但BP网络有它本身的局限性,故本文提出以下方法来改进BP算法.3.1 遗传算法与BP网络算法耦合计算步骤通过遗传算法[15-17]全局寻优,可筛选出最优个体,和BP网络耦合计算可以发挥各自的优点,使得网络同时具有BP网络算法的非线性插值的计算能力以及遗传算法的整体性寻优计算的特点,从而得到更加准确的数据作为BP神经网络的权值,进而提高BP网络模型的稳定性和准确性,起到更好的优化效果.遗传算法对BP学习算法的权值进行优化的学习过程如下1)网络权值集合由随意产生的二进制字符串表示,可以通过编解码进行转化;2)遗传算法的适应度函数和神经网络的总误差函数有关,适应度函数的表达式为其中表示神经网络的总误差.3)各个网络的权值由各二进制字符串解码而成,通过网络训练对网络的性能特点进行评价,假设群体的规模为n,则个体i被算法选择的概率为式中,fi为第i个染色体的适应度值,每个染色体被选择的概率为Pi.4)网络被选择以后以事先设定的概率值Pc、Pm进行交叉、变异等遗传操作,产生下一代网络.重复2)-4)操作,直至网络被遗传算法优化,并达到所要求的精度为止.3.2 Levenberg-Marquardt算法原理L-M算法[18]对网络的优化非常有效,是一种改进的牛顿高斯法,具有收敛快和精度高的优点.它在解决非线性最小二乘问题中有很强的优势,而网络权值的调整实质上是一个对非线性误差函数的最小二乘问题进行解决的过程.向量ω表示BP神经网络各层的权值和阈值.L-M算法的权值调整率为其中J为误差对权值的雅可比矩阵,它含有网络训练误差的一阶导数,e为网络训练误差矢量.L-M算法的权值调整率为其中ω(t+1)=ω(t)+(J'J+λI)-1(J'e)式中,λ为标量,I为J的对角阵.该方法λ的值光滑地在两种情况之间变化:λ很小时,该算法为牛顿法;λ较大时,算法更接近与小步长的梯度法.采用L-M算法可使误差修正在两种算法之间平滑调和,以较短的时间完成网络迭代求参的过程.3.3 算法步骤GA-LM-BP算法是BP算法结合遗传算法和L-M算法来加快收敛速度和避免陷入局部最小的有效方法.算法步骤如下1)将[-1,1]之间的随机数赋予权值ω,得到初始权值ω(0);2)进行正向运算,计算网络总误差函数.如果满足设定目标则停止运算,若不能满足,则计算误差函数的改变值ΔE=E(t+1)-E(t),若ΔE<ε(ε为[0,1]之间的随机小数)达到给定的次数,说明神经网络已经收敛到局部极小,转入第3)步;3)调用遗传算法:其函数子程序如(①-⑤)所示:①进行二进制编码,初始化种群;②输入样本,训练BP网络;③计算个体的适应度值;④选择,交叉,变异操作作用于当前群体;⑤判断算法是否达到最大进化代数,如果达到最大进化代数,选择群体中适应度值最大的个体,并对其进行二进制解码得到最佳网络结构及对应的最优权值,进行4)-5)操作,若没有达到最大进化代数,则继续循环②-⑤,直到达到最大代数为止;4)输入样本信息,用得到的最优权值对BP神经网络进行训练,若满足设定的误差要求或者达到设定的训练次数,则结束BP网络训练.5)如果满足给定的误差要求或训练步数,则训练结束,如果没有则进行下一轮的计算, 直到网络误差函数满足要求的精度为止.这样,算法反复交替执行可使得BP神经网络快速地收敛至全局最优.本文的仿真是借助MATLAB来实现的,为了说明GA-LM改进的BP神经网络是有效的,本文分别对BP,LM-BP,GA-LM-BP 三种预测模型进行对比试验.仿真中BP网络采用三层网络结构,输入层、隐含层、输出层的神经元个数分别为4、10、1.训练次数为5000,训练误差目标为0.005,学习速率为0.01,动量因子为0.9.遗传算法参数设置为:初始种群的规模为20,进化代数为100,选择时的交叉概率为0.6,变异概率为0.05.设要逼近的函数πx)+sinx,图1,图2,图3分别为在BP,LM-BP,GA-LM-BP 学习算法操作下的误差曲线.由图可知,在BP学习算法下,经过3984次学习停止训练,在LM-BP下经过1256次学习停止训练,在GA-LM-BP学习算法下,经过246次终止训练.图5为函数图像和仿真图像.本文介绍了传统BP网络学习算法;根据传统BP算法收敛速度慢,易收敛到局部极小点等不足,结合遗传算法的整体收敛特点以及L-M算法的快速收敛优势,在传统BP学习算法的基础上提出GA-LM-BP算法,此方法提高了传统BP算法的全局收敛速度,改进了其易收敛到局部极小值的缺陷,最后,论文通过MATLAB仿真实验对其结果进行了验证,证明了所提方法的有效性.【相关文献】[1]刘毅娟.人工神经网络概述[D].唐山:华北理工大学,2015.[2]L.R.Medsker,L.C.Jain.Recurrent Neuralbreak Networks:Design and Applications[J].Int Joint Conference on Neural Networks,1999,8(2):1537-1541.[3]J.F.Kolen,S.C.Kremer.A Field Guide to Dynamical Recurrent Networks[J].NewYork,NY,USA:Wiley,2001:257-289.[4]R.Behling,A.Fischer,M.Herrich.A Levenberg-Marquardt Method with Approximate Projections[J].Computational Optimization and Applications,2014,59(1):5-26.[5]邢晓敏,商国敬.基于改进共轭梯度理论神经网络优化算法研究[J].电器与仪表,2014,51(19):36-40.[6]陈斌,万江文,吴银锋.神经网络和证据理论融合的管道泄漏诊断方法[J].北京邮电大学学报,2009,32(1):5-9.[7]高航,薛凌云.基于改进遗传算法的BP神经网络拟合LED光谱模型[J].激光与光电子学进展,2017.[8]J.M.Call.Genetic Algorithms for Modelling and Optimisation[J].Journal of Computational and Applied Mathematics,2005,184(1):205 -222.[9]张月琴,刘翔,孙先洋.一种改进的BP神经网络算法与应用[J].计算机技术与发展,2012,22(8):163-166.[10]邹刚.基于蚁群算法的电力负荷预测方法研究[D].重庆:重庆大学,2006.[11]周爱武,翟增辉,刘慧婷.基于模拟退火算法改进的BP神经网络算法[J].微电子学与计算机,2016,33(4):144-147.[12]王磊,王汝凉,曲洪峰,玄杨.BP神经网络算法改进及应用[J].软件导刊,2016,15(5):38-40.[13]陈海龙,彭伟.改进BP神经网络在交通事故预测中的研究[J].华东师范大学学报,2017,2(2):61-68.[14]孙甜,凌卫新.基于模拟退火的Levenberg-Marquardt 算法在神经网络中的应用[J].科学技术与工程,2008,8(18):5189-5192.[15]ng,S.C.Lin,W.H.Fang.Subcarrier Pairing and Power Allocation with Interference Management in Cognitive Relay Networks based on Genetic Algorithms[J].IEEE Transactions on Vehicular Technology,2015.[16]王辉,陈忠家,孙寿云.采用BP神经网络结合遗传算法优化薄壁塑件注射成型工艺参数[J].模具工业,2012(5):10-13.[17]焦纲领,王士星.基于遗传算法的神经网络参数优化研究[J].数学的实践与认识,2012,42(11):176-183.[18]张峤,邓贵仕.Levenberg-Marquardt神经网络在煤矿作业人员人因可靠性评价中应用研究[J].大连理工大学学报,2015,55(4):423-430.。
张氏标定法张正友针对径向畸变问题提出了一个新的求解摄像机内外参数的方法,即张氏标定法,该方法是介于传统标定和自标定之间的一种方法,它只需要摄像机对某个标定板从不同方向拍摄多幅图片,通过标定板上每个特征点和其像平面的像点间的对应关系,即每一幅图像的单应矩阵来进行摄像机的标定,由于该方法模板制作容易,使用方便,成本低,鲁棒性好,准确率高,因此得到了较为广泛的应用【49】。
该算法也属于两步法,摄像机和模板可以自由的移动,不需要知道运动参数。
本文即采用张氏摄像机标定的方法。
(1) 单应矩阵H 的计算由前面所述内容可知,根据摄像机针孔成像模型,可以得到下面的等式:[]⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡11][1321W W W W W W Z Y X t r r r A Z Y X t R A v u s 现在世界坐标系平面置于标定模板所在的平面,即0=W Z 。
则上式可变为如下形式:[]⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡110][121W W W W Y X t r r A Y X t R A v u s 其中,i r 表示旋转矩阵R 的第i 列向量。
令[]T Y X M 1~=,[]T v u m1~=,则上式可简写为:M H m s ~~=其中:[]⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡===1][323123222113121132121h h h h h h h h h h h t r r A H H 即为单应性矩阵。
有M H ms ~~=式子可以推出: ⎪⎩⎪⎨⎧++=++=++=13231232221131211h X h s h Y h X h sv h Y h X h su 从而推得:⎩⎨⎧++=++++=++23222132311312113231h Y h X h v vYh vXh h Y h X h u uYh uXh 令:[]3231232221131211'h h h h h h h h h =则:0'10000001=⎥⎦⎤⎢⎣⎡------h v vYvXYXu uY uX Y X 上式可以看作0'=Sh ,那么矩阵S S T最小特征值所对应的特征向量就是该方程的最小二乘解。
levenberg-marquardt 算法原理标题:Levenberg-Marquardt 算法原理详解一、引言Levenberg-Marquardt(LM)算法,又称为改进的梯度下降法,是一种广泛应用于非线性最小二乘问题的有效优化算法。
它结合了高斯-牛顿法和梯度下降法的优点,在解决大规模非线性优化问题时表现出了良好的性能,尤其在机器学习、计算机视觉、信号处理等领域有广泛应用,例如用于训练神经网络模型、图像配准等任务。
二、算法背景与目标非线性最小二乘问题通常表述为寻找参数向量θ使下述目标函数最小:\[ E(\theta) = \frac{1}{2} \sum_{i=1}^{m}(f_i(\theta)-y_i)^2 \]其中,\( f_i(\theta) \) 是依赖于参数向量θ 的非线性模型,\( y_i \) 是观测数据。
Levenberg-Marquardt 算法的主要目标就是在这样的背景下,有效地寻找到使得目标函数值最小的参数估计值。
三、算法原理1. **高斯-牛顿迭代**:Levenberg-Marquardt 算法首先构建了一个基于目标函数二阶导数信息的Hessian矩阵和梯度向量,然后通过求解如下正规方程来更新参数:\[ J^TJ\Delta\theta = -J^T\epsilon \]其中,J是雅可比矩阵(即所有fi关于θ的一阶偏导数组成的矩阵),ε是残差向量(fi(θ) - yi),Δθ是对参数的修正值。
2. **引入正则化项**:在高斯-牛顿方法的基础上,Levenberg-Marquardt算法引入了一个正则化项λI(λ是一个调整参数,I是单位矩阵)。
这样,更新公式变为:\[ (J^TJ + \lambda I)\Delta\theta = -J^T\epsilon \]正则化项的作用是在Hessian矩阵条件不佳(如近似奇异或病态)的情况下,增加搜索方向的稳定性,并在接近最优解时自动转换为梯度下降法,实现更精细的局部搜索。