<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>信赖域 &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/%E4%BF%A1%E8%B5%96%E5%9F%9F/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Sun, 03 May 2020 13:28:14 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创] LM(Levenberg-Marquard)算法的实现</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9blm%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9blm%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Mon, 13 Sep 2010 18:09:35 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Levenberg-Marquardt]]></category>
		<category><![CDATA[LM算法]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[trust region]]></category>
		<category><![CDATA[信赖域]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=29</guid>

					<description><![CDATA[<p>
	&#160;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">LM算法，全称为Levenberg-Marquard算法，它可用于解决非线性最小二乘问题，多用于曲线拟合等场合。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">LM算法的实现并不算难，它的关键是用模型函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fa14cdd754f91cc6554c9e71929cce7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f" /></span><script type='math/tex'>f</script>  对待估参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83878c91171338902e0fe0fb97a8c47a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="p" /></span><script type='math/tex'>p</script> 在其邻域内做线性近似，忽略掉二阶以上的导数项，从而转化为线性最小二乘问题，它具有收敛速度快等优点。LM算法属于一种&#8220;<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 0, 0);">信赖域法</span></a>&#8221;&#8212;&#8212;所谓的信赖域法，此处稍微解释一下：在最优化算法中，都是要求一个函数的极小值，每一步迭代中，都要求目标函数值是下降的，而信赖域法，顾名思义，就是从初始点开始，先假设一个可以信赖的最大位移 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_03c7c0ace395d80182db07ae2c30f034.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="s" /></span><script type='math/tex'>s</script> ，然后在以当前点为中心，以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_03c7c0ace395d80182db07ae2c30f034.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="s" /></span><script type='math/tex'>s</script> 为半径的区域内，通过寻找目标函数的一个近似函数（二次的）的最优点，来求解得到真正的位移。在得到了位移之后，再计算目标函数值，如果其使目标函数值的下降满足了一定条件，那么就说明这个位移是可靠的，则继续按此规则迭代计算下去；如果其不能使目标函数值的下降满足一定的条件，则应减小信赖域的范围，再重新求解。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">事实上，你从所有可以找到的资料里看到的LM算法的说明，都可以找到类似于&#8220;如果目标函数值增大，则调整某系数再继续求解；如果目标函数值减小，则调整某系数再继续求解&#8221;的迭代过程，这种过程与上面所说的信赖域法是非常相似的，所以说LM算法是一种信赖域法。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&#160;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span id="more-29"></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span style="color: rgb(0, 0, 0);"><span style="font-size: 14px;">LM算法需要对每一个待估参数求偏导，所以，如果你的目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fa14cdd754f91cc6554c9e71929cce7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f" /></span><script type='math/tex'>f</script> 非常复杂，或者待估参数相当地多，那么可能不适合使用LM算法，而可以选择Powell算法&#8212;&#8212;Powell算法不需要求导。</span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&#160;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span style="color: rgb(0, 0, 0);"><span style="font-size: 14px;">至于这个求导过程是如何实现的，我还不能给出建议，我使用过的方法是拿到函数的方程，然后手工计算出其偏导数方程，进而在函数中直接使用，这样做是最直接，求导误差也最小的方式。不过，在你不知道函数的形式之前，你当然就不能这样做了&#8212;&#8212;例如，你提供给了用户在界面上输入数学函数式的机会，然后在程序中解析其输入的函数，再做后面的处理。在这种情况下，我猜是需要使用数值求导算法的，但我没有亲自试验过这样做的效率，因为一些优秀的求导算法&#8212;&#8212;例如<a href="http://www.codelast.com/?p=1419" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Ridders算法</span></a>&#8212;&#8212;在一次求导数值过程中，需要计算的函数值次数也会达到5次以上。这样的话，它当然要比手工求出导函数（只需计算一次，就可以得到导数值）效率要差得多了。不过，我个人估计（没有任何依据的，只是猜的）：依赖于LM算法的高效，就算添加了一个数值求导的&#8220;拖油瓶&#8221;，整个最优化过程下来，它仍然会优于Powell等方法。</span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">在<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="background-color: rgb(255, 160, 122);">这篇</span></a>解释信赖域算法的文章中，我们已经知道了LM算法的数学模型：<br />
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_trust_region_3.png" style="width: 350px; height: 111px;" /><br />
	可以证明，此模型可以通过解方程组</span></span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8838fa9623a6308c220121c6059c0890.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({G_k} + \mu I)s = - {g_k}" /></span><script type='math/tex'>({G_k} + \mu I)s = - {g_k}</script> <span style="color:#000000;"><span style="font-size: 14px;">确定</span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_73194efc87788b133d9278ade98decd5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{s_k}" /></span><script type='math/tex'>{s_k}</script> <span style="color:#000000;">来<span style="font-size: 14px;">表征。<br />
	即：LM算法要确定一个</span></span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5e9a87eedf6e15dc5bcd9c7b59006bee.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\mu \ge 0" /></span><script type='math/tex'>\mu \ge 0</script> <span style="font-size: 14px; color: rgb(0, 0, 0); font-family: 微软雅黑;">，使得</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_773d2559f0d1eed1850c883a6358cdc6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k} + \mu I" /></span><script type='math/tex'>{G_k} + \mu I</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">正定，并解线性方程组</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7e3ce21124c14a52c24137db707afa2e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({G_k} + \mu I){s_k} = - {g_k}" /></span><script type='math/tex'>({G_k} + \mu I){s_k} = - {g_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">求出</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_73194efc87788b133d9278ade98decd5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{s_k}" /></span><script type='math/tex'>{s_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">。</span><br />
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; background-color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9blm%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">LM算法，全称为Levenberg-Marquard算法，它可用于解决非线性最小二乘问题，多用于曲线拟合等场合。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">LM算法的实现并不算难，它的关键是用模型函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fa14cdd754f91cc6554c9e71929cce7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f" /></span><script type='math/tex'>f</script>  对待估参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83878c91171338902e0fe0fb97a8c47a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="p" /></span><script type='math/tex'>p</script> 在其邻域内做线性近似，忽略掉二阶以上的导数项，从而转化为线性最小二乘问题，它具有收敛速度快等优点。LM算法属于一种&ldquo;<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 0, 0);">信赖域法</span></a>&rdquo;&mdash;&mdash;所谓的信赖域法，此处稍微解释一下：在最优化算法中，都是要求一个函数的极小值，每一步迭代中，都要求目标函数值是下降的，而信赖域法，顾名思义，就是从初始点开始，先假设一个可以信赖的最大位移 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_03c7c0ace395d80182db07ae2c30f034.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="s" /></span><script type='math/tex'>s</script> ，然后在以当前点为中心，以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_03c7c0ace395d80182db07ae2c30f034.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="s" /></span><script type='math/tex'>s</script> 为半径的区域内，通过寻找目标函数的一个近似函数（二次的）的最优点，来求解得到真正的位移。在得到了位移之后，再计算目标函数值，如果其使目标函数值的下降满足了一定条件，那么就说明这个位移是可靠的，则继续按此规则迭代计算下去；如果其不能使目标函数值的下降满足一定的条件，则应减小信赖域的范围，再重新求解。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px;">事实上，你从所有可以找到的资料里看到的LM算法的说明，都可以找到类似于&ldquo;如果目标函数值增大，则调整某系数再继续求解；如果目标函数值减小，则调整某系数再继续求解&rdquo;的迭代过程，这种过程与上面所说的信赖域法是非常相似的，所以说LM算法是一种信赖域法。</span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&nbsp;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span id="more-29"></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span style="color: rgb(0, 0, 0);"><span style="font-size: 14px;">LM算法需要对每一个待估参数求偏导，所以，如果你的目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fa14cdd754f91cc6554c9e71929cce7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f" /></span><script type='math/tex'>f</script> 非常复杂，或者待估参数相当地多，那么可能不适合使用LM算法，而可以选择Powell算法&mdash;&mdash;Powell算法不需要求导。</span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	&nbsp;</p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span style="color: rgb(0, 0, 0);"><span style="font-size: 14px;">至于这个求导过程是如何实现的，我还不能给出建议，我使用过的方法是拿到函数的方程，然后手工计算出其偏导数方程，进而在函数中直接使用，这样做是最直接，求导误差也最小的方式。不过，在你不知道函数的形式之前，你当然就不能这样做了&mdash;&mdash;例如，你提供给了用户在界面上输入数学函数式的机会，然后在程序中解析其输入的函数，再做后面的处理。在这种情况下，我猜是需要使用数值求导算法的，但我没有亲自试验过这样做的效率，因为一些优秀的求导算法&mdash;&mdash;例如<a href="http://www.codelast.com/?p=1419" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Ridders算法</span></a>&mdash;&mdash;在一次求导数值过程中，需要计算的函数值次数也会达到5次以上。这样的话，它当然要比手工求出导函数（只需计算一次，就可以得到导数值）效率要差得多了。不过，我个人估计（没有任何依据的，只是猜的）：依赖于LM算法的高效，就算添加了一个数值求导的&ldquo;拖油瓶&rdquo;，整个最优化过程下来，它仍然会优于Powell等方法。</span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">在<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="background-color: rgb(255, 160, 122);">这篇</span></a>解释信赖域算法的文章中，我们已经知道了LM算法的数学模型：<br />
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_trust_region_3.png" style="width: 350px; height: 111px;" /><br />
	可以证明，此模型可以通过解方程组</span></span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8838fa9623a6308c220121c6059c0890.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({G_k} + \mu I)s = - {g_k}" /></span><script type='math/tex'>({G_k} + \mu I)s = - {g_k}</script> <span style="color:#000000;"><span style="font-size: 14px;">确定</span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_73194efc87788b133d9278ade98decd5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{s_k}" /></span><script type='math/tex'>{s_k}</script> <span style="color:#000000;">来<span style="font-size: 14px;">表征。<br />
	即：LM算法要确定一个</span></span></span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5e9a87eedf6e15dc5bcd9c7b59006bee.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\mu \ge 0" /></span><script type='math/tex'>\mu \ge 0</script> <span style="font-size: 14px; color: rgb(0, 0, 0); font-family: 微软雅黑;">，使得</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_773d2559f0d1eed1850c883a6358cdc6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k} + \mu I" /></span><script type='math/tex'>{G_k} + \mu I</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">正定，并解线性方程组</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7e3ce21124c14a52c24137db707afa2e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({G_k} + \mu I){s_k} = - {g_k}" /></span><script type='math/tex'>({G_k} + \mu I){s_k} = - {g_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">求出</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_73194efc87788b133d9278ade98decd5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{s_k}" /></span><script type='math/tex'>{s_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">。</span><br />
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; background-color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;"> 下面来看看LM算法的基本步骤：<br />
	</span></p>
<ul>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">从初始点</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_892581f6aefecae90be73076e1aeee5c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0}" /></span><script type='math/tex'>{x_0}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d63edeaa2da65b5eb9315cb67f2aef33.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _0} > 0" /></span><script type='math/tex'>{\mu _0} > 0</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">开始迭代</span></li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">到第 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ce4b16b22b58894aa86c421e8759df3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="k" /></span><script type='math/tex'>k</script> 步时，计算</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_550187f469eda08b9e5b55143f19c4ce.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k}" /></span><script type='math/tex'>{x_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">和</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fd211701b4a46ba1dc0a286b482358aa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _k}" /></span><script type='math/tex'>{\mu _k}</script> </li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">分解矩阵</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac50fc83ecb275c766e83ae5ad0e587.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k} + {\mu _k}I" /></span><script type='math/tex'>{G_k} + {\mu _k}I</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，若不正定，令</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_945ae9d814c12aa3d30295bfc0f46906.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _k} = 4{\mu _k}" /></span><script type='math/tex'>{\mu _k} = 4{\mu _k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">并重复到正定为止</span></li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">解线性方程组</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_39bb97dce4480ed372e0cf0c8b4d7813.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({G_k} + {\mu _k}I){s_k} = - {g_k}" /></span><script type='math/tex'>({G_k} + {\mu _k}I){s_k} = - {g_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">求出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_73194efc87788b133d9278ade98decd5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{s_k}" /></span><script type='math/tex'>{s_k}</script> 并计算</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3b0e65747eafbb19ab7bc40d35bce04c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k}" /></span><script type='math/tex'>{r_k}</script> </li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">若</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_890c822af8cb2c55c7738f71331569b9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} < 0.25" /></span><script type='math/tex'>{r_k} < 0.25</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，令</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dedbf28098ef6d24e2b3828ea11e303b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _{k + 1}} = 4{\mu _k}" /></span><script type='math/tex'>{\mu _{k + 1}} = 4{\mu _k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">；若</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c498579afb29a1cc30954e8b834dfb97.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} > 0.75" /></span><script type='math/tex'>{r_k} > 0.75</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，令</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bec7e26d65c86ecf3e0a820cb9f09695.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _{k + 1}} = \frac{{{\mu _k}}}{2}" /></span><script type='math/tex'>{\mu _{k + 1}} = \frac{{{\mu _k}}}{2}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">；若</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_19d7e5da4d211b89524a3da89333dc53.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0.25 \le {r_k} \le 0.75" /></span><script type='math/tex'>0.25 \le {r_k} \le 0.75</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，令</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_946e5235b551f6d30398f23d112c9954.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _{k + 1}} = {\mu _k}" /></span><script type='math/tex'>{\mu _{k + 1}} = {\mu _k}</script> </li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">若</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_34051880f1cad914a6448bce6089ff97.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} \le 0" /></span><script type='math/tex'>{r_k} \le 0</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，说明函数值是向着上升而非下降的趋势变化了（与最优化的目标相反），这说明这一步走错了，而且错得&ldquo;离谱&rdquo;，此时，不应该走到下一点，而应&ldquo;原地踏步&rdquo;，即</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f27914c23c0fac18442dc37b7fc9f184.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}} = {x_k}" /></span><script type='math/tex'>{x_{k + 1}} = {x_k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，并且和上面</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_890c822af8cb2c55c7738f71331569b9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} < 0.25" /></span><script type='math/tex'>{r_k} < 0.25</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">的情况一样对</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fd211701b4a46ba1dc0a286b482358aa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\mu _k}" /></span><script type='math/tex'>{\mu _k}</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">进行处理。反之，在</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_51294d6fb4a7529442d015152a384fd4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} > 0" /></span><script type='math/tex'>{r_k} > 0</script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">的情况下，都可以走到下一点，即</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cabf6797197dc77c50fe830118a329b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}} = {x_k} + {s_k}" /></span><script type='math/tex'>{x_{k + 1}} = {x_k} + {s_k}</script> </li>
<li style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">迭代的终止条件：</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16fbb5f34444df12659bd64cb64d5c7c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\left\| {{g_k}} \right\| < \varepsilon " /></span><script type='math/tex'>\left\| {{g_k}} \right\| < \varepsilon </script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">，其中</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c691dc52cc1ad756972d4629934d37fd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\varepsilon " /></span><script type='math/tex'>\varepsilon </script> <span style="color: rgb(0, 0, 0); font-family: 微软雅黑; font-size: 14px;">是一个指定的小正数（大家可以想像一下二维平面上的寻优过程（函数图像类似于抛物线），当接近极小值点时，迭代点的梯度趋于0）</span></li>
</ul>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="color: rgb(255, 255, 255); font-family: arial, helvetica, sans-serif; font-size: 14px; line-height: 20px; background-color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	<span style="font-family:微软雅黑;"><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">从上面的步骤可见，LM求解过程中需要用到求解线性方程组的算法，一般我们使用</span></span></span><span style=""><span style="font-size: 14px;"><a href="http://www.codelast.com/?p=1288" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">高斯约当消元法</span></a></span></span><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">，因为它非常稳定&mdash;&mdash;虽然它不是最快最好的算法。<br />
	同时，上面的算法步骤也包含对矩阵进行分解的子步骤。为什么要先分解矩阵，再解线性方程组？貌似是这样的（数学不好的人再次泪奔）：不分解矩阵使之正定，就无法确定那个线性方程组是有解的。</span></span></span><span style=""><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);"><a href="http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5%E5%88%86%E8%A7%A3" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">矩阵分解</span></a></span></span></span><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">有很多算法，例如</span></span></span><span style=""><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);"><a href="http://zh.wikipedia.org/wiki/LU%E5%88%86%E8%A7%A3" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">LU分解</span></a></span></span></span><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">等，这方面我没有看。</span></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);"><a href="http://www.ics.forth.gr/~lourakis/levmar/levmar.pdf" target="_blank" rel="noopener noreferrer"><span style="background-color: rgb(255, 160, 122);">这里</span></a>有一篇很不错的文章，解释了如何实现LM算法，大家可以参考一下。</span></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 13px; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(77, 77, 77); ">
	<span style="font-family:微软雅黑;"><span><span style="font-size: 14px;"><span style="color: rgb(0, 0, 0);">需要说明的是，这是非线性无约束的问题，如果待估参数是有约束的（例如参数在某一范围内变动），要想用在LM算法中，那就是约束最优化问题了，这是一个big topic，以我目前的知识储备，尚不能解释好，请大家另寻资料吧。</span></span></span></span></p>
<p style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 9px; margin-left: 0px; outline-width: 0px; outline-style: initial; outline-color: initial; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9blm%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
