<?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/%E6%9C%80%E4%BC%98%E5%8C%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Fri, 09 Oct 2020 02:06:20 +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>[原创] 用人话解释机器学习中的Logistic Regression（逻辑回归）</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e4%b8%ad%e7%9a%84logistic-regression%ef%bc%88%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%ef%bc%89/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e4%b8%ad%e7%9a%84logistic-regression%ef%bc%88%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%ef%bc%89/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Fri, 19 Feb 2016 08:47:08 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[cross entropy]]></category>
		<category><![CDATA[Logistic Regression]]></category>
		<category><![CDATA[Logit Regression]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[交叉熵]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[机器学习]]></category>
		<category><![CDATA[逻辑回归]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=8629</guid>

					<description><![CDATA[<p>友情提示：如果觉得页面中的公式显示太小，可以放大页面查看（不会失真）。</p>
<p><span style="color:#0000ff;">Logistic Regression</span>（或<span style="color:#0000ff;">Logit Regression</span>），即<span style="color:#0000ff;">逻辑回归</span>，简记为<span style="color:#0000ff;">LR</span>，是机器学习领域的一种极为常用的算法／方法／模型。<br />
你能从网上搜到十万篇讲述Logistic Regression的文章，也不多我这一篇，但是，就像我写过的<a href="http://www.codelast.com/?p=7364" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">最优化系列文章</span></a>一样，我仍然试图用&#8220;人话&#8221;来再解释一遍&#8212;&#8212;可能不专业，但是容易看得懂。那些一上来就是几页数学公式什么的最讨厌了，不是吗？<br />
所以这篇文章是写给完全没听说过Logistic Regression的人看的，我相信看完这篇文章，你差不多可以从无到有，把逻辑回归应用到实践中去。<br />
<span id="more-8629"></span><br />
Logistic Regression是一种<span style="color:#0000ff;">分类</span>算法。分类，也就是把一个群体（或问题，或数据）分为几个类别，例如，男/女/人妖；爱她的人/不爱她的人；今天会下雨/今天不会下雨。<br />
Logistic Regression最常用于处理&#8220;<span style="color:#0000ff;">二分类</span>&#8221;问题，也就是说分类只有两个，像&#8220;爱她的人/不爱她的人&#8221;就是二分类，而&#8220;男/女/人妖&#8221;就不是二分类。当然，Logistic Regression也可以用于处理多分类问题，即所谓的&#8220;<span style="color:#800080;">多分类逻辑回归</span>&#8221;（<span style="color:#b22222;">Multiclass Logistic Regression</span>），但本文并不涉及这个方面。<br />
所以，说得简单点就是，给你一条数据，用Logistic Regression可以判断出这条数据应该被分到两个类别中的哪个中去。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
Logistic Regression在现实世界中非常有用。例如，可以用它来判断一个用户是否会点击一个广告（会点击／不会点击），可以用Logistic Regression来判断两类人是否会相爱（会相爱／不会相爱），等等。</p>
<p>机器学习的主旨就是通过对历史数据的计算（即&#8220;学习&#8221;），得到一些未知参数的值，从而可以推断出新数据会有什么结论。例如一个非常简单的函数： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0fdb61c8abfb7bfd67516c1f8c8055b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ax + b" /></span><script type='math/tex'>y = ax + b</script> ，在已知几组  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_90cbc22edf225adf8a68974f51227f05.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(x,y)" /></span><script type='math/tex'>(x,y)</script>  历史数据的情况下：</p>
<div>
<blockquote>
<div>
			(1, 5.5)<br />
			(1.5, 7)<br />
			(2, 6.5)</div>
</blockquote>
<p>	我们怎样能够预测一个未知的自变量  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4c63f2fd29fec6c20010a36949e9752d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x = 3" /></span><script type='math/tex'>x = 3</script>  会对应什么样的因变量&#160; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script>  呢？也就是说， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4c63f2fd29fec6c20010a36949e9752d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x = 3" /></span><script type='math/tex'>x = 3</script>  时&#160; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_232ec2a90bc0ab9fb1a405d8ffe47582.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ?" /></span><script type='math/tex'>y = ?</script></p></div>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e4%b8%ad%e7%9a%84logistic-regression%ef%bc%88%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%ef%bc%89/" class="read-more">Read More </a>]]></description>
										<content:encoded><![CDATA[<p>友情提示：如果觉得页面中的公式显示太小，可以放大页面查看（不会失真）。</p>
<p><span style="color:#0000ff;">Logistic Regression</span>（或<span style="color:#0000ff;">Logit Regression</span>），即<span style="color:#0000ff;">逻辑回归</span>，简记为<span style="color:#0000ff;">LR</span>，是机器学习领域的一种极为常用的算法／方法／模型。<br />
你能从网上搜到十万篇讲述Logistic Regression的文章，也不多我这一篇，但是，就像我写过的<a href="http://www.codelast.com/?p=7364" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">最优化系列文章</span></a>一样，我仍然试图用&ldquo;人话&rdquo;来再解释一遍&mdash;&mdash;可能不专业，但是容易看得懂。那些一上来就是几页数学公式什么的最讨厌了，不是吗？<br />
所以这篇文章是写给完全没听说过Logistic Regression的人看的，我相信看完这篇文章，你差不多可以从无到有，把逻辑回归应用到实践中去。<br />
<span id="more-8629"></span><br />
Logistic Regression是一种<span style="color:#0000ff;">分类</span>算法。分类，也就是把一个群体（或问题，或数据）分为几个类别，例如，男/女/人妖；爱她的人/不爱她的人；今天会下雨/今天不会下雨。<br />
Logistic Regression最常用于处理&ldquo;<span style="color:#0000ff;">二分类</span>&rdquo;问题，也就是说分类只有两个，像&ldquo;爱她的人/不爱她的人&rdquo;就是二分类，而&ldquo;男/女/人妖&rdquo;就不是二分类。当然，Logistic Regression也可以用于处理多分类问题，即所谓的&ldquo;<span style="color:#800080;">多分类逻辑回归</span>&rdquo;（<span style="color:#b22222;">Multiclass Logistic Regression</span>），但本文并不涉及这个方面。<br />
所以，说得简单点就是，给你一条数据，用Logistic Regression可以判断出这条数据应该被分到两个类别中的哪个中去。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
Logistic Regression在现实世界中非常有用。例如，可以用它来判断一个用户是否会点击一个广告（会点击／不会点击），可以用Logistic Regression来判断两类人是否会相爱（会相爱／不会相爱），等等。</p>
<p>机器学习的主旨就是通过对历史数据的计算（即&ldquo;学习&rdquo;），得到一些未知参数的值，从而可以推断出新数据会有什么结论。例如一个非常简单的函数： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0fdb61c8abfb7bfd67516c1f8c8055b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ax + b" /></span><script type='math/tex'>y = ax + b</script> ，在已知几组  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_90cbc22edf225adf8a68974f51227f05.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(x,y)" /></span><script type='math/tex'>(x,y)</script>  历史数据的情况下：</p>
<div>
<blockquote>
<div>
			(1, 5.5)<br />
			(1.5, 7)<br />
			(2, 6.5)</div>
</blockquote>
<p>	我们怎样能够预测一个未知的自变量  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4c63f2fd29fec6c20010a36949e9752d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x = 3" /></span><script type='math/tex'>x = 3</script>  会对应什么样的因变量&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script>  呢？也就是说， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4c63f2fd29fec6c20010a36949e9752d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x = 3" /></span><script type='math/tex'>x = 3</script>  时&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_232ec2a90bc0ab9fb1a405d8ffe47582.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ?" /></span><script type='math/tex'>y = ?</script> <br />
	显然我们的任务就是计算出两个未知参数&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script>  和&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script>  的值，有了这两个值，那么任意给定一个&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> ，我们都能通过函数&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0fdb61c8abfb7bfd67516c1f8c8055b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ax + b" /></span><script type='math/tex'>y = ax + b</script>  计算出&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script>  的值了，这就是所谓的&ldquo;预测&rdquo;。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	Logistic Regression也是类似，我们有一个函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d19546fa62d4242fb94dd1e54f1497ec.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = f(X)" /></span><script type='math/tex'>y = f(X)</script> ，里面包含若干个未知参数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_600c746b4b1e96f24bf5e68ffdd17c32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _0},{\theta _1},{\theta _2}, \cdots ,{\theta _n}" /></span><script type='math/tex'>{\theta _0},{\theta _1},{\theta _2}, \cdots ,{\theta _n}</script> 。<br />
	由于现实世界是复杂的，因变量&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script>  通常会跟很多因素（自变量  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> ）有关系，即&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_51e1680e3df2c1a03394b225f5754880.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0},{x_1},{x_2}, \cdots ,{x_n}" /></span><script type='math/tex'>{x_0},{x_1},{x_2}, \cdots ,{x_n}</script> ，所以这里自变量是一个<span style="color:#0000ff;">向量</span>，这里用大写的  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_02129bb861061d1a052c592e2dc6b383.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="X" /></span><script type='math/tex'>X</script>  来表示。同理，那一堆未知的参数也是一个向量，用一个字母  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script>  来表示。<br />
	现在给我们一堆 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_90cbc22edf225adf8a68974f51227f05.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(x,y)" /></span><script type='math/tex'>(x,y)</script> 的历史数据，我们要想办法计算出所有未知参数的值，然后就可以拿来预测新的&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script>  值所对应的&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script>  值了。<br />
	但是这个函数是什么呢？如下：<br />
	<span style="color:#0000ff;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d75712642d3eb1dbfc0bc0718cdfb7cd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(X) = \frac{1}{{1 + {e^{ - {\theta ^T}X}}}}{\rm{ }}" /></span><script type='math/tex'>f(X) = \frac{1}{{1 + {e^{ - {\theta ^T}X}}}}{\rm{ }}</script> </span> <span style="color:#ff0000;">&hellip;&hellip;（1）</span><br />
	其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script>  是参数向量， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_02129bb861061d1a052c592e2dc6b383.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="X" /></span><script type='math/tex'>X</script>  是自变量（向量）。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	那么，这个略显奇怪的函数是怎么来的呢？<br />
	首先我们看  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7214334e01f01d7c5648efcd790e4631.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{\theta ^T}X}" /></span><script type='math/tex'>{{\theta ^T}X}</script>  这部分：这是参数向量与自变量（向量）的<a href="https://zh.wikipedia.org/wiki/%E6%95%B0%E9%87%8F%E7%A7%AF" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">点积</span></a>，这个式子想要表达的含义是：计算某个事件发生的可能性，可以把跟这个事件相关的所有特征加权求和。例如，要求今天下雨的可能性，可以把今天所有和下雨相关的概率加权求和，例如梅雨季节权重为9（每天都很可能下雨），有台风经过权重为6，等等，每一个因素都影响着&ldquo;下雨的可能性&rdquo;，即：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bbeb4b1d67260873773804370090ce01.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="s = \sum\limits_{i = 0}^n {{\theta _i}{x_i}} = {\theta _0}{x_0} + {\theta _1}{x_1} + \cdots + {\theta _n}{x_n} = {\theta ^T}X" /></span><script type='math/tex'>s = \sum\limits_{i = 0}^n {{\theta _i}{x_i}} = {\theta _0}{x_0} + {\theta _1}{x_1} + \cdots + {\theta _n}{x_n} = {\theta ^T}X</script> <br />
	但是这个加权求和的结果是在  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d0b6f29f7312261c6da8700518a6a27e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="( - \infty , + \infty )" /></span><script type='math/tex'>( - \infty , + \infty )</script>  范围内的，为了能表示预测的概率，我们希望把输出值限制在  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b6dbc33006b907f2db1855810abfce98.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(0,1)" /></span><script type='math/tex'>(0,1)</script>  之间，而不是&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d0b6f29f7312261c6da8700518a6a27e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="( - \infty , + \infty )" /></span><script type='math/tex'>( - \infty , + \infty )</script> 。所以，这时，<span style="color: rgb(0, 0, 255);">逻辑函数</span>就出场了。</div>
<div>
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	通过<a href="https://zh.wikipedia.org/wiki/%E9%82%8F%E8%BC%AF%E5%87%BD%E6%95%B8" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">这个WiKi页面</span></a>你可以知道，其实所谓的<span style="color:#0000ff;">逻辑函数</span>，就是这样的一个函数：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_88b4cd1dcd65e1f12fe0d827ba791108.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="P(t) = \frac{1}{{1 + {e^{ - t}}}}" /></span><script type='math/tex'>P(t) = \frac{1}{{1 + {e^{ - t}}}}</script> <br />
	这个函数是由 Pierre Fran&ccedil;ois Verhulst（皮埃尔&middot;弗朗索瓦&middot;韦吕勒）在1844～1845年的时候给它起的名字。而我们上面的函数(1)，就是这个形式。<br />
	逻辑函数的图像是这个样子的：<br />
	<img decoding="async" alt="logistic function" src="https://www.codelast.com/wp-content/uploads/2016/01/logistic_function.png" style="width: 517px; height: 273px;" /><br />
	它的函数值刚好就是在(0,1)之间。<br />
	所以，我们通过逻辑函数，就可以计算出一个事件的概率了（(0,1)之间）。但是不要忘了，我们前面说要处理二分类问题，得到一个(0,1)之间的任意值并不能归到两个分类中的一个里去，所以还要把这个概率值&ldquo;归类&rdquo;。其实这里很简单，我们可以在&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4b8d6a6375fd790e922b90da0ecd933d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(X) > 0.5" /></span><script type='math/tex'>f(X) > 0.5</script> &nbsp;的时候，把它归到类别1中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_224bae9043a536776b0b33751b1b72b0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(X) \le 0.5" /></span><script type='math/tex'>f(X) \le 0.5</script> &nbsp;的时候，把它归到类别2中就可以了（概率值的&ldquo;分水岭&rdquo;可以根据实际情况调整）。用数学公式来表达这段话的含义就是：</p>
<div>
		 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fd236b87dd9852ea434e65a277b2398c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y' = \left\{ {\begin{array}{*{20}{c}}{0,f(X) > 0.5}\\{1,f(X) \le 0.5}\end{array}} \right." /></span><script type='math/tex'>y' = \left\{ {\begin{array}{*{20}{c}}{0,f(X) > 0.5}\\{1,f(X) \le 0.5}\end{array}} \right.</script> </div>
<p>
	在各种机器学习的文章中，你都会看到，它们给了逻辑函数一个常用的名字：<span style="color:#0000ff;">Sigmoid函数</span>。sigmoid，意为&ldquo;S形的&rdquo;，这正符合其函数图像特点，所以大家记住就行了。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	现在，我们已经有了函数，下一步任务就是求出函数表达式中的未知参数向量  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script>  了。这个过程是机器学习中最为核心的计算步骤。<br />
	以前面讲过的函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0fdb61c8abfb7bfd67516c1f8c8055b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ax + b" /></span><script type='math/tex'>y = ax + b</script> &nbsp;为例：<br />
	你会发现，当已知几组  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_90cbc22edf225adf8a68974f51227f05.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(x,y)" /></span><script type='math/tex'>(x,y)</script> &nbsp;数据的情况下：</p>
<blockquote><p>
		(1, 5.5)<br />
		(1.5, 7)<br />
		(2, 6.5)</p></blockquote>
<p>	你无论如何也不可能找到一对  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script>  和&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script>  的值，使得以上3组数据能精确地满足方程&nbsp;&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0fdb61c8abfb7bfd67516c1f8c8055b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = ax + b" /></span><script type='math/tex'>y = ax + b</script> ，正如下面的图像所示：<br />
	<img decoding="async" alt="logistic function" src="https://www.codelast.com/wp-content/uploads/2016/01/ax_b.png" style="width: 1010px; height: 234px;" /></p>
<p>	这条直线如果要精确地通过其中的两个点，那么就不能通过第三个点。所以，最终求出来的&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script>  和&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script>  的值，并不是方程的<a href="https://zh.wikipedia.org/wiki/%E8%A7%A3%E6%9E%90%E8%A7%A3" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">解析解</span></a>，而是&ldquo;<span style="color:#0000ff;">最优解</span>&rdquo;。<br />
	因此，问题在于，我们如何画一条直线，使得其是&ldquo;最优&rdquo;的？&ldquo;最优&rdquo;的评判标准是什么？<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	为了理解&ldquo;最优&rdquo;，我们需要先了解一些概念。</p>
<ul>
<li>
			<span style="color:#0000ff;">损失函数</span>／<span style="color: rgb(0, 0, 255);">Loss Function</span>／<span style="color: rgb(0, 0, 255);">代价函数</span>／<span style="color: rgb(0, 0, 255);">Cost Function</span></li>
</ul>
</div>
<div>
	很多文章说，这几个名词的含义是一样的。但是也有文章说，Loss Function和Cost Function不是一回事，例如<a href="http://image.diku.dk/shark/sphinx_pages/build/html/rest_sources/tutorials/concepts/library_design/losses.html" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">这篇</span></a>文章。但通常认为，这二者是一回事。我觉得嘛，大家就按通常的概念来接受就好了。<br />
	按<a href="https://en.wikipedia.org/wiki/Loss_function" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">WiKi</span></a>的定义：</div>
<blockquote>
<div>
		In mathematical optimization, statistics, decision theory and machine learning, a loss function or cost function is a function that maps an event or values of one or more variables onto a real number intuitively representing some &quot;cost&quot; associated with the event. An optimization problem seeks to minimize a loss function.</div>
</blockquote>
<div>
	以及：</div>
<blockquote>
<div>
		The loss function quantifies the amount by which the prediction deviates from the actual values.</div>
</blockquote>
<div>
	我们可以知道，损失函数用于衡量预测值与实际值的偏离程度，如果预测是完全精确的，则损失函数值为0；如果损失函数值不为0，则其表示的是预测的错误有多糟糕。使得损失函数值最小的那些待求参数值，就是&ldquo;最优&rdquo;的参数值。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	所以现在问题来了，损失函数的表达式又是什么？<br />
	在探讨损失函数的表达式之前，我们先来看一下损失函数有哪些种类。<br />
	损失函数有很多种，例如下面几个：<br />
	<span style="background-color:#dda0dd;">（1）</span>0-1损失函数：可用于<span style="color:#0000ff;">分类</span>问题，即该函数用于衡量<span style="color:#0000ff;">分类错误</span>的数量，但由于此损失函数是非凸（non-convex）的，因此在做最优化计算时，难以求解，所以，正因为如此，0-1损失函数不是那么&ldquo;实用&rdquo;（如果这句话有误，请指正）。<br />
	<span style="background-color:#dda0dd;">（2）</span>平方损失函数（Square Loss）：常用于线性回归（Linear Regression）。<br />
	<span style="background-color:#dda0dd;">（3）</span>对数损失（Log Loss）函数：常用于其模型输出每一类概率的分类器（classifier），例如逻辑回归。<br />
	<span style="background-color:#dda0dd;">（4）</span>Hinge损失函数：常用于SVM（Support Vector Machine，支持向量机，一种机器学习算法）。中文名叫&ldquo;<span style="color:#0000ff;">合页</span>损失函数&rdquo;，因为hinge有&ldquo;合页&rdquo;之意。这个翻译虽然直白，但是你会发现，99％的文章都不会用它的中文名来称呼它，而是用&ldquo;Hinge损失&rdquo;之类的说法。</p>
<p>	这些都是人们的经验总结，当然，说每一种损失函数常用于什么机器学习算法，也都是有数学依据的。但是在这里，我们讲的是Logistic Regression，所以只看对数损失函数。对数损失函数通常用于衡量分类器（classifier）的精度，这里的&ldquo;分类器&rdquo;也就是指机器学习的模型，它对每一个类别输出一个概率值。从前面的文章中，我们已经知道了，逻辑回归就是这样一种分类器，所以才用对数损失函数来衡量其精度。<br />
	有时候，对数损失函数（Log Loss）也被叫作<span style="color:#0000ff;">交叉熵</span>损失函数（Cross-entropy Loss）。<a href="https://en.wikipedia.org/wiki/Cross_entropy" rel="noopener noreferrer" target="_blank"><span style="color:#0000ff;">交叉熵</span></a>这个名字比较拗口，在信息理论中，<span style="color:#0000ff;">熵</span>用于衡量某种事件的&ldquo;不可预测性&rdquo;，而<span style="color:#0000ff;">交叉熵</span>=事件的真实分布+不可预测性，所以交叉熵可以用于度量两个概率分布（真实分布&amp;预测分布）之间的差异性，即：交叉熵损失函数（对数损失函数）可以衡量一个模型对真实值带来的额外噪音，通过最小化交叉熵损失函数（对数损失函数），我们就可以最大化分类器（模型）的精度。<br />
	上面这一大段话试图用简单的描述让你相信，为什么要用Log Loss来衡量Logistic Regression的误差，但是没有给出证明。有人可能会说，为什么不能用其他的方法来衡量，例如用平方损失函数（Square Loss）。事实上，这是有数学依据的&mdash;&mdash;它会导致损失函数是一个关于参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 的<span style="color:#0000ff;">非</span><a href="https://zh.wikipedia.org/wiki/%E5%87%B8%E5%87%BD%E6%95%B0" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">凸函数</span></a>，而用对数损失函数就没有这种问题。凸函数的性质为我们后面求解参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 提供了极大便利，非凸函数有很多局部最优解，不利于求解 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 的计算过程。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	到这里为止，我们还是没有提到损失函数的数学表达式，但是如果要计算损失函数的值，我们是回避不了的，必须要知道。所以，这里用 L 来表示损失函数（取<span style="color: rgb(255, 0, 0);">L</span>oss之意），则对数损失函数的表达式为：<br />
	<span style="color:#0000ff;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_276a829ddba9850126edcea1af119036.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="L = - \frac{1}{n}\sum\limits_{i = 1}^n {[{y_i}\log ({{\hat y}_i}) + (1 - {y_i})\log (1 - {{\hat y}_i})]} " /></span><script type='math/tex'>L = - \frac{1}{n}\sum\limits_{i = 1}^n {[{y_i}\log ({{\hat y}_i}) + (1 - {y_i})\log (1 - {{\hat y}_i})]} </script> </span> <span style="color:#ff0000;">......（2）</span><br />
	其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_eb80f83e86467cf361778c55e850e5e0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{y_i}}" /></span><script type='math/tex'>{{y_i}}</script> 是第i个真实值（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_64903c82c12bd5f8d201e975ac2c3101.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{y_i} \in \{ 0,1\} " /></span><script type='math/tex'>{y_i} \in \{ 0,1\} </script> ）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e466a7d704ae3cf2e5b7414bbae760ba.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{{\hat y}_i}}" /></span><script type='math/tex'>{{{\hat y}_i}}</script> 是第i个预测值。<br />
	这个对数损失函数的表达式中并没有出现我们要求解的参数&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> ，所以我们把&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_683296a9a6612653594c598476e669a8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\hat y = f(X) = \frac{1}{{1 + {e^{ - {\theta ^T}X}}}}" /></span><script type='math/tex'>\hat y = f(X) = \frac{1}{{1 + {e^{ - {\theta ^T}X}}}}</script>  代到（2）式中去：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_961181b6fd923c712b21a4cb9334697a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="L = - \frac{1}{N}\sum\limits_{i = 1}^n {\left[ {{y_i}\log \left( {\frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right) + (1 - {y_i})\log \left( {1 - \frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right)} \right]} " /></span><script type='math/tex'>L = - \frac{1}{N}\sum\limits_{i = 1}^n {\left[ {{y_i}\log \left( {\frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right) + (1 - {y_i})\log \left( {1 - \frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right)} \right]} </script> <br />
	再来仔细看一下这个式子：N 为数据集的条数（有多少组 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0340c3897ed6af331d4d59a20946c451.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="(X,y)" /></span><script type='math/tex'>(X,y)</script> ，N就是多少），已知； <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_eb80f83e86467cf361778c55e850e5e0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{y_i}}" /></span><script type='math/tex'>{{y_i}}</script>  是真实值，已知； <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2af46b114c169c94ea9a86ca7b36758b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{X_i}}" /></span><script type='math/tex'>{{X_i}}</script> 是输入的向量，也已知。所以整个式子里只有 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 是未知的，可以记为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bd346812a06f2d43be738a6f13cc17ee.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="L(\theta )" /></span><script type='math/tex'>L(\theta )</script> ，称之为<span style="color:#0000ff;">目标函数</span>：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ea3fb6a016e9c65dd4bae8aeb9ee1f68.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="L(\theta ) = - \frac{1}{N}\sum\limits_{i = 1}^n {\left[ {{y_i}\log \left( {\frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right) + (1 - {y_i})\log \left( {1 - \frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right)} \right]} " /></span><script type='math/tex'>L(\theta ) = - \frac{1}{N}\sum\limits_{i = 1}^n {\left[ {{y_i}\log \left( {\frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right) + (1 - {y_i})\log \left( {1 - \frac{1}{{1 + {e^{ - {\theta ^T}{X_i}}}}}} \right)} \right]} </script> <br />
	因此，我们只要找到一个参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> ，能使得此式的值最小，那么这个参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 就是&ldquo;最优&rdquo;的参数向量。<br />
	求得了这个最优的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 之后，把它代入式（1），则对任一个未知的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_02129bb861061d1a052c592e2dc6b383.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="X" /></span><script type='math/tex'>X</script> ，我们都可以计算出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_41c2f2136110516f7d332adc5041b0fe.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(X)" /></span><script type='math/tex'>f(X)</script> 值，然后再根据一个阈值把它调整到 0 或 1，就得到了这个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_02129bb861061d1a052c592e2dc6b383.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="X" /></span><script type='math/tex'>X</script> 所属的分类，这样，我们就完成了一次&ldquo;预测&rdquo;的过程。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a></div>
<ul>
<li>
		求解方法</li>
</ul>
<div>
	所以现在问题来了，这个&ldquo;最优&rdquo;的参数向量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50d91f80cbb8feda1d10e167107ad1ff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta " /></span><script type='math/tex'>\theta </script> 怎么求解？<br />
	在大的方向上，你可以选择不使用搜索方向的算法（例如<a href="http://www.codelast.com/?p=7488" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">信赖域算法</span></a>），也可以选择众多使用搜索方向的算法（例如<a href="http://www.codelast.com/?p=8006" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">梯度下降法</span></a>）。<br />
	在是否计算<span style="color:#0000ff;">目标函数</span>的导数这个方面，你可以使用不用求目标函数导数的算法（例如<a href="http://www.codelast.com/?p=388" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">Powell共轭方向集方法</span></a>），也可以使用要求目标函数导数的算法（例如<span style="background-color: rgb(255, 160, 122);"><a href="http://www.codelast.com/?p=8006" rel="noopener noreferrer" target="_blank">梯度下降法</a></span>）。由于某些目标函数形式特别复杂，计算其导数特别麻烦，所以在这种时候，不用计算导数的算法可能大有帮助。</div>
<div>
	求解的过程就是一个<a href="http://www.codelast.com/?p=7364" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">最优化</span></a>的过程，本文无法用一两句话描述清楚，请大家移步链接进行阅读。</p>
<p>	事实上，在现在各种机器学习library百花齐放的今天，我们基本上不需要自己编写这些算法的具体实现，只需要调用它们即可。例如，通过Spark的Machine Learning Library (MLlib)，我们可以直接使用Stochastic gradient descent (SGD)，Limited-memory <a href="http://www.codelast.com/?p=2780" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">BFGS</span></a> (L-BFGS)等实现。但是对这背后的原理有所了解，对工作学习是有帮助的。<br />
	<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>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e4%b8%ad%e7%9a%84logistic-regression%ef%bc%88%e9%80%bb%e8%be%91%e5%9b%9e%e5%bd%92%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>19</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] 再谈 共轭方向法/Conjugate Direction Method In Optimization</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95conjugate-direction-method-in-optimization/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95conjugate-direction-method-in-optimization/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 26 Apr 2014 16:13:12 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[conjugate direction method]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[共轭方向法]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=8095</guid>

					<description><![CDATA[<p>
共轭方向法是介于<a href="http://www.codelast.com/?p=8006" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">最速下降法</span></a>和<a href="http://www.codelast.com/?p=8052" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>之间的一种存在&#8212;&#8212;它的收敛速度（二阶收敛）比最速下降法（线性收敛）快，同时它的计算量又比牛顿法要小，因此它的存在是有意义的。<br />
<span id="more-8095"></span><br />
需要注意，共轭方向法可以不使用目标函数的一阶导数信息（当然也可以使用）。所以，如果目标函数的一阶导数不容易求的话，共轭方向法可能就可以派上用场了。<br />
共轭方向法的显著特征就是：两次搜索方向之间是有关联的，这种关联就是&#8220;<span style="color:#0000ff;">共轭</span>&#8221;。<br />
<span style="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="background-color:#00ff00;">『1』</span>向量共轭<br />
先解释一下向量共轭的含义，你就明白共轭方向法的两次搜索方向之间的&#8220;共轭&#8221;是怎么回事了。<br />
设 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfcf28d0734569a6a693bc8194de62bf.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="G" /></span><script type='math/tex'>G</script> 为对称正定矩阵，若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_37aa6fd50c9cd0ae84da344d3fea07a2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_m^TG{d_n} = 0,\;\;m \ne n" /></span><script type='math/tex'>d_m^TG{d_n} = 0,\;\;m \ne n</script> ，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fba7cefe2ae092ffa5b6b0427619538b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_m}" /></span><script type='math/tex'>{d_m}</script> 和 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bbc1f7226df689a8d60b4e3d69a468a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_n}" /></span><script type='math/tex'>{d_n}</script> 为&#8220;G共轭&#8221;，共轭方向是&#8220;互不相关&#8221;的方向。</p>
<p><span style="background-color:#00ff00;">『2』</span>特性<br />
当目标函数是二次函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7b3308f8a3b2b34b5121ac917759d1ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) = \frac{1}{2}{x^T}Gx + {b^T}x + c" /></span><script type='math/tex'>f(x) = \frac{1}{2}{x^T}Gx + {b^T}x + c</script> 时，共轭方向法最多经过N步（N为向量维数）迭代，就可以到达极小值点&#8212;&#8212;这种特性叫作<span style="color:#0000ff;">二次收敛性</span>（<span style="color:#a52a2a;">Quadratic Convergence</span>）。<br />
假设沿着一系列的共轭方向做迭代（寻找极小值点），这些共轭方向组成的集合叫作共轭方向集，则沿共轭方向集的每个方向顺序做line search的时候，在每个方向上都不需要做重复搜索&#8212;&#8212;在任何一个方向上的移动，都不会影响到在另一个方向上已经找到的极小值。<br />
上面这段描述是什么意思呢？我们先不讨论这些共轭方向是怎么计算出来的，拿一个在水平面上走路的例子来做比喻：你在水平方向A上走了10米，然后再沿着与水平方向垂直的另一个方向B上又走了10米，那么，你在方向A上走动的时候，在方向B上的坐标是不变的；你在方向B上走动的时候，在方向A上的坐标也是不变的。因此，把方向A和方向B看作两个共轭方向，那么，你在这两个共轭方向中的任何一个方向上移动，都不会影响到另一个方向上已经走到的坐标（把它想像成在这个方向上的极小值）。<br />
<span style="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%9b-%e5%86%8d%e8%b0%88-%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95conjugate-direction-method-in-optimization/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
共轭方向法是介于<a href="http://www.codelast.com/?p=8006" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">最速下降法</span></a>和<a href="http://www.codelast.com/?p=8052" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>之间的一种存在&mdash;&mdash;它的收敛速度（二阶收敛）比最速下降法（线性收敛）快，同时它的计算量又比牛顿法要小，因此它的存在是有意义的。<br />
<span id="more-8095"></span><br />
需要注意，共轭方向法可以不使用目标函数的一阶导数信息（当然也可以使用）。所以，如果目标函数的一阶导数不容易求的话，共轭方向法可能就可以派上用场了。<br />
共轭方向法的显著特征就是：两次搜索方向之间是有关联的，这种关联就是&ldquo;<span style="color:#0000ff;">共轭</span>&rdquo;。<br />
<span style="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="background-color:#00ff00;">『1』</span>向量共轭<br />
先解释一下向量共轭的含义，你就明白共轭方向法的两次搜索方向之间的&ldquo;共轭&rdquo;是怎么回事了。<br />
设 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfcf28d0734569a6a693bc8194de62bf.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="G" /></span><script type='math/tex'>G</script> 为对称正定矩阵，若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_37aa6fd50c9cd0ae84da344d3fea07a2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_m^TG{d_n} = 0,\;\;m \ne n" /></span><script type='math/tex'>d_m^TG{d_n} = 0,\;\;m \ne n</script> ，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fba7cefe2ae092ffa5b6b0427619538b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_m}" /></span><script type='math/tex'>{d_m}</script> 和 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bbc1f7226df689a8d60b4e3d69a468a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_n}" /></span><script type='math/tex'>{d_n}</script> 为&ldquo;G共轭&rdquo;，共轭方向是&ldquo;互不相关&rdquo;的方向。</p>
<p><span style="background-color:#00ff00;">『2』</span>特性<br />
当目标函数是二次函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7b3308f8a3b2b34b5121ac917759d1ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) = \frac{1}{2}{x^T}Gx + {b^T}x + c" /></span><script type='math/tex'>f(x) = \frac{1}{2}{x^T}Gx + {b^T}x + c</script> 时，共轭方向法最多经过N步（N为向量维数）迭代，就可以到达极小值点&mdash;&mdash;这种特性叫作<span style="color:#0000ff;">二次收敛性</span>（<span style="color:#a52a2a;">Quadratic Convergence</span>）。<br />
假设沿着一系列的共轭方向做迭代（寻找极小值点），这些共轭方向组成的集合叫作共轭方向集，则沿共轭方向集的每个方向顺序做line search的时候，在每个方向上都不需要做重复搜索&mdash;&mdash;在任何一个方向上的移动，都不会影响到在另一个方向上已经找到的极小值。<br />
上面这段描述是什么意思呢？我们先不讨论这些共轭方向是怎么计算出来的，拿一个在水平面上走路的例子来做比喻：你在水平方向A上走了10米，然后再沿着与水平方向垂直的另一个方向B上又走了10米，那么，你在方向A上走动的时候，在方向B上的坐标是不变的；你在方向B上走动的时候，在方向A上的坐标也是不变的。因此，把方向A和方向B看作两个共轭方向，那么，你在这两个共轭方向中的任何一个方向上移动，都不会影响到另一个方向上已经走到的坐标（把它想像成在这个方向上的极小值）。<br />
<span style="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 />
但是世界哪有那么美好？目标函数不是二次函数的时候多得去了！这个时候，共轭方向法不就废了吗？非也非也。<br />
<span style="color:#0000cd;">理论与实践证明，将二次收敛算法用于非二次的目标函数，也有很好的效果</span>。但是，这个时候，就不能保证N步迭代到达极小值点了。大家需要记住的是，很多函数都可以用二次函数很好地近似，这种近似在工程上是很重要。<br />
有人一定会问，哪些函数可以用二次函数很好地近似呢？请原谅我没在书中看到这个总结，你只能自己去挖掘了。</p>
<p><span style="background-color:#00ff00;">『3』</span>理论基础<br />
共轭方向法有一个重要的理论基础，它是一个神奇的定理，有了它，可以推导出很多结论（共轭梯度法的理论推导就依赖于此）。<br />
这里只把结论写上来，证明较长，不是本文关注的所以就不写了：<br />
<span style="color:#ff0000;">在精确line search的情况下，当前迭代点的梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b2f5ff47436671b6e533d8dc3614845d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g" /></span><script type='math/tex'>g</script> 与前面所有的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> 直交：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9af80bf9ecd8ae0b0013c8f5c7c8412a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{i + 1}^T{d_j} = 0,\;\;j = 0,1, \cdots ,i" /></span><script type='math/tex'>g_{i + 1}^T{d_j} = 0,\;\;j = 0,1, \cdots ,i</script> </span><br />
这个结论在很多专业书中，都用了晦涩的描述来显示出教科书般的&ldquo;高端、大气、上档次&rdquo;，我看完之后只有一个感觉：看你们这些牛人写的书压力好大啊！<br />
上面的红字，是我认为可以精简成&ldquo;人话&rdquo;之后的描述，也许它不严谨，也许它有漏洞，但是它大概说的就是这么回事，简单不就是美吗？<br />
下面稍微解释一下定理中的一些概念：</p>
<div>
	<span style="color:#800080;">●</span> 为什么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8d872f432d24ebbba8149cc6b8513904.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{i + 1}^T{d_j} = 0" /></span><script type='math/tex'>g_{i + 1}^T{d_j} = 0</script> 表明两个向量&ldquo;直交&rdquo;？从两个向量的夹角的数学定义：</div>
<div style="text-align: center;">
	<img decoding="async" alt="vector angle" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/vector_angle.png" style="width: 150px; height: 71px;" /></div>
<div>
	我们可知， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83ac542f846e9dcc6aea6534e5303b66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{i + 1}^T{d_j}" /></span><script type='math/tex'>g_{i + 1}^T{d_j}</script> 为0时，整个式子为零，从而 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f898dd39bd002624d891bc76fb86aa9f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta = \frac{\pi }{2}" /></span><script type='math/tex'>\theta = \frac{\pi }{2}</script> ，也就是说两个向量的夹角是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e26d35e05970ddca7d236176d1db4d6d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\frac{\pi }{2}" /></span><script type='math/tex'>\frac{\pi }{2}</script> ，所以它们当然是&ldquo;直交&rdquo;的。</div>
<div>
	在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8d872f432d24ebbba8149cc6b8513904.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{i + 1}^T{d_j} = 0" /></span><script type='math/tex'>g_{i + 1}^T{d_j} = 0</script> 这个式子中，当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b2f5ff47436671b6e533d8dc3614845d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g" /></span><script type='math/tex'>g</script> 的下标是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_14b8b90a04464597e4e220394a9e1416.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{i + 1}" /></span><script type='math/tex'>{i + 1}</script> 时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> 的下标可以是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9b99ea6244b508fa66267b802a9accf5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0,1,\cdots ,i" /></span><script type='math/tex'>0,1,\cdots ,i</script> ，例如， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2e6140194834b2ff066e6b6bc5bafd46.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_3^T{d_0} = 0,\;\;g_3^T{d_1} = 0,\;\;g_3^T{d_2} = 0" /></span><script type='math/tex'>g_3^T{d_0} = 0,\;\;g_3^T{d_1} = 0,\;\;g_3^T{d_2} = 0</script> ，这表明，当前迭代点的梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d0720487a8b5bdbea3c08f5a9b9d3fef.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_3}" /></span><script type='math/tex'>{g_3}</script> 与前面所有的搜索方向（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_808b726a7c1125dc98c805fd9e6951a2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_0},{d_1},{d_2}" /></span><script type='math/tex'>{d_0},{d_1},{d_2}</script> ）直交。</div>
<p><span style="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 />
现在我把某书中一段和上面的理论等价的描述摘录下来，让大家看看它描述得是不是很晦涩：<br />
<span style="color:#b22222;">共轭方向法在迭代过程中的每一个迭代点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1ab026d0142e45d545714e7a32bc3258.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{i + 1}}" /></span><script type='math/tex'>{x_{i + 1}}</script> 都是目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2a5196aebb115722e7689aa4492f5dc9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_0},{d_1}, \cdots ,{d_i}" /></span><script type='math/tex'>{d_0},{d_1}, \cdots ,{d_i}</script> 所张成的线性流形</span></p>
<div style="text-align: center;">
	<img decoding="async" alt="conjugate direction basic theory" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/conjugate_direction_basic_theory.png" style="width: 330px; height: 94px;" /></div>
<p><span style="color:#b22222;">中的极小点。</span></p>
<div>
	其实这个晦涩的描述，是<a href="http://www.codelast.com/?p=7838" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">line search基础定理&mdash;&mdash;梯度与方向的点积为零</span></a>&mdash;&mdash;的另一种表述。例如，我们拿一个特例来说：</div>
<div>
	迭代点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c1015f14836165504ccbb2a42b2c150b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2}" /></span><script type='math/tex'>{x_2}</script> （此时 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5905475576a21ecdafdaab879ff45aff.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="i = 1" /></span><script type='math/tex'>i = 1</script> ）是目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 和方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f4aba82441fb27b51c794c3f12805550.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_0},{d_1}" /></span><script type='math/tex'>{d_0},{d_1}</script> 所张成的线性流形 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_567c97afc470e145244da0863bc2784a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\left\{ {\left. x \right|x = {x_0} + {\alpha _0}{d_0} + {\alpha _1}{d_1}} \right\}" /></span><script type='math/tex'>\left\{ {\left. x \right|x = {x_0} + {\alpha _0}{d_0} + {\alpha _1}{d_1}} \right\}</script> 的极小值点。</div>
<div>
	而 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_af41c8e502055b5419bf4c6ea8922fa9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0} + {\alpha _0}{d_0} + {\alpha _1}{d_1} = {x_1} + {\alpha _1}{d_1} = {x_2}" /></span><script type='math/tex'>{x_0} + {\alpha _0}{d_0} + {\alpha _1}{d_1} = {x_1} + {\alpha _1}{d_1} = {x_2}</script> ，所以这就说明了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 是在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fec6c6a71936f2a9cd2d11877a06b26.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{d_0}}" /></span><script type='math/tex'>{{d_0}}</script> 方向上line search得到的极小值点， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c1015f14836165504ccbb2a42b2c150b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2}" /></span><script type='math/tex'>{x_2}</script> 是在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_17fbe469667bc25c9dd11284cd8a5b48.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{{d_1}}" /></span><script type='math/tex'>{{d_1}}</script> 方向上line search得到的极小值点。所以由基础定理可知，当前迭代点的梯度与前面所有方向的点积为零。</div>
<p>自己慢慢体会...<br />
<span style="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="background-color:#00ff00;">『4』</span>基本流程<br />
下面来看看，共轭方向法在迭代过程中是怎么做的。<br />
假设迭代已经进行到了第 <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> 步，那么，下一步怎么走？</p>
<ul>
<li>
		确定一个搜索方向要满足： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c929b0bed7e38c6e5590cfd702e19c30.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_{k + 1}}^T{d_{k + 1}} < 0" /></span><script type='math/tex'>{g_{k + 1}}^T{d_{k + 1}} < 0</script> &mdash;&mdash;这是为了满足目标函数值下降的条件（下降是最优化的目标），并且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_65e44e11f11bcc2ccfa8dbe199bd54b2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_{k + 1}^TG{d_i} = 0,\;\;i = 1,2, \cdots ,k" /></span><script type='math/tex'>d_{k + 1}^TG{d_i} = 0,\;\;i = 1,2, \cdots ,k</script> &mdash;&mdash;这是为了满足搜索方向之间的&ldquo;共轭&rdquo;条件。</li>
<li>
		检验迭代终止条件，若未终止，则用line search求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_178488525cdfe1026fada662fa2c21f7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha \ge 0} f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha \ge 0} f({x_k} + \alpha {d_k})</script> &mdash;&mdash;在每一个搜索方向上，我们都要找到极小值点。</li>
<li>
		 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1a5b2864f2c2ad1481a919c59a5a793c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}} = {x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_{k + 1}} = {x_k} + {\alpha _k}{d_k}</script> ，继续迭代</li>
</ul>
<p>大家注意到，上面说确定一个搜索方向，要满足&ldquo;共轭&rdquo;的条件，问题是，共轭方向是如何获取的？光有愿望可不行啊。<br />
<span style="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="background-color:#00ff00;">『5』</span>创造共轭方向<br />
这里的关键是，如何构造出一个方向的集合，其N个方向线性无关、两两共轭？<br />
有一个经典的方案就是<span style="color:#ff0000;">Powell共轭方向集方法</span>。<br />
Powell是谁？</p>
<blockquote>
<p>
		<a href="http://mat.uc.pt/~zhang/powell.html" target="_blank" rel="noopener noreferrer">M.J.D. POWELL</a>，剑桥大学教授（已故），世界著名的最优化专家。他是袁亚湘的导师（袁亚湘，中国科学院数学与系统科学研究院研究员、博士生导师，美国数学学会首届会士（2012年），中国科学院院士）。</p>
</blockquote>
<p>Powell方法是一种不需要求目标函数导数的方法（<span style="color:#0000ff;">zero-order method</span>）。有一篇英文文章里说，如果你只需要知道一种zero-order method如何编程实现的话，那么一定是选Powell方法，可见Powell方法是有其重要地位的。<br />
关于Powell方法，可以参考一下<a href="http://www.codelast.com/?p=388" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这篇文章</span></a>，本文不详述。<br />
<span style="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="background-color:#00ff00;">『6』</span>Powell方法的问题及改进<br />
Powell方法产生的共轭方向集可能会变得线性相关，这会导致最终我们求得的，是N维空间的一个子空间内的极小值，而不是整体的极小值，所以，人们对Powell方法研究出了一些改进方案，例如：</p>
<ul>
<li>
		N轮迭代后，方向集重置为基向量；</li>
<li>
		Brent（就是<a href="http://en.wikipedia.org/wiki/Brent's_method" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Brent&#39;s method</span></a>的作者）提出，N轮迭代后，可以将方向集重置为任意<span style="color:#0000ff;">正交矩阵</span>（见下面的说明）的列向量；</li>
<li>
		放弃目标函数下降最大的方向，用一些好的方向代替N个必须共轭的方向；</li>
<li>
		...</li>
</ul>
<p>PS：什么是<span style="color:#0000ff;">正交矩阵</span>？<br />
一个实数正交矩阵是方块矩阵Q，它的转置矩阵是它的逆矩阵： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d289da4bbbfa230c42cbeebe685a9e05.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{Q^T}Q = Q{Q^T} = E" /></span><script type='math/tex'>{Q^T}Q = Q{Q^T} = E</script> ，其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3a3ea00cfc35332cedf6e5e9a32e94da.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="E" /></span><script type='math/tex'>E</script> 为单位矩阵：<br />
<img decoding="async" alt="unit matrix" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/unit_matrix.png" style="width: 130px; height: 140px;" /><br />
<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%9b-%e5%86%8d%e8%b0%88-%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95conjugate-direction-method-in-optimization/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] 再谈 牛顿法/Newton&#039;s Method In Optimization</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e7%89%9b%e9%a1%bf%e6%b3%95newtons-method-in-optimization/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e7%89%9b%e9%a1%bf%e6%b3%95newtons-method-in-optimization/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 06 Apr 2014 02:58:34 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Newton's method]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[牛顿法]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=8052</guid>

					<description><![CDATA[<p>
<a href="http://en.wikipedia.org/wiki/Newton's_method_in_optimization" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>是最优化领域的经典算法，它在寻优的过程中，使用了目标函数的二阶导数信息，具体说来就是：用迭代点的梯度和二阶导数对目标函数进行二次逼近，把二次函数的极小点作为新的迭代点，不断重复此过程，直到找到最优点。<br />
<span id="more-8052"></span><br />
<span style="background-color:#00ff00;">『1』</span>历史<br />
话说，牛顿法为什么叫牛顿法？这个近乎&#8220;废话&#8221;的问题，谁又真正查过？<br />
Wiki里是这样写的：牛顿法（Newton&#39;s method）是一种近似求解方程的方法，它使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。<br />
它最初由艾萨克&#8226;牛顿在《流数法》（Method of Fluxions，1671年完成，在牛顿死后的1736年公开发表）。<br />
按我的理解，起初牛顿法和最优化没什么关系（在那个年代应该还没有最优化这门学科分支），但是在最优化研究兴起后，人们把牛顿法的思想应用在最优化领域，于是也就叫它牛顿法了。</p>
<div>
	<span style="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></div>
<p><span style="background-color:#00ff00;">『2』</span>原理<br />
下面我们就来推导一下牛顿法的实现。<br />
目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在点 <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> 的泰勒展示式前三项为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e6187e61977f3367ae2cfab3166bef4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{q_k}(x) = {q_k}({x_k} + x - {x_k}) = f({x_k}) + g_k^T(x - {x_k}) + \frac{1}{2}{(x - {x_k})^T}{G_k}(x - {x_k}) + o(x - {x_k})" /></span><script type='math/tex'>{q_k}(x) = {q_k}({x_k} + x - {x_k}) = f({x_k}) + g_k^T(x - {x_k}) + \frac{1}{2}{(x - {x_k})^T}{G_k}(x - {x_k}) + o(x - {x_k})</script> <br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 是一阶导数（梯度）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 是二阶导数。当然，最后一项（高阶无穷小）我们依然是不考虑的。<br />
<span style="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%9b-%e5%86%8d%e8%b0%88-%e7%89%9b%e9%a1%bf%e6%b3%95newtons-method-in-optimization/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
<a href="http://en.wikipedia.org/wiki/Newton's_method_in_optimization" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>是最优化领域的经典算法，它在寻优的过程中，使用了目标函数的二阶导数信息，具体说来就是：用迭代点的梯度和二阶导数对目标函数进行二次逼近，把二次函数的极小点作为新的迭代点，不断重复此过程，直到找到最优点。<br />
<span id="more-8052"></span><br />
<span style="background-color:#00ff00;">『1』</span>历史<br />
话说，牛顿法为什么叫牛顿法？这个近乎&ldquo;废话&rdquo;的问题，谁又真正查过？<br />
Wiki里是这样写的：牛顿法（Newton&#39;s method）是一种近似求解方程的方法，它使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。<br />
它最初由艾萨克&bull;牛顿在《流数法》（Method of Fluxions，1671年完成，在牛顿死后的1736年公开发表）。<br />
按我的理解，起初牛顿法和最优化没什么关系（在那个年代应该还没有最优化这门学科分支），但是在最优化研究兴起后，人们把牛顿法的思想应用在最优化领域，于是也就叫它牛顿法了。</p>
<div>
	<span style="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></div>
<p><span style="background-color:#00ff00;">『2』</span>原理<br />
下面我们就来推导一下牛顿法的实现。<br />
目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在点 <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> 的泰勒展示式前三项为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e6187e61977f3367ae2cfab3166bef4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{q_k}(x) = {q_k}({x_k} + x - {x_k}) = f({x_k}) + g_k^T(x - {x_k}) + \frac{1}{2}{(x - {x_k})^T}{G_k}(x - {x_k}) + o(x - {x_k})" /></span><script type='math/tex'>{q_k}(x) = {q_k}({x_k} + x - {x_k}) = f({x_k}) + g_k^T(x - {x_k}) + \frac{1}{2}{(x - {x_k})^T}{G_k}(x - {x_k}) + o(x - {x_k})</script> <br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 是一阶导数（梯度）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 是二阶导数。当然，最后一项（高阶无穷小）我们依然是不考虑的。<br />
<span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为极小值点的一阶必要条件是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d05c810b120192221a64b9c5b09c6137.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\nabla {q_k}(x) = 0 = {g_k} + {G_k}(x - {x_k})" /></span><script type='math/tex'>\nabla {q_k}(x) = 0 = {g_k} + {G_k}(x - {x_k})</script> <br />
由此便可得到迭代公式： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8270e2e3b7d900af415458d0bfd0cefa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}} = {x_k} - {G_k}^{ - 1}{g_k}" /></span><script type='math/tex'>{x_{k + 1}} = {x_k} - {G_k}^{ - 1}{g_k}</script> <br />
在最优化line search的过程中，下一个点是由前一个点在一个方向d上移动得到的，因此，在牛顿法中，人们就顺其自然地称这个方向为&ldquo;<span style="color:#0000ff;">牛顿方向</span>&rdquo;，由上面的式子可知其等于： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_70df409d5a96a374522d67b7ec6cb9d9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {G_k}^{ - 1}{g_k}" /></span><script type='math/tex'>{d_k} = - {G_k}^{ - 1}{g_k}</script> </p>
<p><span style="background-color:#00ff00;">『3』</span>优缺点<br />
优点：充分接近极小点时，牛顿法具有二阶收敛速度&mdash;&mdash;挺好的，不是么。<br />
缺点：<br />
①牛顿法不是整体收敛的。<br />
②每次迭代计算 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> （的逆矩阵），计算量偏大。<br />
③线性方程组 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_70df409d5a96a374522d67b7ec6cb9d9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {G_k}^{ - 1}{g_k}" /></span><script type='math/tex'>{d_k} = - {G_k}^{ - 1}{g_k}</script> 可能是<span style="color:#0000ff;">病态</span>的，不好求解。<br />
（注：在代数方程中，有的多项式系数有微小扰动时其根变化很大，这种根对系数变化的敏感性称为不稳定性（instability），这种方程就是<span style="color:#0000ff;">病态</span>多项式方程）<br />
为了解决&ldquo;原始&rdquo;牛顿法的这些问题，人们想出了各种办法，于是就有了下面的各种改进方案，请听我一一道来。<br />
<span style="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="background-color:#00ff00;">『4』</span>牛顿法的改进１&mdash;&mdash;阻尼牛顿法<br />
前面说过了，牛顿法不是整体收敛的，在远离最优解时，牛顿方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_70df409d5a96a374522d67b7ec6cb9d9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {G_k}^{ - 1}{g_k}" /></span><script type='math/tex'>{d_k} = - {G_k}^{ - 1}{g_k}</script> 不一定是<span style="color:#0000ff;">下降方向</span>&mdash;&mdash;而目标函数值&ldquo;下降&rdquo;就是最优化努力的方向，因此，人们想到了，可以在牛顿法迭代的过程中加入一点&ldquo;阻力&rdquo;：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1a5b2864f2c2ad1481a919c59a5a793c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}} = {x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_{k + 1}} = {x_k} + {\alpha _k}{d_k}</script> <br />
我觉得&ldquo;阻力&rdquo;这个词还是比较形象的&mdash;&mdash;原来只有一个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> ，现在多了一个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，这就像是个阻碍啊。<br />
问题是， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 怎么求呢？<br />
可以在确定 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 之后，利用line search技术，求出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，使之满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_178488525cdfe1026fada662fa2c21f7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha \ge 0} f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha \ge 0} f({x_k} + \alpha {d_k})</script> （至于line search的算法，有太多太多了，<a href="http://www.codelast.com/?p=7364" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这里</span></a>有几个可以参考一下）。<br />
满足了这个条件，会发生什么？<br />
大家还记得《<a href="http://www.codelast.com/?p=7514" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">使用一维搜索(line search)的算法的收敛性</span></a>》定理吗？仔细看里面的&ldquo;适用于使用精确line search技术的算法&rdquo;的收敛性定理，你就会发现，当满足了上面所说的条件时，（阻尼）牛顿法的整体收敛性就得到了保证。<br />
当然，满足上面所说的条件的前提，就是所有的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 都正定。因为如果 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 不正定的话，就求不出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> ；求不出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的话，就求不出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ；求不出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 的话，就求不出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_63df53abbcadecae947de65a842e4f86.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_{k + 1}}" /></span><script type='math/tex'>{x_{k + 1}}</script> ，因此就求不出迭代公式，寻优过程就无法进行。<br />
<span style="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 />
那么问题就来了：阻尼牛顿法确实offer了整体收敛性，但是它并没有解决一个问题： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 不正定怎么办？此时迭代如何进行下去？因此，另一种改进方案应运而生，各位接着往下看。</p>
<p><span style="background-color:#00ff00;">『5』</span>Goldstein-Price修正<br />
首先，Goldstein和Price是两个人名，他们的具体生平事迹我没研究过。他们在1967年提出，如果 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 不正定（此时难以解出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_70df409d5a96a374522d67b7ec6cb9d9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {G_k}^{ - 1}{g_k}" /></span><script type='math/tex'>{d_k} = - {G_k}^{ - 1}{g_k}</script> ），就用&ldquo;<a href="http://www.codelast.com/?p=8006" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">最速下降方向</span></a>&rdquo;来作为搜索方向（看似已经&ldquo;过时&rdquo;的最速下降法还是能发挥余热的，这就体现出来了）：</p>
<div>
	<img decoding="async" alt="Newton's method Goldstein-Price" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/newton_method_goldstein_price.png" style="width: 400px; height: 73px;" /><br />
	其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e6885dfcb4c4a8ddb730c59135ffe731.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\delta \in (0,1)" /></span><script type='math/tex'>\delta \in (0,1)</script> <br />
	在这样的条件下，就使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 总能满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f9d2500ba754546d742143e1e9f0230c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos ({d_k}, - {g_k}) \ge \delta " /></span><script type='math/tex'>\cos ({d_k}, - {g_k}) \ge \delta </script> ，从而也就满足了《<a href="http://www.codelast.com/?p=7514" target="_blank" rel="noopener noreferrer"><span style="background-color: rgb(255, 160, 122);">使用一维搜索(line search)的算法的收敛性</span></a>》定理中的&ldquo;搜索方向条件&rdquo;，从而（Goldstein-Price修正）牛顿法具有整体收敛性。<br />
	<span style="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="background-color:#00ff00;">『6』</span>Goldfeld修正<br />
	与上面的Goldstein-Price修正的思路不同，Goldfeld在1966年也提出了一种方法，他的方法虽然还是在搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 上动手，但是当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 不正定时，他不是用最速下降方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 来作为搜索方向，而是将 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 修正成下降方向&mdash;&mdash;用下面的式子：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bd5579526a4aeccd9e6784566e80ea59.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - B_k^{ - 1}{g_k}" /></span><script type='math/tex'>{d_k} = - B_k^{ - 1}{g_k}</script> <br />
	其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d6b197395545713e292f056543da88ce.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{B_k} = {G_k} + {E_k}" /></span><script type='math/tex'>{B_k} = {G_k} + {E_k}</script> 是一个正定矩阵， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> 称为修正矩阵。在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> <span style="color:#0000ff;">满足一定条件</span>的时候，（Goldfeld修正）牛顿法具有整体收敛性。<br />
	具体要满足什么条件呢？一个关于矩阵 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a8065340a6debc5139adfdd3265f2b07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{B_k}" /></span><script type='math/tex'>{B_k}</script> &ldquo;<a href="http://zh.wikipedia.org/zh/%E6%9D%A1%E4%BB%B6%E6%95%B0" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">条件数</span></a>&rdquo;的条件。说实在的我对这部分不了解，并且这也不是本文的重点，所以在这里我就不把书上的定理搬上来了。<br />
	Goldfeld修正没有解决的问题就是：难以给出选取 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> 的有效方法。这就像是我告诉你，你要去魔法森林，就需要用到魔棒，但是魔棒去哪找，我不告诉你。于是，有其他的学者提出了其他的改进方法，帮你找到这个&ldquo;魔棒&rdquo;，请接着往下看。<br />
	<span style="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="background-color:#00ff00;">『7』</span>Gill-Murray的Cholesky分解法<br />
	看到这个小标题你可能就有点晕&mdash;&mdash;请尽情地晕吧，这里光是人名就有三个。最重要的就是Cholesky，这里我要补充一个小插曲，给大家说点轻松的知识（从网上复制来的，链接不记得了）：</div>
<blockquote>
<div>
		Cholesky是一个法国数学家，生于19世纪末。Cholesky分解是他在学术界最重要的贡献。后来，Cholesky参加了法国军队，不久在一战初始阵亡。<br />
		Cholesky分解是一种分解矩阵的方法, 在线性代数中有重要的应用。Cholesky分解把矩阵分解为一个下三角矩阵以及它的共轭转置矩阵的乘积（那实数界来类比的话，此分解就好像求平方根）。与一般的矩阵分解求解方程的方法比较，Cholesky分解效率很高。</div>
</blockquote>
<div>
	Cholesky真是英年早逝，以他对学术界的贡献来看，确实值得我们缅怀。<br />
	Gill和Murray这两个人，用Cholesky分解法实现了对牛顿法的改进，我个人觉得，他们的改进可以算是对Goldfeld修正的一种改进（或补充）吧，因为他们提供了求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> 的方法。</p>
<p>	这里的Cholesky分解（牛顿法），是这么一回事：对 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> （即Hesse矩阵）进行Cholesky分解，在分解的过程中，对它进行一定的修正，最后得到近似的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cbc036587240f187400a7665837a1611.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} " /></span><script type='math/tex'>\overline {{G_k}} </script> ，把这个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cbc036587240f187400a7665837a1611.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} " /></span><script type='math/tex'>\overline {{G_k}} </script> 当作 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> ，用于解出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 。<br />
	<span style="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:#800000;">我不想在这里误导大家，只想把我自己理解的写下来</span>：<br />
	若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 为正定矩阵，则它总能进行Cholesky分解，即&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fb77d6c4e0828b5703126ee6c6b6069a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k} = {L_k}{D_k}L_k^T" /></span><script type='math/tex'>{G_k} = {L_k}{D_k}L_k^T</script> ，其中 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a16319f7563602c7dbf5a2c5ca46ecc0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{L_k}" /></span><script type='math/tex'>{L_k}</script> 是一个单位下三角矩阵， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3961878be696f3864a17e9b34591e36e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{D_k}" /></span><script type='math/tex'>{D_k}</script> 是一个对角矩阵（diagonal matrix，除主对角线外的元素均为0的方阵）。<br />
	若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 不是个正定矩阵，那么就让Chokesky分解过程满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e55103a097cb5f563b30c1461ebe9cb1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} = {L_k}{D_k}L_k^T = {G_k} + {E_k}" /></span><script type='math/tex'>\overline {{G_k}} = {L_k}{D_k}L_k^T = {G_k} + {E_k}</script> （ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> 是一个对角矩阵），并且在分解过中调整 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3961878be696f3864a17e9b34591e36e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{D_k}" /></span><script type='math/tex'>{D_k}</script> 对角线上的元素（人们总结出了一些调整方法，例如使这些元素&gt;某个正常数），使得Hesse矩阵正定&mdash;&mdash;这里说的Hesse矩阵，是指前面说的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cbc036587240f187400a7665837a1611.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} " /></span><script type='math/tex'>\overline {{G_k}} </script> 。分解完成后，就可以用 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cbc036587240f187400a7665837a1611.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} " /></span><script type='math/tex'>\overline {{G_k}} </script> 来解出 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 了。<br />
	如果 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 是个<span style="color:#0000ff;">充分正定</span>（书上的名词，谁能给解释一下？）的矩阵，那么经过这个修正的过程， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cbc036587240f187400a7665837a1611.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\overline {{G_k}} " /></span><script type='math/tex'>\overline {{G_k}} </script> 其实就是原来的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> ， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6117194d806ebd85685939d8d20e4de5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{E_k}" /></span><script type='math/tex'>{E_k}</script> 其实也就不存在了&mdash;&mdash;这是个很好的特性。<br />
	我感觉上面的修正过程，用妹子来做一个比喻就是：一个妹子本来已经长得挺漂亮了，你为她化个妆（只要不是故意黑她），她还是那么漂亮。反之，如果一个妹子长得很搓，那么，你为她化妆，是有可能让她看上去变靓的。总之，都得到了我们想要的结果。<br />
	Cholesky分解算法我没看过，这里就没办法说了。</p>
<p>	有书上说，Gill-Murray的Cholesky分解牛顿法是&ldquo;对牛顿法改造得最彻底、最有实用价值的方法&rdquo;。<br />
	看来，有时候真的是：最复杂的就是最好的，没有捷径可走啊。<br />
	<span style="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="background-color:#00ff00;">『8』</span>信赖域牛顿法<br />
	在<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这篇</span></a>解释信赖域算法的文章里，我们说过了，<span style="color:#0000ff;">信赖域算法具有整体收敛性</span>。利用这一点，可以将其与牛顿法&ldquo;合体&rdquo;，创造出具有整体收敛性的信赖域牛顿法，即，我们要求的问题是：</p>
<div>
		<img decoding="async" alt="Newton's method trust region" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/newton_method_trust_region.png" style="width: 400px; height: 113px;" /><br />
		其中， <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_8ce4b16b22b58894aa86c421e8759df3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="k" /></span><script type='math/tex'>k</script> 表示第k次迭代， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 为梯度， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 为Hesse矩阵（二阶导数矩阵）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7897c8db80031ff84df5a87ff3761308.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_k}" /></span><script type='math/tex'>{h_k}</script> 为第k次迭代时的信赖域上界（半径）。<br />
		为什么它叫信赖域牛顿法？首先，它没有line search，求的是位移s，所以是一种信赖域算法；其次，它在求解的时候用到了梯度和二阶导数，因此是一种牛顿法。所以整体上叫它信赖域牛顿法是讲得过去的。<br />
		信赖域牛顿法有一个特点是令人欣慰的：没有要求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> （即Hesse矩阵）必须正定，这与前面各种算法与 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 正定那些纠缠不清的关系有很大不同。<br />
		至于信赖域算法的具体求解步骤是怎样的，这里就不说了，还是请大家参考<a href="http://www.codelast.com/?p=7488" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这篇</span></a>文章。<br />
		<span style="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="background-color:#00ff00;">『9』</span>总结<br />
		对牛顿法及其众多改进的介绍就到这里结束了。大家会看到，里面有很多定理没给出证明，有些推导可能也不够严谨，但是它们的结论基本上是正确的，如果纠结于细节，那真的是要去做理论研究，而不是应用到工程实践了。所以，学习最优化的时候，我们可以在一定程度上&ldquo;着眼全局，忽略细节&rdquo;，这会极大地有助于理解。<br />
		<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>
</p></div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e7%89%9b%e9%a1%bf%e6%b3%95newtons-method-in-optimization/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] 再谈 梯度下降法/最速下降法/Gradient descent/Steepest Descent</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%e6%a2%af%e5%ba%a6%e6%b3%95steepest-descent/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%e6%a2%af%e5%ba%a6%e6%b3%95steepest-descent/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Wed, 02 Apr 2014 16:23:41 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[gradient descent]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[steepest descent]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[最速下降法]]></category>
		<category><![CDATA[梯度下降法]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=8006</guid>

					<description><![CDATA[<p>
当今世界，深度学习应用已经渗透到了我们生活的方方面面，深度学习技术背后的核心问题是最优化(Optimization)。最优化是应用数学的一个分支，它是研究在给定约束之下如何寻求某些因素(的量)，以使某一(或某些)指标达到最优的一些学科的总称。<br />
梯度下降法（Gradient descent，又称最速下降法/Steepest&#160;descent），是无约束<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E4%BC%98%E5%8C%96" rel="noopener noreferrer" target="_blank"><span style="background-color: rgb(255, 160, 122);">最优化</span></a>领域中历史最悠久、最简单的算法，单独就这种算法来看，属于早就&#8220;过时&#8221;了的一种算法。但是，它的理念是其他某些算法的组成部分，或者说在其他某些算法中，也有梯度下降法的&#8220;影子&#8221;。例如，各种深度学习库都会使用SGD（Stochastic Gradient Descent，随机梯度下降）或变种作为其优化算法。<br />
今天我们就再来回顾一下梯度下降法的基础知识。<br />
<span id="more-8006"></span><br />
<span style="background-color:#00ff00;">『1』</span>名字释义<br />
在很多机器学习算法中，我们通常会通过多轮的迭代计算，最小化一个损失函数(loss function)的值，这个损失函数，对应到最优化里就是所谓的&#8220;目标函数&#8221;。<br />
在寻找最优解的过程中，梯度下降法只使用目标函数的一阶导数信息&#8212;&#8212;从&#8220;梯度&#8221;这个名字也可见一斑。并且它的本意是取目标函数值&#8220;最快下降&#8221;的方向作为搜索方向，这也是&#8220;最速下降&#8221;这个名字的来源。<br />
于是自然而然地，我们就想知道一个问题的答案：沿什么方向，目标函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script>  的值下降最快呢？</p>
<p><span style="background-color:#00ff00;">『2』</span>函数值下降最快的方向是什么<br />
先说结论：沿负梯度方向&#160; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aaf665c8dc32efb0ed392432cb3091ef.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d = - {g_k}" /></span><script type='math/tex'>d = - {g_k}</script> ，函数值下降最快。此处，我们用&#160; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> &#160;表示方向(direction)，用&#160; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b2f5ff47436671b6e533d8dc3614845d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g" /></span><script type='math/tex'>g</script> &#160;表示梯度(gradient)。<br />
下面就来推导一下。<br />
将目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在点 <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> 处泰勒展开（在最优化领域，这是一个常用的手段）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_37ec8b5a5be749597c9ef1bb8e9b1d2d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) = f({x_k}) + \alpha g_k^T{d_k} + o(\alpha )" /></span><script type='math/tex'>f(x) = f({x_k}) + \alpha g_k^T{d_k} + o(\alpha )</script> <br />
高阶无穷小 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c42304a467a6fa377fc950fcc6a5ccf9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="o(\alpha )" /></span><script type='math/tex'>o(\alpha )</script> 可忽略，由于我们定义了步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7f54bc2116eb53e3231634d008c92d90.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha/> 0" /</span><script type='math/tex'>\alpha 0</script> （在ML领域，步长就是平常所说的learning rate），因此，当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead119a63ddef55ab91efbf5514e3609.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_k^T{d_k} < 0" /></span><script type='math/tex'>g_k^T{d_k} < 0</script> 时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_320ccfc2694ebec4aa2bccff656c7baa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) < f({x_k})" /></span><script type='math/tex'>f(x) < f({x_k})</script> ，即函数值是<span style="color:#0000ff;">下降</span>的。此时 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 就是一个下降方向。<br />
但是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 具体等于什么的时候，可使目标函数值下降最快呢？<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><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%9b-%e5%86%8d%e8%b0%88-%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%e6%a2%af%e5%ba%a6%e6%b3%95steepest-descent/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
当今世界，深度学习应用已经渗透到了我们生活的方方面面，深度学习技术背后的核心问题是最优化(Optimization)。最优化是应用数学的一个分支，它是研究在给定约束之下如何寻求某些因素(的量)，以使某一(或某些)指标达到最优的一些学科的总称。<br />
梯度下降法（Gradient descent，又称最速下降法/Steepest&nbsp;descent），是无约束<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E4%BC%98%E5%8C%96" rel="noopener noreferrer" target="_blank"><span style="background-color: rgb(255, 160, 122);">最优化</span></a>领域中历史最悠久、最简单的算法，单独就这种算法来看，属于早就&ldquo;过时&rdquo;了的一种算法。但是，它的理念是其他某些算法的组成部分，或者说在其他某些算法中，也有梯度下降法的&ldquo;影子&rdquo;。例如，各种深度学习库都会使用SGD（Stochastic Gradient Descent，随机梯度下降）或变种作为其优化算法。<br />
今天我们就再来回顾一下梯度下降法的基础知识。<br />
<span id="more-8006"></span><br />
<span style="background-color:#00ff00;">『1』</span>名字释义<br />
在很多机器学习算法中，我们通常会通过多轮的迭代计算，最小化一个损失函数(loss function)的值，这个损失函数，对应到最优化里就是所谓的&ldquo;目标函数&rdquo;。<br />
在寻找最优解的过程中，梯度下降法只使用目标函数的一阶导数信息&mdash;&mdash;从&ldquo;梯度&rdquo;这个名字也可见一斑。并且它的本意是取目标函数值&ldquo;最快下降&rdquo;的方向作为搜索方向，这也是&ldquo;最速下降&rdquo;这个名字的来源。<br />
于是自然而然地，我们就想知道一个问题的答案：沿什么方向，目标函数  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script>  的值下降最快呢？</p>
<p><span style="background-color:#00ff00;">『2』</span>函数值下降最快的方向是什么<br />
先说结论：沿负梯度方向&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aaf665c8dc32efb0ed392432cb3091ef.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d = - {g_k}" /></span><script type='math/tex'>d = - {g_k}</script> ，函数值下降最快。此处，我们用&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> &nbsp;表示方向(direction)，用&nbsp; <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b2f5ff47436671b6e533d8dc3614845d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g" /></span><script type='math/tex'>g</script> &nbsp;表示梯度(gradient)。<br />
下面就来推导一下。<br />
将目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在点 <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> 处泰勒展开（在最优化领域，这是一个常用的手段）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_37ec8b5a5be749597c9ef1bb8e9b1d2d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) = f({x_k}) + \alpha g_k^T{d_k} + o(\alpha )" /></span><script type='math/tex'>f(x) = f({x_k}) + \alpha g_k^T{d_k} + o(\alpha )</script> <br />
高阶无穷小 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c42304a467a6fa377fc950fcc6a5ccf9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="o(\alpha )" /></span><script type='math/tex'>o(\alpha )</script> 可忽略，由于我们定义了步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7f54bc2116eb53e3231634d008c92d90.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha > 0" /></span><script type='math/tex'>\alpha > 0</script> （在ML领域，步长就是平常所说的learning rate），因此，当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead119a63ddef55ab91efbf5514e3609.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_k^T{d_k} < 0" /></span><script type='math/tex'>g_k^T{d_k} < 0</script> 时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_320ccfc2694ebec4aa2bccff656c7baa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x) < f({x_k})" /></span><script type='math/tex'>f(x) < f({x_k})</script> ，即函数值是<span style="color:#0000ff;">下降</span>的。此时 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 就是一个下降方向。<br />
但是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 具体等于什么的时候，可使目标函数值下降最快呢？<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
数学上，有一个非常著名的不等式：<a href="http://www.codelast.com/?p=8022" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">Cauchy-Schwartz不等式（柯西-许瓦兹不等式）</span></a><sup><span style="font-size: 13.3333px;">1</span></sup>，它是一个在很多场合都用得上的不等式：</p>
<div>
	<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2faef7bfff1303da60951a77f6c7d4d0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} " /></span><script type='math/tex'>({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} </script> </span></div>
<div>
	当且仅当：</div>
<div>
	<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6337b1fff757e26d559865b0f907b86f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\frac{{{a_1}}}{{{b_1}}} = \frac{{{a_2}}}{{{b_2}}} = \cdots = \frac{{{a_n}}}{{{b_n}}}" /></span><script type='math/tex'>\frac{{{a_1}}}{{{b_1}}} = \frac{{{a_2}}}{{{b_2}}} = \cdots = \frac{{{a_n}}}{{{b_n}}}</script> </span></div>
<div>
	时等号成立。<br />
	&nbsp;</div>
<p>由Cauchy-Schwartz不等式可知：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0a0acce3485256ce4904d0abea1a4717.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\left| {d_k^T{g_k}} \right| \le \left\| {{d_k}} \right\|\left\| {{g_k}} \right\|" /></span><script type='math/tex'>\left| {d_k^T{g_k}} \right| \le \left\| {{d_k}} \right\|\left\| {{g_k}} \right\|</script> <br />
当且仅当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a7c9e705147a8c9a65808417da4ea36f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = {g_k}" /></span><script type='math/tex'>{d_k} = {g_k}</script> 时，等号成立， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_62f84a80c057c4892a5e22755b4976aa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_k^T{g_k}" /></span><script type='math/tex'>d_k^T{g_k}</script> 最大（&gt;0）。<br />
所以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6f02d7b4f8531090efdc877eb851f093.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {g_k}" /></span><script type='math/tex'>{d_k} = - {g_k}</script> 时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_62f84a80c057c4892a5e22755b4976aa.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_k^T{g_k}" /></span><script type='math/tex'>d_k^T{g_k}</script> 最小（&lt;0）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 下降量最大。<br />
所以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 是<span style="color:#ff0000;">最</span>快<span style="color:#ff0000;">速</span>下降方向。</p>
<p><span style="background-color:#00ff00;">『3』</span>缺点<br />
它真的如它的名字所描述的，是&ldquo;最快速&rdquo;的吗？从很多经典的最优化书籍你会了解到：并不是。<br />
事实上，它只在局部范围内具有&ldquo;最速&rdquo;性质；对整体求最优解的过程而言，它让目标函数值下降非常缓慢。</p>
<p><span style="background-color:#00ff00;">『4』</span>感受一下它是如何&ldquo;慢&rdquo;的<br />
先来看一幅图<sup>2</sup>：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/Rosenbrock_function.png" style="width: 378px; height: 302px;" /></div>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
这幅图表示的是对一个目标函数寻找最优解的过程，图中锯齿状的路线就是寻优路线在二维平面上的投影。从这幅图我们可以看到，锯齿一开始比较大（跨越的距离比较大），后来越来越小；这就像一个人走路迈的步子，一开始大，后来步子越迈越小。<br />
这个函数的表达式是这样的：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4526ba6075c8c9c1d532166726779a6a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_1},{x_2}) = {(1 - {x_1})^2} + 100 \cdot {({x_2} - {x_1}^2)^2}" /></span><script type='math/tex'>f({x_1},{x_2}) = {(1 - {x_1})^2} + 100 \cdot {({x_2} - {x_1}^2)^2}</script> <br />
它叫做<span style="color:#0000ff;">Rosenbrock function<sup>3</sup>（罗森布罗克函数）</span>，是个非凸函数，在最优化领域，它可以用作一个最优化算法的performance test函数。这个函数还有一个更好记也更滑稽的名字：banana function（香蕉函数）。<br />
我们来看一看它在三维空间中的图形：</p>
<div style="text-align: center;">
	<img decoding="async" alt="Rosenbrock function 3D" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/Rosenbrock_function_3d.jpg" style="width: 450px; height: 338px;" /></div>
<div>
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	它的全局最优点位于一个长长的、狭窄的、抛物线形状的、扁平的&ldquo;山谷&rdquo;中。</div>
<div>
	找到&ldquo;山谷&rdquo;并不难，难的是收敛到全局最优解（在 (1,1) 处）。</div>
<div>
	正所谓：<span style="color:#800000;">世界上最遥远的距离，不是你离我千山万水，而是你就在我眼前，我却要跨越千万步，才能找到你</span>。</div>
<div>
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	我们再来看另一个目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8befafb138a9640e761679a0f15f30bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x,y) = \sin \left( {\frac{1}{2}{x^2} - \frac{1}{4}{y^2} + 3} \right)\cos \left( {2x + 1 - {e^y}} \right)" /></span><script type='math/tex'>f(x,y) = \sin \left( {\frac{1}{2}{x^2} - \frac{1}{4}{y^2} + 3} \right)\cos \left( {2x + 1 - {e^y}} \right)</script> 的寻优过程<sup>4</sup>：</div>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/function_find_opt_process.jpg" style="width: 310px; height: 309px;" /></div>
<div>
	和前面的Rosenbrock function一样，它的寻优过程也是&ldquo;锯齿状&rdquo;的。<br />
	它在三维空间中的图形是这样的：</div>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/function_find_opt_process_3d.jpg" style="width: 365px; height: 300px;" /></div>
<div>
	总而言之就是：当目标函数的等值线接近于圆(球)时，下降较快；等值线类似于扁长的椭球时，一开始快，后来很慢。</div>
<div>
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	<span style="background-color:#00ff00;">『5』</span>为什么&ldquo;慢&rdquo;<br />
	从上面花花绿绿的图，我们看到了寻找最优解的过程有多么&ldquo;艰辛&rdquo;，但不能光看热闹，还要分析一下原因。<br />
	在最优化算法中，精确的line search满足一个<a href="http://www.codelast.com/?p=7838" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">一阶必要条件</span></a>，即：梯度与方向的点积为零（当前点在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上移动到的那一点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> ）处的梯度，与当前点的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的点积为零）。<br />
	由此得知：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_79c40a2ebc114054140981fdaed79c9f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0" /></span><script type='math/tex'>\nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0</script> ，即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2b4eb83bd55e78edd9cda00404acfeb0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{k + 1}^T{d_k} = 0" /></span><script type='math/tex'>g_{k + 1}^T{d_k} = 0</script> <br />
	故由梯度下降法的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6f02d7b4f8531090efdc877eb851f093.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k} = - {g_k}" /></span><script type='math/tex'>{d_k} = - {g_k}</script> 得：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_03f082fe728fefc7e4909366635af3e9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_{k + 1}^T{d_k} = g_{k + 1}^T( - {g_k}) = - g_{k + 1}^T{g_k} = - d_{k + 1}^T{d_k} = 0 \Rightarrow " /></span><script type='math/tex'>g_{k + 1}^T{d_k} = g_{k + 1}^T( - {g_k}) = - g_{k + 1}^T{g_k} = - d_{k + 1}^T{d_k} = 0 \Rightarrow </script> <span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fb24eac9024e19c63ae8e21214df893f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_{k + 1}^T{d_k} = 0" /></span><script type='math/tex'>d_{k + 1}^T{d_k} = 0</script> </span><br />
	即：相邻两次的搜索方向是相互直交的（投影到二维平面上，就是锯齿形状了）。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	如果你非要问，为什么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_fb24eac9024e19c63ae8e21214df893f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d_{k + 1}^T{d_k} = 0" /></span><script type='math/tex'>d_{k + 1}^T{d_k} = 0</script> 就表明这两个向量是相互直交的？那是因为，由两向量夹角的公式：<br />
	 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_162dccc3552556d48c0bb57f60aaebc4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos \theta = \frac{{{d_k}^T{d_k}}}{{\left\| {{d_k}} \right\|\left\| {{d_k}} \right\|}} = \frac{0}{{\left\| {{d_k}} \right\|\left\| {{d_k}} \right\|}} = 0\;" /></span><script type='math/tex'>\cos \theta = \frac{{{d_k}^T{d_k}}}{{\left\| {{d_k}} \right\|\left\| {{d_k}} \right\|}} = \frac{0}{{\left\| {{d_k}} \right\|\left\| {{d_k}} \right\|}} = 0\;</script> <br />
	=&gt;<span style="color:#ff0000;">  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f898dd39bd002624d891bc76fb86aa9f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\theta = \frac{\pi }{2}" /></span><script type='math/tex'>\theta = \frac{\pi }{2}</script> </span><br />
	可知两向量夹角为90度，因此它们直交。</p>
<p>	<span style="background-color:#00ff00;">『6』</span>优点<br />
	这个被我们说得一无是处的方法真的就那么糟糕吗？其实它还是有优点的：程序简单，计算量小；并且对初始点没有特别的要求；此外，许多算法的初始/再开始方向都是最速下降方向（即负梯度方向）。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	<span style="background-color:#00ff00;">『7』</span>收敛性及收敛速度<br />
	梯度下降法具有整体收敛性&mdash;&mdash;对初始点没有特殊要求。<br />
	采用<a href="http://www.codelast.com/?p=2348" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">精确的line search</span></a>的梯度下降法的收敛速度：线性。<br />
	&nbsp;</div>
<ul>
<li>
		引用</li>
</ul>
<div>
	（1）https://en.wikipedia.org/wiki/Cauchy%E2%80%93Schwarz_inequality<br />
	（2）https://en.wikipedia.org/wiki/Gradient_descent<br />
	（3）https://en.wikipedia.org/wiki/Rosenbrock_function<br />
	（4）https://en.wikipedia.org/wiki/Gradient_descent</p>
<p>	<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>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-%e5%86%8d%e8%b0%88-%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%e6%a2%af%e5%ba%a6%e6%b3%95steepest-descent/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] Cauchy-Schwartz(柯西-施瓦茨)不等式复习</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-cauchy-schwartz%e6%9f%af%e8%a5%bf-%e8%ae%b8%e7%93%a6%e5%85%b9%e4%b8%8d%e7%ad%89%e5%bc%8f%e5%a4%8d%e4%b9%a0/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-cauchy-schwartz%e6%9f%af%e8%a5%bf-%e8%ae%b8%e7%93%a6%e5%85%b9%e4%b8%8d%e7%ad%89%e5%bc%8f%e5%a4%8d%e4%b9%a0/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Wed, 02 Apr 2014 15:07:22 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Cauchy-Schwartz inequality]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[柯西不等式]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=8022</guid>

					<description><![CDATA[<p>
<a href="http://zh.wikipedia.org/wiki/%E6%9F%AF%E8%A5%BF-%E6%96%BD%E7%93%A6%E8%8C%A8%E4%B8%8D%E7%AD%89%E5%BC%8F" rel="noopener noreferrer" target="_blank"><span style="color:#0000ff;">柯西-</span>施瓦茨<span style="color:#0000ff;">不等式</span></a>，又叫<span style="color:#0000ff;">柯西不等式</span>，<span style="color:#0000ff;">施瓦茨不等式</span>，<span style="color:#0000ff;">柯西-布尼亚科夫斯基-施瓦茨不等式</span>，等等，中文名太多了，它是最重要的数学不等式之一，如下：<br />
<span id="more-8022"></span><br />
<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cb74bbb01f35d004cc6a7e9f6230ec62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n})^2} \le (a_1^2 + a_2^2 + \cdots + a_n^2)(b_1^2 + b_2^2 + \cdots + b_n^2)" /></span><script type='math/tex'>{({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n})^2} \le (a_1^2 + a_2^2 + \cdots + a_n^2)(b_1^2 + b_2^2 + \cdots + b_n^2)</script> </span><br />
<!--more--><br />
两边开方，它与下面的不等式是等价的：<br />
<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2faef7bfff1303da60951a77f6c7d4d0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} " /></span><script type='math/tex'>({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} </script> </span><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><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%9b-cauchy-schwartz%e6%9f%af%e8%a5%bf-%e8%ae%b8%e7%93%a6%e5%85%b9%e4%b8%8d%e7%ad%89%e5%bc%8f%e5%a4%8d%e4%b9%a0/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
<a href="http://zh.wikipedia.org/wiki/%E6%9F%AF%E8%A5%BF-%E6%96%BD%E7%93%A6%E8%8C%A8%E4%B8%8D%E7%AD%89%E5%BC%8F" rel="noopener noreferrer" target="_blank"><span style="color:#0000ff;">柯西-</span>施瓦茨<span style="color:#0000ff;">不等式</span></a>，又叫<span style="color:#0000ff;">柯西不等式</span>，<span style="color:#0000ff;">施瓦茨不等式</span>，<span style="color:#0000ff;">柯西-布尼亚科夫斯基-施瓦茨不等式</span>，等等，中文名太多了，它是最重要的数学不等式之一，如下：<br />
<span id="more-8022"></span><br />
<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cb74bbb01f35d004cc6a7e9f6230ec62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n})^2} \le (a_1^2 + a_2^2 + \cdots + a_n^2)(b_1^2 + b_2^2 + \cdots + b_n^2)" /></span><script type='math/tex'>{({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n})^2} \le (a_1^2 + a_2^2 + \cdots + a_n^2)(b_1^2 + b_2^2 + \cdots + b_n^2)</script> </span><br />
<!--more--><br />
两边开方，它与下面的不等式是等价的：<br />
<span style="color:#b22222;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2faef7bfff1303da60951a77f6c7d4d0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} " /></span><script type='math/tex'>({a_1}{b_1} + {a_2}{b_2} + \cdots + {a_n}{b_n}) \le \sqrt {(a_1^2 + a_2^2 + \cdots + a_n^2)} \sqrt {(b_1^2 + b_2^2 + \cdots + b_n^2)} </script> </span><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
当且仅当：<br />
<span style="color:#0000ff;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6337b1fff757e26d559865b0f907b86f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\frac{{{a_1}}}{{{b_1}}} = \frac{{{a_2}}}{{{b_2}}} = \cdots = \frac{{{a_n}}}{{{b_n}}}" /></span><script type='math/tex'>\frac{{{a_1}}}{{{b_1}}} = \frac{{{a_2}}}{{{b_2}}} = \cdots = \frac{{{a_n}}}{{{b_n}}}</script> </span><br />
时等号成立。</p>
<p><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%9b-cauchy-schwartz%e6%9f%af%e8%a5%bf-%e8%ae%b8%e7%93%a6%e5%85%b9%e4%b8%8d%e7%ad%89%e5%bc%8f%e5%a4%8d%e4%b9%a0/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>[原创] line search中的重要定理 - 梯度与方向的点积为零</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 02 Mar 2014 04:17:53 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7838</guid>

					<description><![CDATA[<p>
对精确的line search（线搜索），有一个重要的定理：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/line_search_important_theory.png" style="width: 292px; height: 62px;" /></div>
<p>这个定理表明，当前点在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上移动到的那一点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> ）处的梯度，与当前点的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的点积为零。<br />
<span id="more-7838"></span><br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 是称之为&#8220;步长&#8221;的一个实数，它是通过line search算法求出来的。</p>
<p>为什么会有这样的结论？我们来看看。<br />
对每一个line search过程来说，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 已经已经是确定的了（在最优化算法中，如何找出一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 不是line search干的事情）。所以，在一个确定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 上，要找到一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ea810edb4a7e8eadbe210b70b3a20fa7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha ) = f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>\phi (\alpha ) = f({x_k} + \alpha {d_k})</script> 这个函数满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_12c0bd0e35955bb786ce9ac5f6f4b864.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) < f({x_k})</script> ，这就是line search的目的。说白了，就是要找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 使 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_17babde0fb3f14619432c61a083d48ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha )" /></span><script type='math/tex'>\phi (\alpha )</script> 的函数函数值变小。<br />
<span style="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%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
对精确的line search（线搜索），有一个重要的定理：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/line_search_important_theory.png" style="width: 292px; height: 62px;" /></div>
<p>这个定理表明，当前点在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上移动到的那一点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> ）处的梯度，与当前点的搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 的点积为零。<br />
<span id="more-7838"></span><br />
其中， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 是称之为&ldquo;步长&rdquo;的一个实数，它是通过line search算法求出来的。</p>
<p>为什么会有这样的结论？我们来看看。<br />
对每一个line search过程来说，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 已经已经是确定的了（在最优化算法中，如何找出一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 不是line search干的事情）。所以，在一个确定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 上，要找到一个合适的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ea810edb4a7e8eadbe210b70b3a20fa7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha ) = f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>\phi (\alpha ) = f({x_k} + \alpha {d_k})</script> 这个函数满足 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_12c0bd0e35955bb786ce9ac5f6f4b864.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) < f({x_k})</script> ，这就是line search的目的。说白了，就是要找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 使 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_17babde0fb3f14619432c61a083d48ae.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi (\alpha )" /></span><script type='math/tex'>\phi (\alpha )</script> 的函数函数值变小。<br />
<span style="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 />
但是，要小到什么程度呢？假设小到有可能的&ldquo;最小&rdquo;，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_57d69503331c217962370d0aba642512.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi ({\alpha _k}) = f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k}) = \mathop {\min }\limits_{\alpha > 0} \phi (\alpha )" /></span><script type='math/tex'>\phi ({\alpha _k}) = f({x_k} + {\alpha _k}{d_k}) = \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k}) = \mathop {\min }\limits_{\alpha > 0} \phi (\alpha )</script> <br />
那么，我们称这样的line search为&ldquo;精确的line search&rdquo;&mdash;&mdash;你看，这名字好贴切：我们精确地找到了函数值最小的那个点。</p>
<p>既然 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> 是函数值最小的那个点，那么，在该点处的一阶导数（即梯度）为零，所以我们对上式求导（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 是自变量， <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为常量）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8fb51f475ef3cf5596f7e8252a03b01b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\phi '({\alpha _k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime } \cdot (0 + 1 \cdot {d_k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime }{d_k} = \nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0" /></span><script type='math/tex'>\phi '({\alpha _k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime } \cdot (0 + 1 \cdot {d_k}) = {\left[ {f({x_k} + {\alpha _k}{d_k})} \right]^\prime }{d_k} = \nabla f{({x_k} + {\alpha _k}{d_k})^T}{d_k} = 0</script> <br />
<span style="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 />
这就是我们前面说的定理了。</p>
<p><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%9b-line-search%e4%b8%ad%e7%9a%84%e9%87%8d%e8%a6%81%e5%ae%9a%e7%90%86-%e6%a2%af%e5%ba%a6%e4%b8%8e%e6%96%b9%e5%90%91%e7%9a%84%e7%82%b9%e7%a7%af%e4%b8%ba%e9%9b%b6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]使用一维搜索(line search)的算法的收敛性</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2line-search%e7%9a%84%e7%ae%97%e6%b3%95%e7%9a%84%e6%94%b6%e6%95%9b%e6%80%a7/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2line-search%e7%9a%84%e7%ae%97%e6%b3%95%e7%9a%84%e6%94%b6%e6%95%9b%e6%80%a7/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Tue, 29 Oct 2013 15:24:10 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[收敛性]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7514</guid>

					<description><![CDATA[<p>
在最优化领域中，有一类使用一维搜索（line search）的算法，例如<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>等。这类算法采用的是 <span style="color:#0000ff;">确定搜索方向&#8594;进行一维搜索&#8594;调整搜索方向&#8594;进行一维搜索</span> 的迭代过程来求解。那么，这类算法应该满足什么条件的时候才能收敛？本文将略为讨论一下。请务必看清本文的标题：不是讨论line search的收敛性，而是讨论使用line search的算法的收敛性。<br />
<span id="more-7514"></span><br />
<span style="background-color:#00ff00;">【1】</span>搜索方向条件<br />
搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 满足什么条件时算法才能收敛？谈到这个问题，首先就要定义搜索方向&#8212;&#8212;要有一个&#8220;参照物&#8221;，要不然何来方向之说呢？<br />
用 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 与负梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 的夹角 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 来衡量搜索方向。我们先给出结论： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 应满足：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_convergence_property_1.png" style="width: 280px; height: 73px;" /><br />
<span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8e50450420bb2e5ebad5002d615f93d5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}, - {g_k}" /></span><script type='math/tex'>{d_k}, - {g_k}</script> 都是向量）夹角的余弦怎么计算：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_convergence_property_2.png" style="width: 200px; height: 86px;" /><br />
<span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e973dc08d5acdbeb2d0d8ad588def4a4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{ - {g_k}^T{d_k}}" /></span><script type='math/tex'>{ - {g_k}^T{d_k}}</script> 是两个向量的点积（数量积），分母 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7cc5882e84d1847284e8a3c2665cb850.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\left\&#124; {{g_k}} \right\&#124;\left\&#124; {{d_k}} \right\&#124;}" /></span><script type='math/tex'>{\left\&#124; {{g_k}} \right\&#124;\left\&#124; {{d_k}} \right\&#124;}</script> 是两个向量的范数之积，分母&#62;0。<br />
由上面 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 的取值范围可知 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_909edc7edc1f6163ea05ff3c6b1c2e1a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos {\theta _k} \in (0,1)" /></span><script type='math/tex'>\cos {\theta _k} \in (0,1)</script> ，即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dbbc28fa63f4b257a2b4f4896194a152.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos {\theta _k}/> 0" /</span><script type='math/tex'>\cos {\theta _k} 0</script> ，因此 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> <br />
所以，根据泰勒展开式（忽略掉高阶无穷小部分）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e756c37a3b14c544250c482126a4c78.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k}) = f({x_k}) + \alpha {g_k}^T{d_k} + o(\alpha )" /></span><script type='math/tex'>f({x_k} + \alpha {d_k}) = f({x_k}) + \alpha {g_k}^T{d_k} + o(\alpha )</script> <br />
我们可知， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a3fa56198f5bcf005c1237de03ecbd26.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + \alpha {d_k}) < f({x_k})</script> ，即<span style="color:#0000ff;">函数值是下降的</span>&#8212;&#8212;下降正是最优化的目标。<br />
所以你现在明白为什么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 要满足上面的条件了。<br />
<span style="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%9b%e4%bd%bf%e7%94%a8%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2line-search%e7%9a%84%e7%ae%97%e6%b3%95%e7%9a%84%e6%94%b6%e6%95%9b%e6%80%a7/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
在最优化领域中，有一类使用一维搜索（line search）的算法，例如<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">牛顿法</span></a>等。这类算法采用的是 <span style="color:#0000ff;">确定搜索方向&rarr;进行一维搜索&rarr;调整搜索方向&rarr;进行一维搜索</span> 的迭代过程来求解。那么，这类算法应该满足什么条件的时候才能收敛？本文将略为讨论一下。请务必看清本文的标题：不是讨论line search的收敛性，而是讨论使用line search的算法的收敛性。<br />
<span id="more-7514"></span><br />
<span style="background-color:#00ff00;">【1】</span>搜索方向条件<br />
搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 满足什么条件时算法才能收敛？谈到这个问题，首先就要定义搜索方向&mdash;&mdash;要有一个&ldquo;参照物&rdquo;，要不然何来方向之说呢？<br />
用 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 与负梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 的夹角 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 来衡量搜索方向。我们先给出结论： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 应满足：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_convergence_property_1.png" style="width: 280px; height: 73px;" /><br />
<span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8e50450420bb2e5ebad5002d615f93d5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}, - {g_k}" /></span><script type='math/tex'>{d_k}, - {g_k}</script> 都是向量）夹角的余弦怎么计算：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_convergence_property_2.png" style="width: 200px; height: 86px;" /><br />
<span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e973dc08d5acdbeb2d0d8ad588def4a4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{ - {g_k}^T{d_k}}" /></span><script type='math/tex'>{ - {g_k}^T{d_k}}</script> 是两个向量的点积（数量积），分母 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7cc5882e84d1847284e8a3c2665cb850.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\left\| {{g_k}} \right\|\left\| {{d_k}} \right\|}" /></span><script type='math/tex'>{\left\| {{g_k}} \right\|\left\| {{d_k}} \right\|}</script> 是两个向量的范数之积，分母&gt;0。<br />
由上面 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 的取值范围可知 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_909edc7edc1f6163ea05ff3c6b1c2e1a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos {\theta _k} \in (0,1)" /></span><script type='math/tex'>\cos {\theta _k} \in (0,1)</script> ，即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dbbc28fa63f4b257a2b4f4896194a152.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\cos {\theta _k} > 0" /></span><script type='math/tex'>\cos {\theta _k} > 0</script> ，因此 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> <br />
所以，根据泰勒展开式（忽略掉高阶无穷小部分）：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e756c37a3b14c544250c482126a4c78.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k}) = f({x_k}) + \alpha {g_k}^T{d_k} + o(\alpha )" /></span><script type='math/tex'>f({x_k} + \alpha {d_k}) = f({x_k}) + \alpha {g_k}^T{d_k} + o(\alpha )</script> <br />
我们可知， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a3fa56198f5bcf005c1237de03ecbd26.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k}) < f({x_k})" /></span><script type='math/tex'>f({x_k} + \alpha {d_k}) < f({x_k})</script> ，即<span style="color:#0000ff;">函数值是下降的</span>&mdash;&mdash;下降正是最优化的目标。<br />
所以你现在明白为什么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3131592ca5d71947c49e5566de089e24.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\theta _k}" /></span><script type='math/tex'>{\theta _k}</script> 要满足上面的条件了。<br />
<span style="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="background-color:#00ff00;">【2】</span>两个关于收敛性的重要理论<br />
这两个理论非常重要，作个比喻，如果你要自己设计一个使用line search技术的算法，并且要保证它能收敛的话，那么，你可能就要让你的算法符合这两个理论的要求。<br />
其中一个理论描述了使用精确line search技术的算法的收敛性，另一个描述了使用不精确line search技术的算法的收敛性。<br />
<span style="background-color:#dda0dd;">①</span>适用于使用精确line search技术的算法<br />
设最优化算法产生的点序列为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f9ea7f736dbc8e9f8a7c5b31c8270c71.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\{ {x_k}\} ,\{ f({x_k})\} " /></span><script type='math/tex'>\{ {x_k}\} ,\{ f({x_k})\} </script> ，对任意 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ac7f25d9bbac3e3961c83fe88775b02d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0} \in {R^n}" /></span><script type='math/tex'>{x_0} \in {R^n}</script> ，目标函数的梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e84fec1e074026d6fa8e3155482c35c3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g(x)" /></span><script type='math/tex'>g(x)</script> 在水平集 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5eb706eb1fa35b8609f02111950895ec.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="L = \{ x \in {R^n}:f(x) \le f({x_0})\} " /></span><script type='math/tex'>L = \{ x \in {R^n}:f(x) \le f({x_0})\} </script> 上<span style="color:#ff0000;">一致连续</span>，若line search的步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 满足精确搜索条件 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e87da303f6aa2fc8194483479096cdb0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k} = \arg \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>{\alpha _k} = \arg \mathop {\min }\limits_{\alpha > 0} f({x_k} + \alpha {d_k})</script> ，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 与 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 的夹角满足前面所说的搜索方向条件，那么，必然会发生下面3种情况中的一种：<br />
<span style="color:#0000ff;">（1）</span>存在某个有限的 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_081b7d4d8eb6434a34715da9096a7110.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k} = 0" /></span><script type='math/tex'>{g_k} = 0</script> <br />
<span style="color:#0000ff;">（2）</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a6f8668d7f88cb2891cdebfdc4d05bd8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) \to - \infty " /></span><script type='math/tex'>f({x_k}) \to - \infty </script> <br />
<span style="color:#0000ff;">（3）</span><span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a1cf4b8722569ad1ba6ff89c33fde2d7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k} \to 0" /></span><script type='math/tex'>{g_k} \to 0</script> </span><br />
<span style="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 />
其中，（3）是最常见的情况，（1）和（2）很少出现&mdash;&mdash;书上是这么说的，至于为什么，我不知道。<br />
（3）中的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a1cf4b8722569ad1ba6ff89c33fde2d7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k} \to 0" /></span><script type='math/tex'>{g_k} \to 0</script> 又是个什么概念呢？大家可以想像一下二维平面上的寻优过程，一个图像类似于抛物线的函数，当搜索点逐渐向极小值点逼近时，其梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 正是趋于0的。</p>
<p>另外，上面出现了&ldquo;<a href="http://zh.wikipedia.org/zh/%E4%B8%80%E8%87%B4%E8%BF%9E%E7%BB%AD" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">一致连续</span></a>&rdquo;的概念，我不太了解，这里摘录Wiki的部分内容：<br />
<span style="color:#800000;">一致连续性描述定义在一定度量空间上的函数的性质。与连续性刻画函数在局部的性质不同，一致连续刻画的是函数的整体性质。一致连续是比连续更苛刻的条件。一个函数在某度量空间上一致连续，则其在此度量空间上必然连续，但反之未必成立。直观上，一致连续可以理解为，当自变量 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 在足够小的范围内变动时，函数值 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script> 的变动也会被限制在足够小的范围内。</span><br />
<span style="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="background-color:#dda0dd;">②</span>适用于使用不精确line search技术的算法<br />
设最优化算法产生的点序列为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f9ea7f736dbc8e9f8a7c5b31c8270c71.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\{ {x_k}\} ,\{ f({x_k})\} " /></span><script type='math/tex'>\{ {x_k}\} ,\{ f({x_k})\} </script> ，对任意 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ac7f25d9bbac3e3961c83fe88775b02d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0} \in {R^n}" /></span><script type='math/tex'>{x_0} \in {R^n}</script> ，目标函数的梯度 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e84fec1e074026d6fa8e3155482c35c3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g(x)" /></span><script type='math/tex'>g(x)</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c9c10d5a8789190da478ba4da8fa4cdc.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{R^n}" /></span><script type='math/tex'>{R^n}</script> 上<span style="color:#ff0000;">Lipschitz连续</span>，若line search的步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_501cb8ba16bc463c7329e28f3ec226a7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}" /></span><script type='math/tex'>{\alpha _k}</script> 满足<a href="http://www.codelast.com/?p=7320" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Wolfe-Powell准则</span></a>，搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 与 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_be9976a20363f7c49bb370084b76dca7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt=" - {g_k}" /></span><script type='math/tex'> - {g_k}</script> 的夹角满足前面所说的搜索方向条件，那么，必然会发生下面3种情况中的一种：</p>
<div>
	<span style="color:#0000ff;">（1）</span>存在某个有限的 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_081b7d4d8eb6434a34715da9096a7110.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k} = 0" /></span><script type='math/tex'>{g_k} = 0</script> </div>
<div>
	<span style="color:#0000ff;">（2）</span> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a6f8668d7f88cb2891cdebfdc4d05bd8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) \to - \infty " /></span><script type='math/tex'>f({x_k}) \to - \infty </script> </div>
<div>
	<span style="color:#0000ff;">（3）</span><span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a1cf4b8722569ad1ba6ff89c33fde2d7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k} \to 0" /></span><script type='math/tex'>{g_k} \to 0</script> </span><br />
	和上面一样，书上说，（3）是最常见的情况，（1）和（2）很少出现。对（3）的含义的解释，还是请看上面。</p>
<p>	这里又出现了一个新名词：<a href="http://zh.wikipedia.org/zh/%E5%88%A9%E6%99%AE%E5%B8%8C%E8%8C%A8%E9%80%A3%E7%BA%8C" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Lipschitz（利普希茨）连续</span></a>。很抱歉，这个我还是不懂（数学不好的人泪奔）。但是从Wiki的解释，我们仍可以看出个大概来：<br />
	<span style="color:#800000;">符合利普希茨条件的函数一致连续，也连续。直觉上，利普希茨连续函数限制了函数改变的速度。</span></p>
<p>	我感觉，利普希茨连续是比&ldquo;一致连续&rdquo;更强的条件。我从《数学分析（上）第四章》里看到一个结论：由函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在区间 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dd7536794b63bf90eccfd37f9b147d7f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="I" /></span><script type='math/tex'>I</script> 上Lipschitz连续可得： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dd7536794b63bf90eccfd37f9b147d7f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="I" /></span><script type='math/tex'>I</script> 上一致连续。</p>
<p>	有人会说，为什么不精确的一维搜索需要一个&ldquo;更强&rdquo;的连续条件啊？我猜是不是由于它是不精确的，所以满足的条件就需要强一些才能达到收敛？当然，这只是直观猜测，谁来给补充一下吧。<br />
	<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>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bd%bf%e7%94%a8%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2line-search%e7%9a%84%e7%ae%97%e6%b3%95%e7%9a%84%e6%94%b6%e6%95%9b%e6%80%a7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]信赖域(Trust Region)算法是怎么一回事</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bf%a1%e8%b5%96%e5%9f%9ftrust-region%e7%ae%97%e6%b3%95%e6%98%af%e6%80%8e%e4%b9%88%e4%b8%80%e5%9b%9e%e4%ba%8b/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bf%a1%e8%b5%96%e5%9f%9ftrust-region%e7%ae%97%e6%b3%95%e6%98%af%e6%80%8e%e4%b9%88%e4%b8%80%e5%9b%9e%e4%ba%8b/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Mon, 28 Oct 2013 15:09:32 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></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=7488</guid>

					<description><![CDATA[<p>
如果你关心<a href="http://www.codelast.com/?p=7364" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">最优化</span></a>（Optimization），你一定听说过一类叫作&#8220;信赖域（Trust Region）&#8221;的算法。在本文中，我将讲述一下信赖域算法与一维搜索的区别、联系，以及信赖域算法的数学思想，实现过程。<br />
<span id="more-7488"></span><br />
<span style="background-color:#00ff00;">【1】</span>信赖域算法与一维搜索算法的区别、联系<br />
最优化的目标是找到极小值点，在这个过程中，我们需要从一个初始点开始，先确定一个搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> ，在这个方向上作一维搜索（line search），找到此方向上的可接受点（例如，按<a href="http://www.codelast.com/?p=7320" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">两个准则</span></a>的判定）之后，通过一定的策略调整搜索方向，然后继续在新的方向上进行一维搜索，依此类推，直到我们认为目标函数已经收敛到了极小值点。<br />
这种通过不断调整搜索方向，再在搜索方向上进行一维搜索的技术被很多很多算法采用，也取得了很实际的工程意义，但是，我们非要这样做不可吗？有没有另外一种途径，可以不通过&#8220;调整搜索方向&#8594;进行一维搜索&#8221;的步骤，也能求得极小值点？当然有，这就是信赖域算法干的好事。<br />
<span style="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 />
为了说明这两种途径所实现的算法的区别和联系，请允许我做一个可能不太恰当，但是比较形象的比喻：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_trust_region_1.png" style="width: 433px; height: 256px;" /></div>
<p>上图表述的是：如果把求最优解的过程比喻为&#8220;造一个零件&#8221;的过程的话，那么，使用一维搜索的那些算法和信赖域算法就像是两种不同的工艺，它们分别使用不同的技术（一维搜索&#38;信赖域方法）&#8212;&#8212;即两种不同的材料作为达成最终目标的基础。<br />
作为一个了解最优化理论并不多的人，我从我看到过的书得到的感受就是：相比使用一维搜索的那一类算法，貌似信赖域算法们的应用还不够那么多。当然这仅仅是个人感觉，勿扔砖...<br />
<span style="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="background-color:#00ff00;">【2】</span>信赖域算法的基本思想<br />
信赖域和line search同为最优化算法的基础算法，但是，从&#8220;Trust Region&#8221;这个名字你就可以看出，它是没有line search过程的，它是直接在一个region中&#8220;search&#8221;。<br />
在一维搜索中，从 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> <br />
此处 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e81ef0013ba9e0d5eedaa9c5f308662.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}{d_k}" /></span><script type='math/tex'>{\alpha _k}{d_k}</script> 就是在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上的位移，可以记为 <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> <br />
而信赖域算法是根据一定的原则，直接确定位移 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 。如果根据&#8220;某种原则&#8221;确定的位移能使目标函数值充分下降，则扩大信赖域；若不能使目标函数值充分下降，则缩小信赖域。如此迭代下去，直到收敛。<br />
<span style="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%9b%e4%bf%a1%e8%b5%96%e5%9f%9ftrust-region%e7%ae%97%e6%b3%95%e6%98%af%e6%80%8e%e4%b9%88%e4%b8%80%e5%9b%9e%e4%ba%8b/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
如果你关心<a href="http://www.codelast.com/?p=7364" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">最优化</span></a>（Optimization），你一定听说过一类叫作&ldquo;信赖域（Trust Region）&rdquo;的算法。在本文中，我将讲述一下信赖域算法与一维搜索的区别、联系，以及信赖域算法的数学思想，实现过程。<br />
<span id="more-7488"></span><br />
<span style="background-color:#00ff00;">【1】</span>信赖域算法与一维搜索算法的区别、联系<br />
最优化的目标是找到极小值点，在这个过程中，我们需要从一个初始点开始，先确定一个搜索方向 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8277e0910d750195b448797616e091ad.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="d" /></span><script type='math/tex'>d</script> ，在这个方向上作一维搜索（line search），找到此方向上的可接受点（例如，按<a href="http://www.codelast.com/?p=7320" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">两个准则</span></a>的判定）之后，通过一定的策略调整搜索方向，然后继续在新的方向上进行一维搜索，依此类推，直到我们认为目标函数已经收敛到了极小值点。<br />
这种通过不断调整搜索方向，再在搜索方向上进行一维搜索的技术被很多很多算法采用，也取得了很实际的工程意义，但是，我们非要这样做不可吗？有没有另外一种途径，可以不通过&ldquo;调整搜索方向&rarr;进行一维搜索&rdquo;的步骤，也能求得极小值点？当然有，这就是信赖域算法干的好事。<br />
<span style="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 />
为了说明这两种途径所实现的算法的区别和联系，请允许我做一个可能不太恰当，但是比较形象的比喻：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_trust_region_1.png" style="width: 433px; height: 256px;" /></div>
<p>上图表述的是：如果把求最优解的过程比喻为&ldquo;造一个零件&rdquo;的过程的话，那么，使用一维搜索的那些算法和信赖域算法就像是两种不同的工艺，它们分别使用不同的技术（一维搜索&amp;信赖域方法）&mdash;&mdash;即两种不同的材料作为达成最终目标的基础。<br />
作为一个了解最优化理论并不多的人，我从我看到过的书得到的感受就是：相比使用一维搜索的那一类算法，貌似信赖域算法们的应用还不够那么多。当然这仅仅是个人感觉，勿扔砖...<br />
<span style="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="background-color:#00ff00;">【2】</span>信赖域算法的基本思想<br />
信赖域和line search同为最优化算法的基础算法，但是，从&ldquo;Trust Region&rdquo;这个名字你就可以看出，它是没有line search过程的，它是直接在一个region中&ldquo;search&rdquo;。<br />
在一维搜索中，从 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dfce03f6c63c6112ec0a9e19d3390177.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k} + {\alpha _k}{d_k}" /></span><script type='math/tex'>{x_k} + {\alpha _k}{d_k}</script> <br />
此处 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1e81ef0013ba9e0d5eedaa9c5f308662.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}{d_k}" /></span><script type='math/tex'>{\alpha _k}{d_k}</script> 就是在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 方向上的位移，可以记为 <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> <br />
而信赖域算法是根据一定的原则，直接确定位移 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 。如果根据&ldquo;某种原则&rdquo;确定的位移能使目标函数值充分下降，则扩大信赖域；若不能使目标函数值充分下降，则缩小信赖域。如此迭代下去，直到收敛。<br />
<span style="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 />
关于这种寻优的方法，我这里又有一个比喻，希望能帮助你理解：</p>
<div>
	要从上海火车站去人民广场，有两种方法：<br />
	<span style="color:#b22222;">①</span>可以先定一个方向，比如先向西走，走着走着发现方向有点不对（人民广场应该是时尚地标啊，怎么越走感觉越郊区了呢），就调整一下方向，变成向东南方向走，诸如此类。</div>
<div>
	<span style="color:#b22222;">②</span>用信赖域算法，就比如，我先划一个圈，然后在这个圈里面找离人民广场可能最接近的点，如果我的圈划得太大了，一下子就划到了莘庄（不熟悉上海的同学可以查一下地图），我一步就走到了上海南站，那还得了，马上给我回来，把圈缩小到两个地铁站的距离之内，然后再在里面找离人民广场最近的点。<br />
	<span style="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="background-color:#00ff00;">【3】</span>信赖域算法的数学模型<br />
	前面说了，根据一定的原则，可以直接确定位移，那么，这个原则是什么呢？<br />
	答：利用二次模型模拟目标函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</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 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_dc1e62cd6239629cba7578cca64d1f4f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x + s" /></span><script type='math/tex'>x + s</script> ，从而可以计算出目标函数的下降量（下降是最优化的目标），再根据下降量来决定扩大信赖域或缩小信赖域。<br />
	那么，我该如何判定要扩大还是缩小信赖域呢？为了说明这个问题，必须先描述信赖域算法的数学模型：<br />
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_trust_region_2.png" style="width: 350px; height: 111px;" /><br />
	<span style="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 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_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 为梯度， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> 为Hesse矩阵，袁亚湘的书上说，如果Hesse矩阵不好计算，可以利用&ldquo;有限差分&rdquo;来近似 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> （不好意思我不懂），或者用<a href="http://www.codelast.com/?p=2780" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">拟牛顿方法</span></a>来构造Hesse矩阵的近似矩阵。<br />
	第二个式子中的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7897c8db80031ff84df5a87ff3761308.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_k}" /></span><script type='math/tex'>{h_k}</script> 是第 <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> 次迭代的信赖域上界（或称为信赖域半径），因此第二个式子表示的就是位移要在信赖域上界范围内。此外，第二个式子中的范数是没有指定是什么范数的，例如，是2-范数还是&infin;-范数之类的（在实际中都有算法用这些范数）。<br />
	<span style="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 />
	现在又回到了上面的问题：我该如何判定要扩大还是缩小信赖域呢？通过衡量二次模型与目标函数的近似程度，可以作出判定：<br />
	第 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cd697df2af53f8334f2b9ea8bb728cd3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\Delta {f_k} = {f_k} - f({x_k} + {s_k})" /></span><script type='math/tex'>\Delta {f_k} = {f_k} - f({x_k} + {s_k})</script> <br />
	第 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b4ffbd104433208458c9e50070023c1c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\Delta {m_k} = {f_k} - m({s_k})" /></span><script type='math/tex'>\Delta {m_k} = {f_k} - m({s_k})</script> <br />
	定义比值： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e9259fc5cd0adbf969419b99c592ab80.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} = \frac{{\Delta {f_k}}}{{\Delta {m_k}}}" /></span><script type='math/tex'>{r_k} = \frac{{\Delta {f_k}}}{{\Delta {m_k}}}</script> <br />
	这个比值可以用于衡量二次模型与目标函数的近似程度，显然 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4b43b0aee35624cd95b910189b3dc231.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="r" /></span><script type='math/tex'>r</script> 值越接近1越好。</p>
<p>	由此，我们就可以给出一个简单的信赖域算法了。<br />
	<span style="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="background-color:#00ff00;">【4】</span>信赖域算法的步骤<br />
	一个考虑周全的信赖域算法可能非常麻烦，为了说明其步骤，这里只说明基本的迭代步骤：</div>
<ul>
<li>
		从初始点 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_dd8c818172ac708f9bb6dca661127a81.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_0} = \left\| {{g_0}} \right\|" /></span><script type='math/tex'>{h_0} = \left\| {{g_0}} \right\|</script> 开始迭代</li>
<li>
		到第 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1cd5597a080292208723039cfd7bfd41.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}" /></span><script type='math/tex'>{g_k}</script> 和 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ac8fda2ed3a75d5af87815e87a3ebc7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{G_k}" /></span><script type='math/tex'>{G_k}</script> </li>
<li>
		解信赖域模型，求出位移 <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 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>
		若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4545c6fd3f587a190de62f5726c19e7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} \le 0.25" /></span><script type='math/tex'>{r_k} \le 0.25</script> ，说明步子迈得太大了，应缩小信赖域半径，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3122146e97379c67d68fbc1fd4767fac.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_{k + 1}} = \frac{{\left\| {{s_k}} \right\|}}{4}" /></span><script type='math/tex'>{h_{k + 1}} = \frac{{\left\| {{s_k}} \right\|}}{4}</script> </li>
<li>
		若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e60e3f12948c020dd8caa32bb9465855.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} \ge 0.75" /></span><script type='math/tex'>{r_k} \ge 0.75</script> 且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6a119a8b314804d0f5525b0565bb5905.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\left\| {{s_k}} \right\| = {h_k}" /></span><script type='math/tex'>\left\| {{s_k}} \right\| = {h_k}</script> ，说明这一步已经迈到了信赖域半径的边缘，并且步子有点小，可以尝试扩大信赖域半径，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_98a4587baebd5120b017bdeae7f692d1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_{k + 1}} = 2{h_k}" /></span><script type='math/tex'>{h_{k + 1}} = 2{h_k}</script> </li>
<li>
		若 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_63c50442db03e5c67898fd58fbf482b0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0.25 < {r_k} < 0.75" /></span><script type='math/tex'>0.25 < {r_k} < 0.75</script> ，说明这一步迈出去之后，处于&ldquo;可信赖&rdquo;和&ldquo;不可信赖&rdquo;之间，可以维持当前的信赖域半径，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_cb2e219c1b08ff28ea07e76ba0fb2dbc.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{h_{k + 1}} = {h_k}" /></span><script type='math/tex'>{h_{k + 1}} = {h_k}</script> </li>
<li>
		若 <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> ，说明函数值是向着上升而非下降的趋势变化了（与最优化的目标相反），这说明这一步迈得错得&ldquo;离谱&rdquo;了，这时不应该走到下一点，而应&ldquo;原地踏步&rdquo;，即 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4545c6fd3f587a190de62f5726c19e7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{r_k} \le 0.25" /></span><script type='math/tex'>{r_k} \le 0.25</script> 的情况一样缩小信赖域。反之，在 <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 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>
</ul>
<div>
	<span style="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="background-color:#00ff00;">【5】</span>最重要的一种信赖域算法：<span style="color:#0000ff;">Levenberg-Marquardt算法</span><br />
	当信赖域模型中的范数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aedba953352e84a8a4e7db5979dac82b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\left\| s \right\| \le {h_k}" /></span><script type='math/tex'>\left\| s \right\| \le {h_k}</script> 取2-范数时（即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d1fe74ea11c0c4dbdf236f16ad7e4f2d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\left\| s \right\|_2} \le {h_k}" /></span><script type='math/tex'>{\left\| s \right\|_2} \le {h_k}</script> ），就得到了Levenberg-Marquardt算法（简称<span style="color:#0000ff;">LM算法</span>）的数学模型：<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 />
	具体请看<a href="http://www.codelast.com/?p=29" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这里</span></a>。<br />
	<span style="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="background-color:#00ff00;">【6】</span>信赖域算法的收敛性<br />
	信赖域算法具有整体收敛性。这个证明我没看（太长了），此处略。<br />
	<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>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%bf%a1%e8%b5%96%e5%9f%9ftrust-region%e7%ae%97%e6%b3%95%e6%98%af%e6%80%8e%e4%b9%88%e4%b8%80%e5%9b%9e%e4%ba%8b/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 27 Oct 2013 14:01:02 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Armijo-Goldstein准则]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[Wolfe conditions]]></category>
		<category><![CDATA[Wolfe-Powell准则]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7320</guid>

					<description><![CDATA[<p>
line search（一维搜索，或线搜索）是最优化（Optimization）算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。<br />
在本文中，我想用&#8220;人话&#8221;解释一下不精确的一维搜索的两大准则：Armijo-Goldstein准则 ＆ Wolfe-Powell准则。<br />
之所以这样说，是因为我读到的所有最优化的书或资料，从来没有一个可以用初学者都能理解的方式来解释这两个准则，它们要么是长篇大论、把一堆数学公式丢给你去琢磨；要么是简短省略、直接略过了解释的步骤就一句话跨越千山万水得出了结论。<br />
每当看到这些书的时候，我脑子里就一个反应：你们就不能写人话吗？<br />
<span id="more-7320"></span><br />
我下面就尝试用通俗的语言来描述一下这两个准则。</p>
<div>
	<span style="background-color:#00ff00;">【1】</span>为什么要遵循这些准则</div>
<div>
	由于采用了不精确的一维搜索，所以，为了能让算法收敛（即：求得极小值），人们逐渐发现、证明了一些规律，当你遵循这些规律的时候，算法就很有可能收敛。因此，为了达到让算法收敛的目的，我们就要遵循这些准则。如果你不愿意遵循这些已经公认有效的准则，而是要按自己的准则来设计算法，那么恭喜你，如果你能证明你的做法是有效的，未来若干年后，书本里可能也会出现你的名字。</div>
<p><span style="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>
<div>
	<span style="background-color:#00ff00;">【2】</span>Armijo-Goldstein准则</div>
<div>
	此准则是在196X年的时候由Armijo和Goldstein提出的，当然我没有具体去搜过这俩人是谁。在有的资料里，你可能会看到&#8220;Armijo rule&#8221;（Armijo准则）的说法，可能是同一回事，不过，任何一个对此作出重要贡献的人都是不可抹杀的，不是么？</div>
<p><span style="color:#0000ff;">Armijo-Goldstein准则的核心思想有两个：①目标函数值应该有足够的下降；②一维搜索的步长&#945;不应该太小。</span></p>
<div>
	这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值，因此，让目标函数函数值&#8220;下降&#8221;是我们努力的方向，所以①正是想要保证这一点。</div>
<div>
	同理，②也类似：如果一维搜索的步长&#945;太小了，那么我们的搜索类似于在原地打转，可能也是在浪费时间和精力。</div>
<p><span style="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 />
有了这两个指导思想，我们来看看Armijo-Goldstein准则的数学表达式：<br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_1.png" style="width: 460px; height: 45px;" /></a><br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_2.png" style="width: 510px; height: 42px;" /></a></p>
<p>其中，<span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5087877fc30cbeb7449a630043199764.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0 < \rho < \frac{1}{2}" /></span><script type='math/tex'>0 < \rho < \frac{1}{2}</script> </span><br />
<span style="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="background-color:#dda0dd;">(1)</span>为什么要规定 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 这个条件？其实可以证明：如果没有这个条件的话，将影响算法的<span style="color:#0000ff;">超线性收敛</span>性（<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">定义看这个链接，第4条</span></a>）。在这个速度至关重要的时代，没有超线性收敛怎么活啊！(开个玩笑)<br />
具体的证明过程，大家可以参考袁亚湘写的《最优化理论与方法》一书，我没有仔细看，我觉得对初学者，不用去管它。<br />
<span style="background-color:#dda0dd;">(2)</span>第1个不等式的左边式子的泰勒展开式为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3182322817f538586aa55cc34d65e082.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})</script> <br />
去掉高阶无穷小，剩下的部分为： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9db59ffe507886c32015a962bbaf8944.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}{g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}{g_k}^T{d_k}</script> <br />
而第一个不等式右边与之只差一个系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f7f177957cf064a93e9811df8fe65ed1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho " /></span><script type='math/tex'>\rho </script> <br />
我们已知了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （这是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为下降方向的充要条件），并且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> ，因此，1式右边仍然是一个比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 小的数，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0aff944a2606a5a9e9c7ef88994429d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})</script> <br />
也就是说函数值是下降的（下降是最优化的目标）。<br />
<span style="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%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
line search（一维搜索，或线搜索）是最优化（Optimization）算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。<br />
在本文中，我想用&ldquo;人话&rdquo;解释一下不精确的一维搜索的两大准则：Armijo-Goldstein准则 ＆ Wolfe-Powell准则。<br />
之所以这样说，是因为我读到的所有最优化的书或资料，从来没有一个可以用初学者都能理解的方式来解释这两个准则，它们要么是长篇大论、把一堆数学公式丢给你去琢磨；要么是简短省略、直接略过了解释的步骤就一句话跨越千山万水得出了结论。<br />
每当看到这些书的时候，我脑子里就一个反应：你们就不能写人话吗？<br />
<span id="more-7320"></span><br />
我下面就尝试用通俗的语言来描述一下这两个准则。</p>
<div>
	<span style="background-color:#00ff00;">【1】</span>为什么要遵循这些准则</div>
<div>
	由于采用了不精确的一维搜索，所以，为了能让算法收敛（即：求得极小值），人们逐渐发现、证明了一些规律，当你遵循这些规律的时候，算法就很有可能收敛。因此，为了达到让算法收敛的目的，我们就要遵循这些准则。如果你不愿意遵循这些已经公认有效的准则，而是要按自己的准则来设计算法，那么恭喜你，如果你能证明你的做法是有效的，未来若干年后，书本里可能也会出现你的名字。</div>
<p><span style="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>
<div>
	<span style="background-color:#00ff00;">【2】</span>Armijo-Goldstein准则</div>
<div>
	此准则是在196X年的时候由Armijo和Goldstein提出的，当然我没有具体去搜过这俩人是谁。在有的资料里，你可能会看到&ldquo;Armijo rule&rdquo;（Armijo准则）的说法，可能是同一回事，不过，任何一个对此作出重要贡献的人都是不可抹杀的，不是么？</div>
<p><span style="color:#0000ff;">Armijo-Goldstein准则的核心思想有两个：①目标函数值应该有足够的下降；②一维搜索的步长&alpha;不应该太小。</span></p>
<div>
	这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值，因此，让目标函数函数值&ldquo;下降&rdquo;是我们努力的方向，所以①正是想要保证这一点。</div>
<div>
	同理，②也类似：如果一维搜索的步长&alpha;太小了，那么我们的搜索类似于在原地打转，可能也是在浪费时间和精力。</div>
<p><span style="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 />
有了这两个指导思想，我们来看看Armijo-Goldstein准则的数学表达式：<br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_1.png" style="width: 460px; height: 45px;" /></a><br />
<a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/Armijo-Goldstein_2.png" style="width: 510px; height: 42px;" /></a></p>
<p>其中，<span style="color:#ff0000;"> <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5087877fc30cbeb7449a630043199764.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="0 < \rho < \frac{1}{2}" /></span><script type='math/tex'>0 < \rho < \frac{1}{2}</script> </span><br />
<span style="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="background-color:#dda0dd;">(1)</span>为什么要规定 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 这个条件？其实可以证明：如果没有这个条件的话，将影响算法的<span style="color:#0000ff;">超线性收敛</span>性（<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">定义看这个链接，第4条</span></a>）。在这个速度至关重要的时代，没有超线性收敛怎么活啊！(开个玩笑)<br />
具体的证明过程，大家可以参考袁亚湘写的《最优化理论与方法》一书，我没有仔细看，我觉得对初学者，不用去管它。<br />
<span style="background-color:#dda0dd;">(2)</span>第1个不等式的左边式子的泰勒展开式为：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3182322817f538586aa55cc34d65e082.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})" /></span><script type='math/tex'>f({x_k} + {\alpha _k}{d_k}) = f({x_k}) + {\alpha _k}{g_k}^T{d_k} + o({\alpha _k})</script> <br />
去掉高阶无穷小，剩下的部分为： <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9db59ffe507886c32015a962bbaf8944.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}{g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}{g_k}^T{d_k}</script> <br />
而第一个不等式右边与之只差一个系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f7f177957cf064a93e9811df8fe65ed1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho " /></span><script type='math/tex'>\rho </script> <br />
我们已知了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （这是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 为下降方向的充要条件），并且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> ，因此，1式右边仍然是一个比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 小的数，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0aff944a2606a5a9e9c7ef88994429d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k} < f({x_k})</script> <br />
也就是说函数值是下降的（下降是最优化的目标）。<br />
<span style="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="background-color:#dda0dd;">(3)</span>由于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_7630a6c9cd1940bc102b357691038a4e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\rho \in (0,\frac{1}{2})" /></span><script type='math/tex'>\rho \in (0,\frac{1}{2})</script> 且 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> （ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 是一个下降方向的充要条件），故第2个式子右边比第1个式子右边要小，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c8153267cd0d03c8afa2d9fe51d6546c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha _k}(1 - \rho ){g_k}^T{d_k} < {\alpha _k}\rho {g_k}^T{d_k} < 0" /></span><script type='math/tex'>{\alpha _k}(1 - \rho ){g_k}^T{d_k} < {\alpha _k}\rho {g_k}^T{d_k} < 0</script> <br />
如果步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 太小的话，会导致这个不等式接近于不成立的边缘。因此，式2就保证了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 不能太小。<br />
<span style="background-color:#dda0dd;">(4)</span>我还要把很多书中都用来描述Armijo-Goldstein准则的一幅图搬出来说明一下（亲自手绘）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_1.jpg" style="width: 550px; height: 318px;" /></div>
<p><span style="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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> ，纵坐标是 <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_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 均为常量、 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量变化的情况下，目标函数值随之变化的情况。<br />
之所以说 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 均为常量，是因为在一维搜索中，在某一个确定的点 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_66eea6bfeea7fcb327d435f627a2390b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{d_k}" /></span><script type='math/tex'>{d_k}</script> 确定后，我们只需要找到一个合适的步长 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 就可以了。<br />
当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为常量， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量时， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9c1a98b7b1878eabcf4d855982a2c81a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x + \alpha d)" /></span><script type='math/tex'>f(x + \alpha d)</script> 可能是非线性函数（例如目标函数为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_990d8846cdb8bfba65b16bf6252a7dd6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y = {x^2}" /></span><script type='math/tex'>y = {x^2}</script> 时）。因此图中是一条曲线。<br />
右上角的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_19d48ed66ebabc7b91d1cb1c97d28ad3.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k} + \alpha {d_k})" /></span><script type='math/tex'>f({x_k} + \alpha {d_k})</script> 并不是表示一个特定点的值，而是表示这条曲线是以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bccfc7022dfb945174d9bcebad2297bb.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha " /></span><script type='math/tex'>\alpha </script> 为自变量、 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6df14963c8774de478b239e157bd1c14.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_k},{d_k}" /></span><script type='math/tex'>{x_k},{d_k}</script> 为常量的函数图形。<br />
当 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4c417553b680cf203765de254be0350.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha = 0" /></span><script type='math/tex'>\alpha = 0</script> 时，函数值为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> ，如图中左上方所示。水平的那条虚线是函数值为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 的基线，用于与其他函数值对比。<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_45b7e561542aab7e2c705136b385555a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}</script> 那条线在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_3378621fdb4518ce7e503d48af416e07.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k})" /></span><script type='math/tex'>f({x_k})</script> 下方（前面已经分析过了，因为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_426f053da911fa0c66d34d53cd38934f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{g_k}^T{d_k} < 0" /></span><script type='math/tex'>{g_k}^T{d_k} < 0</script> ）， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_d40b12c499976a6d7b94c6dfd79a56a0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}(1 - \rho ){g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}(1 - \rho ){g_k}^T{d_k}</script> 又在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_45b7e561542aab7e2c705136b385555a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}" /></span><script type='math/tex'>f({x_k}) + {\alpha _k}\rho {g_k}^T{d_k}</script> 的下方（前面也已经分析过了），所以Armijo-Goldstein准则可能会把极小值点（可接受的区间）判断在区间bc内。显而易见，区间bc是有可能把极小值排除在外的（极小值在区间ed内）。<br />
所以，为了解决这个问题，Wolfe-Powell准则应运而生。<br />
<span style="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="background-color:#00ff00;">【3】</span>Wolfe-Powell准则<br />
在某些书中，你会看到&ldquo;<a href="http://en.wikipedia.org/wiki/Wolfe_conditions" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Wolfe conditions</span></a>&rdquo;的说法，应该和Wolfe-Powell准则是一回事&mdash;&mdash;可怜的Powell大神又被无情地忽略了...<br />
Wolfe-Powell准则也有两个数学表达式，其中，第一个表达式与Armijo-Goldstein准则的第1个式子相同，第二个表达式为：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_2.jpg" style="width: 550px; height: 39px;" /><br />
这个式子已经不是关于函数值的了，而是关于梯度的。<br />
此式的几何解释为：<span style="color:#0000ff;">可接受点处的切线斜率&ge;初始斜率的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9d43cb8bbcb702e9d5943de477f099e2.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma " /></span><script type='math/tex'>\sigma </script> 倍</span>。<br />
上面的图已经标出了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_1fb3bf723ae9a9c61eef13e70e1c5b73.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma g_k^T{d_k}" /></span><script type='math/tex'>\sigma g_k^T{d_k}</script> 那条线（即 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线），而初始点（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4c417553b680cf203765de254be0350.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\alpha = 0" /></span><script type='math/tex'>\alpha = 0</script> 的点）处的切线是比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线要&ldquo;斜&rdquo;的，由于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_eb0004237e8dc9db81ca87fd2cc7f6e9.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\sigma \in (\rho ,1)" /></span><script type='math/tex'>\sigma \in (\rho ,1)</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点处的切线变得&ldquo;不那么斜&rdquo;了&mdash;&mdash;不知道这种极为通俗而不够严谨的说法，是否有助于你理解。<br />
这样做的结果就是，我们将极小值包含在了可接受的区间内（ <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1671797c52e15f763380b45e841ec32.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="e" /></span><script type='math/tex'>e</script> 点右边的区间）。<br />
<span style="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 />
Wolfe-Powell准则到这里还没有结束！在某些书中，你会看到用另一个所谓的&ldquo;更强的条件&rdquo;来代替(3)式，即：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_3.jpg" style="width: 470px; height: 48px;" /><br />
这个式子和(3)式相比，就是左边加了一个绝对值符号，右边换了一下正负号（因为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead119a63ddef55ab91efbf5514e3609.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="g_k^T{d_k} < 0" /></span><script type='math/tex'>g_k^T{d_k} < 0</script> ，所以 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ec6871914afe07c0858dc674aafe2ccf.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="- \sigma g_k^T{d_k} > 0" /></span><script type='math/tex'>- \sigma g_k^T{d_k} > 0</script> ）。<br />
这样做的结果就是：可接受的区间被限制在了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_af2fdeb93b85e5b0a49cb557cf999ebc.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[b,d]" /></span><script type='math/tex'>[b,d]</script> 内，如图：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_two_rules_in_line_search_4.jpg" style="width: 317px; height: 211px;" /></div>
<p>图中红线即为极小值被&ldquo;夹击&rdquo;的生动演示。<br />
<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%9b%e7%94%a8%e4%ba%ba%e8%af%9d%e8%a7%a3%e9%87%8a%e4%b8%8d%e7%b2%be%e7%a1%ae%e7%ba%bf%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84armijo-goldstein%e5%87%86%e5%88%99%e5%8f%8awo/feed/</wfw:commentRss>
			<slash:comments>26</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]漫谈line search中的Fibonacci搜索与黄金比例搜索</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%bc%ab%e8%b0%88line-search%e4%b8%ad%e7%9a%84fibonacci%e6%90%9c%e7%b4%a2%e4%b8%8e%e9%bb%84%e9%87%91%e6%af%94%e4%be%8b%e6%90%9c%e7%b4%a2/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%bc%ab%e8%b0%88line-search%e4%b8%ad%e7%9a%84fibonacci%e6%90%9c%e7%b4%a2%e4%b8%8e%e9%bb%84%e9%87%91%e6%af%94%e4%be%8b%e6%90%9c%e7%b4%a2/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 27 Oct 2013 04:37:21 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Fibonacci search]]></category>
		<category><![CDATA[Fibonacci搜索算法]]></category>
		<category><![CDATA[golden section search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7446</guid>

					<description><![CDATA[<p>
在一维搜索（line search）中，Fibonacci搜索与黄金比例搜索是一对&#8220;亲兄弟&#8221;，因为它们都是用分割区间的方法来求极小值，所以过程是相似的。本文就随意聊一下它们的区别与联系。<br />
<span id="more-7446"></span><br />
从名字上看，Fibonacci搜索算法当然与<a href="http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Fibonacci数列</span></a>有关。<br />
Fibonacci数列用如下式子表达：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4fbd1c6f75756dac6bdfab7c26b95160.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{F_0} = 0,\;{F_1} = 1,\;{F_n} = {F_{n - 1}} + {F_{n - 2}}" /></span><script type='math/tex'>{F_0} = 0,\;{F_1} = 1,\;{F_n} = {F_{n - 1}} + {F_{n - 2}}</script> <br />
即：第1个数为0，第2个数为1，后面的每个数都是前两个数之和，例如 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, &#8230;<br />
<span style="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 />
Fibonacci搜索算法就是利用了该数列进行区间的分割。与<a href="http://www.codelast.com/?p=434" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">黄金比例搜索算法</span></a>每次分割区间时使用固定的比例（0.618）不同，Fibonacci搜索算法的区间缩短率是不固定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e891bec41ecca95e215c22e093b647f1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\frac{{{F_{i - 1}}}}{{{F_i}}}" /></span><script type='math/tex'>\frac{{{F_{i - 1}}}}{{{F_i}}}</script> 。</p>
<p>Fibonacci搜索算法要先确定搜索点的个数，并且在用分割方法求一维极小化问题时，Fibonacci是最优的策略（袁亚湘的书上说这个是可以证明的，但我没看怎么证明）。但跟Golden Section Search相比，由于Golden Section Search简单，所以更常用。并且，在实际中，为了能达到更快的收敛速度，通常会让Golden Section Search配合使用逆抛物内插或其他超线性收敛技术（例如复杂的Brent算法，就是结合了黄金分割+逆抛物内插的可靠line search算法），所以，也不是非用Fibonacci不可。<br />
<span style="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%9b%e6%bc%ab%e8%b0%88line-search%e4%b8%ad%e7%9a%84fibonacci%e6%90%9c%e7%b4%a2%e4%b8%8e%e9%bb%84%e9%87%91%e6%af%94%e4%be%8b%e6%90%9c%e7%b4%a2/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
在一维搜索（line search）中，Fibonacci搜索与黄金比例搜索是一对&ldquo;亲兄弟&rdquo;，因为它们都是用分割区间的方法来求极小值，所以过程是相似的。本文就随意聊一下它们的区别与联系。<br />
<span id="more-7446"></span><br />
从名字上看，Fibonacci搜索算法当然与<a href="http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">Fibonacci数列</span></a>有关。<br />
Fibonacci数列用如下式子表达：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4fbd1c6f75756dac6bdfab7c26b95160.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{F_0} = 0,\;{F_1} = 1,\;{F_n} = {F_{n - 1}} + {F_{n - 2}}" /></span><script type='math/tex'>{F_0} = 0,\;{F_1} = 1,\;{F_n} = {F_{n - 1}} + {F_{n - 2}}</script> <br />
即：第1个数为0，第2个数为1，后面的每个数都是前两个数之和，例如 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, &hellip;<br />
<span style="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 />
Fibonacci搜索算法就是利用了该数列进行区间的分割。与<a href="http://www.codelast.com/?p=434" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">黄金比例搜索算法</span></a>每次分割区间时使用固定的比例（0.618）不同，Fibonacci搜索算法的区间缩短率是不固定的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e891bec41ecca95e215c22e093b647f1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\frac{{{F_{i - 1}}}}{{{F_i}}}" /></span><script type='math/tex'>\frac{{{F_{i - 1}}}}{{{F_i}}}</script> 。</p>
<p>Fibonacci搜索算法要先确定搜索点的个数，并且在用分割方法求一维极小化问题时，Fibonacci是最优的策略（袁亚湘的书上说这个是可以证明的，但我没看怎么证明）。但跟Golden Section Search相比，由于Golden Section Search简单，所以更常用。并且，在实际中，为了能达到更快的收敛速度，通常会让Golden Section Search配合使用逆抛物内插或其他超线性收敛技术（例如复杂的Brent算法，就是结合了黄金分割+逆抛物内插的可靠line search算法），所以，也不是非用Fibonacci不可。<br />
<span style="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 />
最后，Fibonacci搜索算法是线性收敛的，它的极限形式正是Golden Section Search，即：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ee14366e08b63d4c51639b702ac92169.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="\mathop {\lim }\limits_{n \to \infty } \frac{{{F_{n - 1}}}}{{{F_n}}} = \frac{{\sqrt 5 - 1}}{2} \approx 0.618" /></span><script type='math/tex'>\mathop {\lim }\limits_{n \to \infty } \frac{{{F_{n - 1}}}}{{{F_n}}} = \frac{{\sqrt 5 - 1}}{2} \approx 0.618</script> </p>
<p><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%9b%e6%bc%ab%e8%b0%88line-search%e4%b8%ad%e7%9a%84fibonacci%e6%90%9c%e7%b4%a2%e4%b8%8e%e9%bb%84%e9%87%91%e6%af%94%e4%be%8b%e6%90%9c%e7%b4%a2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]一维搜索中的划界(Bracket)算法</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 26 Oct 2013 15:30:03 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[bracket]]></category>
		<category><![CDATA[line search]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[一维搜索]]></category>
		<category><![CDATA[划界]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7360</guid>

					<description><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&#8212;&#8212;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&#8220;单峰&#8221;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="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 />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="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%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
很多最优化算法需要用到一维搜索（line search）子算法，而在众多的一维搜索算法中，大多数都要求函数被限制在一个<span style="color:#0000ff;">单峰区间</span>内，也就是说，在进行一维搜索的区间内，函数是一个<span style="color:#0000ff;">单峰函数</span>。尽管有一些改进的一维搜索算法（例如 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c4be180680b4bf5c21034b5f7bf163d8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="H\ddot opfinger" /></span><script type='math/tex'>H\ddot opfinger</script> 建议的一种改进过的黄金搜索算法）可以处理函数非单峰的情况，但是，在没有确定函数在一个区间内是单峰的之前，即使在搜索过程中，函数值持续减小，我们也不能说极小值是一定存在的，因此，找出一个区间，在此区间之内使函数是单峰的，这个过程是必需的（我更倾向于接受这种观点）。这个过程就叫作<span style="color:#ff0000;">划界</span>（<span style="color:#0000ff;">Bracket</span>）。Bracket这个单词是括号的意思，很形象&mdash;&mdash;用括号包住一个范围，就是划界。在某些书中，划界算法也被称为<span style="color:#0000ff;">进退法</span>。<br />
<span id="more-7360"></span><br />
<span style="background-color:#00ff00;">【1】</span>什么是单峰区间？什么是单峰函数？<br />
从字面上理解，&ldquo;单峰&rdquo;即函数只有一个峰，如下图所示（在区间[-8,8]内是单峰的）：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_1.png" style="width: 309px; height: 153px;" /></div>
<p><span style="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 />
而下面的这个函数，在区间[2,14]内就不是单峰函数了：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_2.png" style="width: 462px; height: 129px;" /></div>
<p>现在，我们再用数学的话来定义一下单峰区间和单峰函数：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 为 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e1e1d3d40573127e9ee0480caf1283d6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="R" /></span><script type='math/tex'>R</script> 的子集，存在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e48ac27bb5429028836b36729e3bfc66.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{\alpha ^*} \in [a,b]" /></span><script type='math/tex'>{\alpha ^*} \in [a,b]</script> ，使得 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_bfc3057d694a9b06bb46943bf39a0e7b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,{\alpha ^*}]" /></span><script type='math/tex'>[a,{\alpha ^*}]</script> 上严格单调减，在 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_ead4fb17a0c4148758ef1619b8d9f56a.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[{\alpha ^*},b]" /></span><script type='math/tex'>[{\alpha ^*},b]</script> 上严格单调增，则称 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 的单峰区间，  <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8f3c9b4ae0bcdfe45aeb49f027941ddd.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(\alpha )" /></span><script type='math/tex'>f(\alpha )</script> 是 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 上的单峰函数。<br />
<span style="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="background-color: rgb(0, 255, 0);">【2】</span>&ldquo;划界&rdquo;是如何实现的<br />
方法是：<span style="color:#0000ff;">寻找使函数值达到&ldquo;高&rarr;低&rarr;高&rdquo;的3个点</span>。</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_3.png" style="width: 300px; height: 153px;" /></div>
<p>如上图所示，当我们找到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_a44c56c8177e32d3613988f4dba7962e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b,c" /></span><script type='math/tex'>a,b,c</script> 这样3个点的时候，它们就能确定一个单峰区间了。<br />
一定有人会有疑问说：这不一定，万一 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_74aefa13d6ab8e4bfbd241583749dfe8.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b,c" /></span><script type='math/tex'>b,c</script> 之间还有一个峰怎么办？确实，这里举的例子并不是一个完善的例子，在一个实用的划界程序中，它所做的考虑会非常多，各种意外情况都要处理，此处只是为了说明&ldquo;划界&rdquo;是怎么一回事，以及一个最简单的划界程序是怎么做的。<br />
<span style="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 />
与各种教科书上仅有令人讨厌的公式说明不同（从不考虑读者的感受），我把几个简单的划界步骤画成了几幅图，我觉得有小学文凭已经足够理解了（一图胜千言）：<br />
<span style="background-color:#dda0dd;">①</span>：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_4.png" style="width: 400px; height: 255px;" /></div>
<p><span style="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 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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> ，图中的 <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> 表示迭代的次数。<br />
则第一点挪动到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> ，计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c0260b46fc02a40358b1ce8d6a091d49.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_1}) < f({x_0})" /></span><script type='math/tex'>f({x_1}) < f({x_0})</script> ，很好，&ldquo;高&rarr;低&rarr;高&rdquo;的3点中，我们已经有了两点。<br />
然后下一点我们挪动到 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_418ef5b163ae9806a8083c9a9d2d1b60.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h,\;t > 1" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h,\;t > 1</script> ，这里用加倍系数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_e358efa489f58062f10dd7316b65649e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="t" /></span><script type='math/tex'>t</script> 来乘以步长是为了加速搜索的过程。再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_6eddd6e29b72e5f6800d8ff6ce721536.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_2}) > f({x_1})" /></span><script type='math/tex'>f({x_2}) > f({x_1})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> <br />
<span style="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="background-color:#dda0dd;">②</span>：<br />
如果运气没那么好，例如：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_5.png" style="width: 400px; height: 258px;" /></div>
<p><span style="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 />
即：<br />
和①一样，搜索也经历了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2a028522a51821f6a7a0d441ef3385f5.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_0},{x_1},{x_2}" /></span><script type='math/tex'>{x_0},{x_1},{x_2}</script> 这几个点，与①不同的是，到了 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_c1015f14836165504ccbb2a42b2c150b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2}" /></span><script type='math/tex'>{x_2}</script> 点之后，我们发现其函数值仍然小于 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点处的函数值，也就是说，我们还没有找到&ldquo;高&rarr;低&rarr;高&rdquo;的3点。<br />
于是我们继续放大步长，令 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> ，再计算函数值，发现 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_434ea99ec939be08994d39367fd9d146.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f({x_3}) > f({x_2})" /></span><script type='math/tex'>f({x_3}) > f({x_2})</script> ，很好，我们已经找到了&ldquo;高&rarr;低&rarr;高&rdquo;的3点。任务完成， <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2c3d331bc98b44e71cb2aae9edadca7e.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="[a,b]" /></span><script type='math/tex'>[a,b]</script> 即为所求区间。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_16eed244bae8cda67b7b4b3d247524df.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + t \times h" /></span><script type='math/tex'>{x_2} = {x_1} + t \times h</script> （加大步长）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_aa04b6cd962ee49fac0ad911b765d710.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times t \times h" /></span><script type='math/tex'>{x_3} = {x_2} + t \times t \times h</script> （继续加大步长）<br />
<span style="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="background-color: rgb(221, 160, 221);">③</span>：<br />
①是向右搜索，如果我们运气更差一些，一开始就是个错误（应该向左搜索），怎么办？</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_6.png" style="width: 400px; height: 256px;" /></div>
<p><span style="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 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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> ，而 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 处的函数值竟然比起始点 <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 class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_2510c39011c5be704182423e3a695e91.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h" /></span><script type='math/tex'>h</script> 设为负值），并且把 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 挪到 <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> ，继续按①的节奏进行下去。<br />
总结一下步骤就是：<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_83c84950d6ab71b491310cf6fdeff6e1.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0} + h" /></span><script type='math/tex'>{x_1} = {x_0} + h</script> （发现函数值不降反升）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_761bf3e16011552f691e8ecbe1f52d9c.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="h' = - h" /></span><script type='math/tex'>h' = - h</script> （步长设为负值，向左搜索）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_49c03e6e72258ffeeb5c461e0983f30b.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1} = {x_0}" /></span><script type='math/tex'>{x_1} = {x_0}</script> （重置 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_802914d74c5ec475b03d8e01114b4af4.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_1}" /></span><script type='math/tex'>{x_1}</script> 点）<br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_98d08c4623b6deffb01ecc0f74005111.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_2} = {x_1} + h'" /></span><script type='math/tex'>{x_2} = {x_1} + h'</script> <br />
 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_5fdd5a736e805b777b0290ce5be54185.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="{x_3} = {x_2} + t \times h'" /></span><script type='math/tex'>{x_3} = {x_2} + t \times h'</script> （加大步长，函数值回升，停止搜索）<br />
<span style="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="background-color: rgb(0, 255, 0);">【3】</span>加快划界的速度：逆抛物内插<br />
有没有什么办法可以加快划界的速度呢？有，<span style="color:#ff0000;">逆抛物内插</span>（<span style="color:#0000ff;">Inverse Parabolic Interpolation</span>）就是一种技术，它可以使得划界算法<span style="color:#0000ff;">超线性收敛</span>。<br />
为了解释什么是逆抛物内插，这里用书上的一幅图来讲解：</p>
<div style="text-align: center;">
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_7.png" style="width: 450px; height: 322px;" /></div>
<p><span style="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:#b22222;">横坐标</span>，从而可以找到同一横坐标下，目标函数上的点，即点④；然后再过①②④三点作一条抛物线（图中细虚线所示），可以计算出该抛物线的极小值点的横坐标，从而又可以找到同一横坐标下，目标函数上的点，即点⑤。这样，我们就很快地逼近了极小值。</p>
<p>那么，过三点的抛物线，其极小值点的横坐标怎么求？<br />
已知函数 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_50bbd36e1fd2333108437a2ca378be62.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(x)" /></span><script type='math/tex'>f(x)</script> ，过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_8ca1651768f9a28ea5d93fc636ac68c0.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="f(a),f(b),f(c)" /></span><script type='math/tex'>f(a),f(b),f(c)</script> 三点的抛物线，其极小值点的横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> 为：<br />
<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/ckfinder/images/optimization_bracket_8.png" style="width: 550px; height: 74px;" /><br />
<span style="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 />
注：为什么叫&ldquo;<span style="color:#ff0000;">逆</span>&rdquo;？因为上面的方法是用来求横坐标 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_9dd4e461268c8034f5c8564e155c67a6.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="x" /></span><script type='math/tex'>x</script> ，而不是求 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_415290769594460e2e485922904f345d.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="y" /></span><script type='math/tex'>y</script> 的。</p>
<p>有人会问：划界的目标就是找到3个点，而你怎么会预先知道3个点的坐标，从而进行逆抛物内插？这不是因果倒置了吗？<br />
其实，这里的三个点，并不是划界的结果，而是初始的猜测，通过初始的猜测点进行逆抛物内插，再根据内插点的不同情况，分别作不同的处理，最终可以找到划界的3个点。<br />
例如，我们总要知道两个初始点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_b345e1dc09f20fdefdea469f09167892.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a,b" /></span><script type='math/tex'>a,b</script> 吧？好吧，如果你已知的真的只有一个点 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> ，那么 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_92eb5ffee6ae2fec3ad71c777531578f.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="b" /></span><script type='math/tex'>b</script> 就随便取比 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_0cc175b9c0f1b6a831c399e269772661.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="a" /></span><script type='math/tex'>a</script> 大一点的值好了，这也能凑够两个点啊。通过这两个点，可以通过 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4709d232f6de1eb5e3116dd8f7bf1226.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c = b + COE \times (b - a)" /></span><script type='math/tex'>c = b + COE \times (b - a)</script> 来得到猜测的第一个 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_4a8a08f09d37b73795649038408b5f33.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="c" /></span><script type='math/tex'>c</script> 点（这里的 <span class='MathJax_Preview'><img src='https://www.codelast.com/wp-content/plugins/latex/cache/tex_f10a915e958de33deceb8525ce3338b7.gif' style='vertical-align: middle; border: none; padding-bottom:2px;' class='tex' alt="COE" /></span><script type='math/tex'>COE</script> 表示一个系数，例如1.618），从而可以通过这3点开始逆抛物内插。<br />
<span style="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 />
一个实用的划界程序还是挺复杂的&mdash;&mdash;这里的复杂是比较于上面陈述的最简单的划界算法来说的，因为要保证程序在很多&ldquo;意外情况&rdquo;下都能正确运行，必须做很多工作。这里就不分析具体的程序了，大家可以到网上找来看一下。<br />
<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%9b%e4%b8%80%e7%bb%b4%e6%90%9c%e7%b4%a2%e4%b8%ad%e7%9a%84%e5%88%92%e7%95%8cbracket%e7%ae%97%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]最优化/Optimization文章合集</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e4%bc%98%e5%8c%96optimization%e6%96%87%e7%ab%a0%e5%90%88%e9%9b%86/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e4%bc%98%e5%8c%96optimization%e6%96%87%e7%ab%a0%e5%90%88%e9%9b%86/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sat, 26 Oct 2013 05:11:40 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Math]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[算法]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7364</guid>

					<description><![CDATA[<p>
<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E4%BC%98%E5%8C%96" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">最优化</span></a>（Optimization）是应用数学的一个分支，它是研究在给定约束之下如何寻求某些因素(的量)，以使某一(或某些)指标达到最优的一些学科的总称。我一直对最优化比较感兴趣，所以写过一些相关的笔记，可能有不正确的地方，但请学术派、技术流们多多包涵。</p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=2780" rel="noopener noreferrer" target="_blank">拟牛顿法/Quasi-Newton，DFP算法/Davidon-Fletcher-Powell，及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=2573" rel="noopener noreferrer" target="_blank">最速下降法/steepest descent，牛顿法/newton，共轭方向法/conjugate direction，共轭梯度法/conjugate gradient 及其他</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=1419" rel="noopener noreferrer" target="_blank">Ridders求导算法</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=1288" rel="noopener noreferrer" target="_blank">选主元的高斯-约当（Gauss-Jordan）消元法解线性方程组/求逆矩阵</a><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=2348" rel="noopener noreferrer" target="_blank">关于 最优化/Optimization 的一些概念解释</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=1027" rel="noopener noreferrer" target="_blank">最小二乘的理论依据</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=388" rel="noopener noreferrer" target="_blank">Powell共轭方向集方法(Powell&#39;s Conjugate Direction Method)的实现</a><br />
<span id="more-7364"></span><br />
<span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=434" rel="noopener noreferrer" target="_blank">黄金比例搜索算法（Golden Section Search）的实现</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=29" rel="noopener noreferrer" target="_blank">LM(Levenberg-Marquard)算法的实现</a><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7360" rel="noopener noreferrer" target="_blank">一维搜索中的划界(Bracket)算法</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7446" rel="noopener noreferrer" target="_blank">漫谈line search中的Fibonacci搜索与黄金比例搜索</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7320" rel="noopener noreferrer" target="_blank">用&#8220;人话&#8221;解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7488" rel="noopener noreferrer" target="_blank">信赖域(Trust Region)算法是怎么一回事</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7514" rel="noopener noreferrer" target="_blank">使用一维搜索(line search)的算法的收敛性</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=7838" rel="noopener noreferrer" target="_blank">line search中的重要定理 - 梯度与方向的点积为零</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=8022" rel="noopener noreferrer" target="_blank">Cauchy-Schwartz(柯西-许瓦兹)不等式复习</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=8006" rel="noopener noreferrer" target="_blank">再谈 最速下降法/梯度法/Steepest Descent/Gradient descent</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=8052" rel="noopener noreferrer" target="_blank">再谈 牛顿法/Newton&#39;s Method In Optimization</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span><a href="https://www.codelast.com/?p=8095" rel="noopener noreferrer" target="_blank">再谈 共轭方向法/Conjugate Direction Method In Optimization</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&#160;</span>To be added...&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e4%bc%98%e5%8c%96optimization%e6%96%87%e7%ab%a0%e5%90%88%e9%9b%86/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E4%BC%98%E5%8C%96" rel="noopener noreferrer" target="_blank"><span style="background-color:#ffa07a;">最优化</span></a>（Optimization）是应用数学的一个分支，它是研究在给定约束之下如何寻求某些因素(的量)，以使某一(或某些)指标达到最优的一些学科的总称。我一直对最优化比较感兴趣，所以写过一些相关的笔记，可能有不正确的地方，但请学术派、技术流们多多包涵。</p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=2780" rel="noopener noreferrer" target="_blank">拟牛顿法/Quasi-Newton，DFP算法/Davidon-Fletcher-Powell，及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=2573" rel="noopener noreferrer" target="_blank">最速下降法/steepest descent，牛顿法/newton，共轭方向法/conjugate direction，共轭梯度法/conjugate gradient 及其他</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=1419" rel="noopener noreferrer" target="_blank">Ridders求导算法</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=1288" rel="noopener noreferrer" target="_blank">选主元的高斯-约当（Gauss-Jordan）消元法解线性方程组/求逆矩阵</a><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=2348" rel="noopener noreferrer" target="_blank">关于 最优化/Optimization 的一些概念解释</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=1027" rel="noopener noreferrer" target="_blank">最小二乘的理论依据</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=388" rel="noopener noreferrer" target="_blank">Powell共轭方向集方法(Powell&#39;s Conjugate Direction Method)的实现</a><br />
<span id="more-7364"></span><br />
<span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=434" rel="noopener noreferrer" target="_blank">黄金比例搜索算法（Golden Section Search）的实现</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=29" rel="noopener noreferrer" target="_blank">LM(Levenberg-Marquard)算法的实现</a><br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7360" rel="noopener noreferrer" target="_blank">一维搜索中的划界(Bracket)算法</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7446" rel="noopener noreferrer" target="_blank">漫谈line search中的Fibonacci搜索与黄金比例搜索</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7320" rel="noopener noreferrer" target="_blank">用&ldquo;人话&rdquo;解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7488" rel="noopener noreferrer" target="_blank">信赖域(Trust Region)算法是怎么一回事</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7514" rel="noopener noreferrer" target="_blank">使用一维搜索(line search)的算法的收敛性</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=7838" rel="noopener noreferrer" target="_blank">line search中的重要定理 - 梯度与方向的点积为零</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=8022" rel="noopener noreferrer" target="_blank">Cauchy-Schwartz(柯西-许瓦兹)不等式复习</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=8006" rel="noopener noreferrer" target="_blank">再谈 最速下降法/梯度法/Steepest Descent/Gradient descent</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=8052" rel="noopener noreferrer" target="_blank">再谈 牛顿法/Newton&#39;s Method In Optimization</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span><a href="https://www.codelast.com/?p=8095" rel="noopener noreferrer" target="_blank">再谈 共轭方向法/Conjugate Direction Method In Optimization</a></p>
<p><span style="background-color: rgb(0, 255, 0);">➤&nbsp;</span>To be added...</p>
<p><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%9b%e6%9c%80%e4%bc%98%e5%8c%96optimization%e6%96%87%e7%ab%a0%e5%90%88%e9%9b%86/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]拟牛顿法/Quasi-Newton，DFP算法/Davidon-Fletcher-Powell，及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%8b%9f%e7%89%9b%e9%a1%bf%e6%b3%95quasi-newton%ef%bc%8cdfp%e7%ae%97%e6%b3%95davidon-fletcher-powell%ef%bc%8c%e5%8f%8abfgs%e7%ae%97%e6%b3%95broyden-fletcher-goldfarb-shanno/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%8b%9f%e7%89%9b%e9%a1%bf%e6%b3%95quasi-newton%ef%bc%8cdfp%e7%ae%97%e6%b3%95davidon-fletcher-powell%ef%bc%8c%e5%8f%8abfgs%e7%ae%97%e6%b3%95broyden-fletcher-goldfarb-shanno/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Tue, 14 Jun 2011 17:44:56 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[拟牛顿法]]></category>
		<category><![CDATA[最优化]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=2780</guid>

					<description><![CDATA[<p>
	&#160;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在最优化领域，有几个你绝对不能忽略的关键词：拟牛顿、DFP、BFGS。名字很怪，但是非常著名。下面会依次地说明它们分别&#8220;是什么&#8221;，&#8220;有什么用&#8221; 以及 &#8220;怎么来的&#8221;。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px; "><font class="Apple-style-span">但是在进入正文之前，还是要先提到一个概念上的区别，否则将影响大家的理解：其实DFP算法、BFGS算法都属于拟牛顿法，即，DFP、BFGS都分别是一种拟牛顿法。</font></span></span><br />
	<span id="more-2780"></span></p>
<p>
	<span style="font-size: 14px;">先从拟牛顿法（Quasi-Newton）说起。这个怪怪的名词其实很形象：这是一种&#8221;模拟&#8220;的牛顿法。那么，它模拟了牛顿法的哪一部分呢？答：模拟的就是牛顿法中的搜索方向（可以叫作&#8220;牛顿方向&#8221;）的生成方式。</span><br />
	<!--more--></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">牛顿法是什么？本文是基于你已经知道牛顿法的原理的假设，如果你不清楚，那么可以看我<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer">这篇文章</a>，里面非常简单而又清晰地描述了牛顿法的原理。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">了解了牛顿法的原理，我们就知道了：在每一次要得到新的搜索方向的时候，都需要计算Hesse矩阵（二阶导数矩阵）。在自变量维数非常大的时候，这个计算工作是非常耗时的，因此，拟牛顿法的诞生就有意义了：它采用了一定的方法来构造与Hesse矩阵相似的正定矩阵，而这个构造方法计算量比牛顿法小。这就是对它&#8220;有什么用&#8221;的回答了。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color:#f00;"><span style="font-size:20px;">（1）DFP算法</span></span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">下面，就从DFP算法来看看&#8220;拟牛顿&#8221;是如何实现的（DFP算法是以Davidon、Fletcher、Powell三位牛人的名字的首字母命名的）。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">前面说了，Hesse矩阵在拟牛顿法中是不计算的，拟牛顿法是构造与Hesse矩阵相似的正定矩阵，这个构造方法，使用了<span style="color:#006400;">目标函数的梯度（一阶导数）信息和两个点的&#8220;位移&#8221;（X<sub>k</sub>-X<sub>k-1</sub>）</span>来实现。有人会说，<span style="color:#b22222;">是不是用Hesse矩阵的近似矩阵来代替Hesse矩阵，会导致求解效果变差呢</span>？事实上，效果反而</span>通常会变好。有人又会问为什么？那么就简要地说一下&#8212;&#8212;</span></p>
<p>
	<span style="font-family:微软雅黑;">由<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer">牛顿法的原理</a>可知如下几个等式：</span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img decoding="async" alt="newton" height="92" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_00.png" width="467" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">若最后一个等式子的最左边 &#60; 0，即<img decoding="async" alt="" height="22" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_0.png" width="101" />，就是直观概念上的&#8220;沿方向d上，目标函数值下降&#8221;的表达。而在逐步寻找最优解的过程中，我们是要求目标函数值下降的，因此，应该有-(X-X<sub>i</sub>)A(X-X<sub>i</sub>) &#60; 0，也即&#160;</span>(X-X<sub>i</sub>)A(X-X<sub>i</sub>) &#62; 0。<span style="font-size:14px;">这表明矩阵A是<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">正定</a>的。而在远离极小值点处，Hesse矩阵一般不能保证正定，使得目标函数值不降反升。而拟牛顿法可以使目标函数值沿下降方向走下去，并且到了最后，在极小值点附近，可使构造出来的矩阵与Hesse矩阵&#8220;很像&#8221;了，这样，拟牛顿法也会具有牛顿法的二阶收敛性。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%8b%9f%e7%89%9b%e9%a1%bf%e6%b3%95quasi-newton%ef%bc%8cdfp%e7%ae%97%e6%b3%95davidon-fletcher-powell%ef%bc%8c%e5%8f%8abfgs%e7%ae%97%e6%b3%95broyden-fletcher-goldfarb-shanno/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在最优化领域，有几个你绝对不能忽略的关键词：拟牛顿、DFP、BFGS。名字很怪，但是非常著名。下面会依次地说明它们分别&ldquo;是什么&rdquo;，&ldquo;有什么用&rdquo; 以及 &ldquo;怎么来的&rdquo;。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size: 14px; "><font class="Apple-style-span">但是在进入正文之前，还是要先提到一个概念上的区别，否则将影响大家的理解：其实DFP算法、BFGS算法都属于拟牛顿法，即，DFP、BFGS都分别是一种拟牛顿法。</font></span></span><br />
	<span id="more-2780"></span></p>
<p>
	<span style="font-size: 14px;">先从拟牛顿法（Quasi-Newton）说起。这个怪怪的名词其实很形象：这是一种&rdquo;模拟&ldquo;的牛顿法。那么，它模拟了牛顿法的哪一部分呢？答：模拟的就是牛顿法中的搜索方向（可以叫作&ldquo;牛顿方向&rdquo;）的生成方式。</span><br />
	<!--more--></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">牛顿法是什么？本文是基于你已经知道牛顿法的原理的假设，如果你不清楚，那么可以看我<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer">这篇文章</a>，里面非常简单而又清晰地描述了牛顿法的原理。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">了解了牛顿法的原理，我们就知道了：在每一次要得到新的搜索方向的时候，都需要计算Hesse矩阵（二阶导数矩阵）。在自变量维数非常大的时候，这个计算工作是非常耗时的，因此，拟牛顿法的诞生就有意义了：它采用了一定的方法来构造与Hesse矩阵相似的正定矩阵，而这个构造方法计算量比牛顿法小。这就是对它&ldquo;有什么用&rdquo;的回答了。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color:#f00;"><span style="font-size:20px;">（1）DFP算法</span></span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">下面，就从DFP算法来看看&ldquo;拟牛顿&rdquo;是如何实现的（DFP算法是以Davidon、Fletcher、Powell三位牛人的名字的首字母命名的）。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">前面说了，Hesse矩阵在拟牛顿法中是不计算的，拟牛顿法是构造与Hesse矩阵相似的正定矩阵，这个构造方法，使用了<span style="color:#006400;">目标函数的梯度（一阶导数）信息和两个点的&ldquo;位移&rdquo;（X<sub>k</sub>-X<sub>k-1</sub>）</span>来实现。有人会说，<span style="color:#b22222;">是不是用Hesse矩阵的近似矩阵来代替Hesse矩阵，会导致求解效果变差呢</span>？事实上，效果反而</span>通常会变好。有人又会问为什么？那么就简要地说一下&mdash;&mdash;</span></p>
<p>
	<span style="font-family:微软雅黑;">由<a href="http://www.codelast.com/?p=2573" target="_blank" rel="noopener noreferrer">牛顿法的原理</a>可知如下几个等式：</span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="newton" height="92" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_00.png" width="467" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">若最后一个等式子的最左边 &lt; 0，即<img loading="lazy" decoding="async" alt="" height="22" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_0.png" width="101" />，就是直观概念上的&ldquo;沿方向d上，目标函数值下降&rdquo;的表达。而在逐步寻找最优解的过程中，我们是要求目标函数值下降的，因此，应该有-(X-X<sub>i</sub>)A(X-X<sub>i</sub>) &lt; 0，也即&nbsp;</span>(X-X<sub>i</sub>)A(X-X<sub>i</sub>) &gt; 0。<span style="font-size:14px;">这表明矩阵A是<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">正定</a>的。而在远离极小值点处，Hesse矩阵一般不能保证正定，使得目标函数值不降反升。而拟牛顿法可以使目标函数值沿下降方向走下去，并且到了最后，在极小值点附近，可使构造出来的矩阵与Hesse矩阵&ldquo;很像&rdquo;了，这样，拟牛顿法也会具有牛顿法的二阶收敛性。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由于涉及到Hesse矩阵（二阶导数矩阵），我们当然要从目标函数 f(X) 的泰勒展开式说开去。与最优化理论中的很多问题一样，在这里，我们依然要假设目标函数可以用二次函数进行近似（</span><span style="color:#b22222;">实际上很多函数都可以用二次函数很好地近似</span>）：</span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="taylor expansion of f(X)" height="83" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_01.png" width="477" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">忽略高阶无穷小部分，只看前面的3项，其中A为目标函数的Hesse矩阵（二阶导数矩阵）。此式两边对X求导得：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="" height="30" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_02.png" width="374" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">于是，当 X=X<sub>i</sub> 时，将[2]式两边均左乘(A<sub>i+1</sub>)<sup>-1</sup>，有：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="" height="102" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_03.png" width="407" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">上式左右两边近似相等，但如果我们把它换成等号，并且用另一个矩阵H来代替上式中的A<sup>-1</sup>，则得到：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="quasi-newton function" height="34" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_04.png" width="384" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">这个方程，就是拟牛顿方程，其中的矩阵H，就是Hesse矩阵的逆矩阵的一个近似矩阵。但是，从初始的H<sub>0</sub>开始，如何得到每一步迭代过程中需要的H<sub>1</sub>，H<sub>2</sub>，&hellip;&hellip;呢？在迭代过程中生成的矩阵序列H<sub>0</sub>，H<sub>1</sub>，H<sub>2</sub>，&hellip;&hellip;中，每一个矩阵H<sub>i+1</sub>，都是由前一个矩阵H<sub>i</sub>修正得到的，这个修正方法有很多种，这里只说DFP算法的修正方法。</span>设：</span></p>
<p style="text-align: center; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="matrix H" height="34" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_05.png" style="cursor: default; " width="176" /></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">然后又有问题：矩阵E怎么求？再设：</span></span></p>
<p style="text-align: center; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="matrix E" height="34" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_06.png" style="cursor: default; " width="217" /></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">其中，m和n均为实数，v和w均为N维向量。将[6]代入[5]式，再将[5]式代入[4]式，可得：</span></span></p>
<p style="text-align: center; color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="" height="294" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_07.png" style="cursor: default; " width="532" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">[8]式与[7]式完全相同，只不过用简化的记号重写了一下。如果求出了m，n，v，w，就可以知道[6]式怎么求，从而进一步知道[5]式怎么求，从而我们的问题就彻底解决了。符合[7]这个方程的v，w可能有很多，但是我们有没有可能找到v，w的一个&ldquo;特例&rdquo;，使之符合这个等式呢？仔细观察一下，是可以找到的：[7]式的右边两个向量相减的结果，是一个n&times;1的向量，因此，等式左边的计算结果当然也是一个n&times;1的向量（每一项都是一个n&times;1的向量），所以我们把[7]式写成了[8]式的样子，可以看到，其中的第二、第三项中的括号里的向量的点积均为实数，这里，可以使第一个括号中的mv<sup>T</sup>q<sub>i</sub>值为1，使第二个括号中的nw<sup>T</sup>q<sub>i</sub>值为-1，这样的话，v只要取s<sub>i</sub>，w只要取H<sub>i</sub>q<sub>i</sub>，就可以使[8]式成立了。的确，这种带有一点猜测性质的做法，确实可以让我们找到一组适合的m，n，v，w值。</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">所以，我们得到的m，n，v，w值如下：</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="m,n,v,w" height="151" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_08.png" width="363" /></span></p>
<p style="color: rgb(0, 0, 0); ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><font class="Apple-style-span">现在我们几乎大功告成了：将[8]~[11]代入[6]式，然后再将[6]代入[5]式，就得到了Hesse矩阵的逆矩阵的近似阵H的计算方法：</font></span></span></p>
<p style="color: rgb(0, 0, 0); text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="function to calculate H" height="195" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_09.png" style="cursor: default; " width="512" /></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在上面的推导过程中，有人可能觉得有点无厘头：为什么[6]式要那样假设，是怎么想到的？我能给出的答案是：这一点我也没想明白。如果你知道，请告诉我，非常感谢。某些书上经常写类似于&ldquo;很显然，XXX&rdquo;之类的话，从一个定理直接得出了一个让人摸不着头脑的结论，而作为我这样比较笨的人来说，我觉得写书的很多专家们认为&ldquo;很显然&rdquo;的东西一点也不&ldquo;显然&rdquo;，甚至于有时候，我觉得那就像凤姐突然变成了范冰冰一样&mdash;&mdash;一下子变出来了一个漂亮的结论，难以相信。所以这也是为什么我花费了很多时间，来把一些&ldquo;很显然&rdquo;的东西记下来，写明白的原因了。对于大多数牛人，他们需要的当然不是这种思维跨度这么小的文章，而是那种从地球可以一下子飞到火星的文章。所以，我写的东西不适合于水平高的人看，我只期望能帮助一小部分人就知足了。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">说到这里，那么到底什么是DFP算法呢？上面的矩阵H的计算方法就是其核心，下面再用简单的几句话描述一下DFP算法的流程：</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">已知初始正定矩阵H<sub>0</sub>，从一个初始点开始（迭代），用式子&nbsp;<img loading="lazy" decoding="async" alt="function to calculate search direction in DFP" height="24" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_10.png" width="136" />&nbsp;来计算出下一个搜索方向，并在该方向上求出可使目标函数极小化的步长&alpha;，然后用这个步长，将当前点挪到下一个点上，并检测是否达到了程序中止的条件，如果没有达到，则用上面所说的[13]式的方法计算出下一个修正矩阵H，并计算下一个搜索方向&hellip;&hellip;周而复始，直到达到程序中止条件。</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">有人会说，上面那些乱七八糟的都是搞什么啊，猜来猜去的就折腾出了一个公式，然后就确定这公式能用了？就不怕它在迭代的时候根本无法寻找到目标函数的极小值？正因为有这些疑问，所以在这里，还要提及一个<span style="color:#f00;">非常重要的问题</span>：我们通过带有猜测性质的做法，得到了矩阵H的计算公式，但是，这个修正过的矩阵，能否保持<span style="color:#00f;">正定</span>呢？前面已经说了，<span style="color:#00f;">矩阵H正定是使目标函数值下降的条件，</span>所以，它保持正定性很重要。<span style="color:#800080;">可以证明</span>，矩阵H保持正定的<span style="color:#006400;">充分必要条件</span>是：</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="condition to keep matrix H positive definite" height="34" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_12.png" style="cursor: default; " width="414" /></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">并且，在迭代过程中，<span style="color:#b22222;">这个条件也是容易满足的</span>。此结论的证明并不复杂，但是为了不影响本文的主旨，这里就没有必要写出来了。总之，我觉得作为一个最优化的学习者来说，首先要关注的是不是这些细节问题，而是先假设这些算法都适用，然后等积累到一定程度了，再去想&ldquo;为什么能适用&rdquo;的问题。</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	&nbsp;</p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="color:#f00;"><span style="font-size:14px;"><span style="font-size:20px;">（2）BFGS算法</span></span></span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size: 14px; "><font class="Apple-style-span">在上面的DFP算法的推导中，我们得到了矩阵H的计算公式，而BFGS算法和它有点像，但是比它形式上复杂一点。尽管它更复杂，但是在BFGS算法被Broyden，Fletcher，Goldfarb，Shanno四位牛人发明出来到现在的40多年时间里，它仍然被认为是最好的拟牛顿算法。历史总是这样，越往后推移，人们要超越某种技术所需的时间通常就越长。但是我们很幸运地可以站在巨人的肩膀上，从而可以在使用前人已经发明的东西的基础上感叹一声：这玩意太牛了。</font></span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><font class="Apple-style-span">好吧，又扯远了&hellip;&hellip; 回到中心主题，看看在BFGS算法中，与上面的[13]式一样的矩阵H是如何计算的：</font></span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="matrix H in BFGS" height="315" src="http://www.codelast.com/wp-content/uploads/2011/06/quasi_dfp_bfgs_11.png" style="cursor: default; " width="530" /></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在[14]式中，<span style="color:#b22222;">最后一项（深蓝色的部分）就是BFGS比DFP多出来的东西</span>。其中，w为一个n&times;1的向量。我们看到，由于向量w的表达式太长，所以没有把它直接写在[14]式中，而是单独列在了[15]式里。</span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">可能[14]式一看就让人头晕，所以先来弱弱地解释一下这个式子的计算结果（如果你觉得好雷人，那么请直接无视）：ww<sup>T</sup>是一个n&times;1的向量与一个1&times;n的向量相乘，结果为一个n&times;n的矩阵，而[14]式中最后一项里，除了ww<sup>T</sup>之外的那一部分是（1&times;n）向量、n&times;n矩阵、n&times;1向量相乘，结果为一实数，因此[14]式最后一项结果为一个n&times;n矩阵，这与[14]式等号左边的矩阵H为n&times;n矩阵一致。这一点没有问题了。</span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在目标函数为<a href="http://zh.wikipedia.org/wiki/%E4%BA%8C%E6%AC%A1%E5%9E%8B" target="_blank" rel="noopener noreferrer">二次型</a>（&ldquo;在数学中，二次型是一些变量上的二次齐次多项式&rdquo;）时，无论是DFP还是BFGS&mdash;&mdash;也就是说，无论[14]式中有没有最后一项&mdash;&mdash;它们均可以使矩阵H在n步之内收敛于A<sup>-1</sup>。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">延伸阅读：BFGS有一个变种（我不知道这样称呼是否正确），叫作&ldquo;<span style="color:#f00;">Limited-memory BFGS</span>&rdquo;，简称&ldquo;<span style="color:#f00;">L-BFGS</span>&rdquo;或&ldquo;<span style="color:#f00;">LM-BFGS</span>&rdquo;（这里的&ldquo;LM&rdquo;与<a href="http://www.codelast.com/?p=29" target="_blank" rel="noopener noreferrer">Levenberg-Marquard算法</a>没有关系），从它的名字上看，你肯定能猜到，使用L-BFGS算法来编写程序时，它会比BFGS算法占用的内存小。从前面的文章中，我们知道，BFGS在计算过程中要存储一个n&times;n的矩阵，当维数n很大的时候，这个内存占用量会很大&mdash;&mdash;例如，在10万维的情况下，假设矩阵H中的元素以double来存储，那么，内存占用即为100000&times;100000&times;8&divide;1024&divide;1024&divide;1024&asymp;74.5（GB），这太惊人了，一般的服务器几乎无法承受。所以，使用L-BFGS来降低内存使用量在某些情况下是非常有意义的。</span></span></p>
<p style="color: rgb(0, 0, 0); font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">关于L-BFGS的英文解释，请点击<a href="http://en.wikipedia.org/wiki/L-BFGS" target="_blank" rel="noopener noreferrer">这个Wiki链接</a>。由于我还没有深入学习L-BFGS，所以没办法在这里详细叙述了。</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">（全文完）</span></span><br />
	<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%9b%e6%8b%9f%e7%89%9b%e9%a1%bf%e6%b3%95quasi-newton%ef%bc%8cdfp%e7%ae%97%e6%b3%95davidon-fletcher-powell%ef%bc%8c%e5%8f%8abfgs%e7%ae%97%e6%b3%95broyden-fletcher-goldfarb-shanno/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]最速下降法/steepest descent，牛顿法/newton，共轭方向法/conjugate direction，共轭梯度法/conjugate gradient 及其他</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%ef%bc%8c%e7%89%9b%e9%a1%bf%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%a2%af%e5%ba%a6/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%ef%bc%8c%e7%89%9b%e9%a1%bf%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%a2%af%e5%ba%a6/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 29 May 2011 19:52:25 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[steepest descent]]></category>
		<category><![CDATA[共轭方向法]]></category>
		<category><![CDATA[共轭梯度法]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[最速下降法]]></category>
		<category><![CDATA[牛顿法]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=2573</guid>

					<description><![CDATA[<p>
	&#160;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在最优化的领域中，这&#8220;法&#8221;那&#8220;法&#8221;无穷多，而且还&#8220;长得像&#8221;&#8212;&#8212;名字相似的多，有时让人觉得很迷惑。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在自变量为一维的情况下，也就是自变量可以视为一个标量，此时，一个实数就可以代表它了，这个时候，如果要改变自变量的值，则其要么减小，要么增加，也就是&#8220;非左即右&#8220;，所以，说到&#8220;自变量在某个方向上移动&#8221;这个概念的时候，它并不是十分明显；而在自变量为n（n&#8805;2）维的情况下，这个概念就有用了起来：假设自变量X为3维的，即每一个X是（x<sub>1</sub>, x<sub>2</sub></span>, x<sub>3</sub><span style="font-size:14px;">）这样的一个点，其中x<sub>1</sub>，x<sub>2</sub>和x<sub>3</sub>分别是一个实数，即标量。那么，如果要改变X，即将一个点移动到另一个点，你怎么移动？可以选择的方法太多了，例如，我们可以令x<sub>1</sub>，x<sub>2</sub>不变，仅使x<sub>3</sub>改变，也可以令x<sub>1</sub>，x<sub>3</sub>不变，仅使x<sub>2</sub>改变，等等。这些做法也就使得我们有了&#8221;方向&#8220;的概念，因为在3维空间中，一个点移动到另一个点，并不是像一维情况下那样&#8220;非左即右&#8221;的，而是有&#8220;方向&#8221;的。在这样的情况下，找到一个合适的&#8221;方向&#8220;，使得从一个点移动到另一个点的时候，函数值的改变最符合我们预定的要求（例如，函数值要减小到什么程度），就变得十分有必要了。</span></span><br />
	<span id="more-2573"></span></p>
<p>
	<span style="font-size: 14px; color: rgb(255, 255, 255); line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" style="font-size: 14px; " target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px; ">前奏已经结束，下面进入正题。</span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:20px;"><span style="color:#f00;">【</span><span style="color:#00f;">1</span><span style="color:#f00;">】</span><span style="color:#00f;">最速下降法（或：梯度法）</span></span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><span style="color:#0000ff;">加注：我又写了一篇关于最速下降法的文章，更详细，请看<a href="http://www.codelast.com/?p=8006" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这里</span></a>。</span></span></span></p>
<p>	很形象，也许你的脑子里一闪而过的，就是：取可以让目标函数值最快速&#8220;下降&#8221;的方法？差不多是这么回事。严谨地说：<span style="color:#f00;">以负梯度方向作为极小化方法的下降方向，这种方法就是最速下降法</span>。</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">为什么是<span style="color:#b22222;">负梯度</span>方向使目标函数值下降最快？以前我也只是死记硬背，背出来的东西虽然有用，终究还是令人糊涂的。所以有必要写出它&#8221;为什么&#8220;的理由：</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">我们正在讨论的是&#8221;n维空间中的一个点移动到另一个点之后，目标函数值的改变情况&#8220;，因此，先直接写出代表最终的目标函数值的数学表达式：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="dest function value taylor series" height="32" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_1.png" width="382" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="start point" height="27" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_2.png" width="27" />：代表第k个点的自变量（一个向量）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="direction" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_4.png" width="17" />：单位方向（一个向量），即 &#124;d&#124;=1。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="step" height="18" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_3.png" width="18" />：步长（一个实数）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="gradient" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_5.png" width="134" />：目标函数在X<sub>k</sub>这一点的梯度（一个向量）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="higher-order infinitesimal" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_6.png" width="45" />：&#945;的高阶无穷小。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%ef%bc%8c%e7%89%9b%e9%a1%bf%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%a2%af%e5%ba%a6/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在最优化的领域中，这&ldquo;法&rdquo;那&ldquo;法&rdquo;无穷多，而且还&ldquo;长得像&rdquo;&mdash;&mdash;名字相似的多，有时让人觉得很迷惑。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在自变量为一维的情况下，也就是自变量可以视为一个标量，此时，一个实数就可以代表它了，这个时候，如果要改变自变量的值，则其要么减小，要么增加，也就是&ldquo;非左即右&ldquo;，所以，说到&ldquo;自变量在某个方向上移动&rdquo;这个概念的时候，它并不是十分明显；而在自变量为n（n&ge;2）维的情况下，这个概念就有用了起来：假设自变量X为3维的，即每一个X是（x<sub>1</sub>, x<sub>2</sub></span>, x<sub>3</sub><span style="font-size:14px;">）这样的一个点，其中x<sub>1</sub>，x<sub>2</sub>和x<sub>3</sub>分别是一个实数，即标量。那么，如果要改变X，即将一个点移动到另一个点，你怎么移动？可以选择的方法太多了，例如，我们可以令x<sub>1</sub>，x<sub>2</sub>不变，仅使x<sub>3</sub>改变，也可以令x<sub>1</sub>，x<sub>3</sub>不变，仅使x<sub>2</sub>改变，等等。这些做法也就使得我们有了&rdquo;方向&ldquo;的概念，因为在3维空间中，一个点移动到另一个点，并不是像一维情况下那样&ldquo;非左即右&rdquo;的，而是有&ldquo;方向&rdquo;的。在这样的情况下，找到一个合适的&rdquo;方向&ldquo;，使得从一个点移动到另一个点的时候，函数值的改变最符合我们预定的要求（例如，函数值要减小到什么程度），就变得十分有必要了。</span></span><br />
	<span id="more-2573"></span></p>
<p>
	<span style="font-size: 14px; color: rgb(255, 255, 255); line-height: 20px; text-align: left; background-color: rgb(255, 255, 255); ">文章来源：</span><a href="http://www.codelast.com/" style="font-size: 14px; " target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255); ">http://www.codelast.com/</span></a></p>
<p>
	<span style="font-size: 14px; ">前奏已经结束，下面进入正题。</span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:20px;"><span style="color:#f00;">【</span><span style="color:#00f;">1</span><span style="color:#f00;">】</span><span style="color:#00f;">最速下降法（或：梯度法）</span></span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><span style="color:#0000ff;">加注：我又写了一篇关于最速下降法的文章，更详细，请看<a href="http://www.codelast.com/?p=8006" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这里</span></a>。</span></p>
<p>	很形象，也许你的脑子里一闪而过的，就是：取可以让目标函数值最快速&ldquo;下降&rdquo;的方法？差不多是这么回事。严谨地说：<span style="color:#f00;">以负梯度方向作为极小化方法的下降方向，这种方法就是最速下降法</span>。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">为什么是<span style="color:#b22222;">负梯度</span>方向使目标函数值下降最快？以前我也只是死记硬背，背出来的东西虽然有用，终究还是令人糊涂的。所以有必要写出它&rdquo;为什么&ldquo;的理由：</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">我们正在讨论的是&rdquo;n维空间中的一个点移动到另一个点之后，目标函数值的改变情况&ldquo;，因此，先直接写出代表最终的目标函数值的数学表达式：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="dest function value taylor series" height="32" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_1.png" width="382" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="start point" height="27" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_2.png" width="27" />：代表第k个点的自变量（一个向量）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="direction" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_4.png" width="17" />：单位方向（一个向量），即 |d|=1。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="step" height="18" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_3.png" width="18" />：步长（一个实数）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="gradient" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_5.png" width="134" />：目标函数在X<sub>k</sub>这一点的梯度（一个向量）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="higher-order infinitesimal" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_6.png" width="45" />：&alpha;的高阶无穷小。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">显然，这个数学表达式是用泰勒公式展开得到的，样子有点难看，所以对比一下自变量为一维的情况下的泰勒展开式</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="one dimension taylor series" height="34" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_7.png" width="326" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">就知道多维的情况下的泰勒展开式是怎么回事了。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">在[1]式中，高阶无穷小可以忽略，因此，要使[1]式取到最小值，应使<img loading="lazy" decoding="async" alt="gradient multiplied by direction" height="29" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_8.png" width="46" />取到最小&mdash;&mdash;这是两个向量的<span style="color:#b22222;">点积（数量积）</span>，何种情况下其值最小呢？来看两向量<img loading="lazy" decoding="async" alt="vector a and b" height="30" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_9.png" width="40" />的夹角&theta;的余弦是如何定义的：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="cosθ" height="70" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_10.png" width="133" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">假设向量<img loading="lazy" decoding="async" alt="direction" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_4.png" style="cursor: default; " width="17" />与负梯度<img loading="lazy" decoding="async" alt="negative gradient" height="25" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_13.png" style="cursor: default; " width="42" />的夹角为&theta;，我们便可求出点积<img loading="lazy" decoding="async" alt="gradient multiplied by direction" height="29" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_8.png" style="cursor: default; " width="46" />的值为：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="value of gradient multiplied by direction" height="38" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_12.png" width="342" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">可见，&theta;为0时，上式取得最小值。也就是说，<img loading="lazy" decoding="async" alt="direction" height="22" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_4.png" style="cursor: default; " width="17" />取<img loading="lazy" decoding="async" alt="negative gradient" height="25" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_13.png" style="cursor: default; " width="42" />时，目标函数值下降得最快，这就是称负梯度方向为&ldquo;最速下降&rdquo;方向的由来了。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><span style="color:#800080;">最速下降法的收敛性</span>：对一般的目标函数是整体收敛的（所谓整体收敛，是指不会非要在某些点附近的范围内，才会有好的收敛性）。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><span style="color:#800080;">最速下降法的收敛速度</span>：至少是线性收敛的。</span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:20px;"><span style="color: rgb(255, 0, 0); ">【</span><span style="color: rgb(0, 0, 255); ">2</span><span style="color: rgb(255, 0, 0); ">】</span><span style="color: rgb(0, 0, 255); ">牛顿法</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">上面的最速下降法只用到了梯度信息，即目标函数的一阶导数信息，而牛顿法则用到了二阶导数信息。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">在<img loading="lazy" decoding="async" alt="start point" height="27" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_2.png" style="cursor: default; " width="27" />点处，对目标函数进行泰勒展开，并只取二阶导数及其之前的几项（更高阶的导数项忽略），得：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="taylor seires at Xk" height="49" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_14.png" width="480" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="gradient" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_5.png" style="cursor: default; " width="134" />：目标函数在X<sub>k</sub>这一点的梯度（一个向量）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="Hesse matrix" height="28" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_15.png" width="133" />：目标函数在X<sub>k</sub>这一点的<a href="http://www.codelast.com/?p=2348" target="_blank" rel="noopener noreferrer">Hesse矩阵</a>（二阶导数矩阵），这里假设其是连续的。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">由于极小值点必然是驻点，而驻点是一阶导数为0的点，所以，对 r(X) 这个函数来说，要取到极小值，我们应该分析其一阶导数。对X求一阶导数，并令其等于0：</span></span><br />
	<img decoding="async" alt="" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_16.png" style="width: 300px; height: 39px;" /></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">当G<sub>k</sub>的逆矩阵存在，也即G<sub>k</sub>为<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">非奇异矩阵</a>的时候，将上式两边都左乘G<sub>k</sub>的逆矩阵G<sub>k</sub><sup>-1</sup>，得：</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="calculate next point" height="64" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_17.png" width="271" /></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">到了这一步，已经很明显了。这个式子表达了下一点的计算方法：X<sub>k</sub>在方向d上按步长1（1&times;d = d）移动到点X。所以我们知道方向d怎么求了：</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="solve equation to get d" height="70" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_18.png" width="147" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">如果你觉得上式有点奇怪：<span style="color:#b22222;">为什么都得到了d的表达式，还要再弄出一个</span><span style="color:#b22222;">G<sub>k</sub></span><span style="color:#b22222;">d=-</span><span style="color:#b22222;">g<sub>k</sub></span>？那么我说：因为在实际应用中，d并不是通过G<sub>k</sub><sup>-1</sup>与g<sub>k</sub>相乘来计算出的（因为我们并不知道逆矩阵G<sub>k</sub><sup>-1</sup>是什么），而是通过解方程组G<sub>k</sub>d=-g<sub>k</sub>求出的。这个解方程组的过程，其实也就可能是一个求逆矩阵的过程。<span style="color:#800080;">关于解此方程组的方法，可以参考<a href="http://www.codelast.com/?p=1288" target="_blank" rel="noopener noreferrer">这一篇文章</a></span>。关键时刻，概念清晰很重要。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">有人说，那么方程组可能无解呢？没错，方程组可能是奇异的，在这种情况下，就需要用到其他的修正技术，来获取搜索方向了，本文不谈。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">上面关于牛顿法的各种推导可能让你觉得杂乱无章，但实际上它们就是牛顿法的基本步骤：<span style="color:#006400;">每一步迭代过程中，通过解线性方程组得到搜索方向，然后将自变量移动到下一个点，然后再计算是否符合收敛条件，不符合的话就一直按这个策略（解方程组&rarr;得到搜索方向&rarr;移动点&rarr;检验收敛条件）继续下去</span>。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(128, 0, 128); ">牛顿法的收敛性</span>：对一般问题都不是整体收敛的（只有当初始点充分接近极小点时，才有很好的收敛性）。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(128, 0, 128); ">牛顿法的收敛速度</span>：二阶收敛。因此，它比最速下降法要快。</span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:20px;"><span style="color: rgb(255, 0, 0); ">【</span><font class="Apple-style-span" color="#0000FF">3</font><span style="color: rgb(255, 0, 0); ">】</span><span style="color: rgb(0, 0, 255); ">共轭方向法</span></span></span></p>
<p>
	<span style="color: rgb(0, 0, 255); font-family: 微软雅黑; font-size: 14px;">加注：我又写了一篇关于共轭方向法的文章，更详细，请看</span><a href="http://www.codelast.com/?p=8095" style="font-family: 微软雅黑; font-size: 14px;" target="_blank" rel="noopener noreferrer"><span style="background-color: rgb(255, 160, 122);">这里</span></a><span style="color: rgb(0, 0, 255); font-family: 微软雅黑; font-size: 14px;">。</span><br />
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">上面的方法，前、后两次迭代的方向并没有特别的相关要求，而共轭方向法则有了&mdash;&mdash;它要求新的搜索方向与前面所有的搜索方向是共轭的。由于搜索方向是向量，所以也就是说，这些向量是满足<span style="color:#006400;">共轭条件</span>的：</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="conjugate condition" height="38" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_20.png" width="102" /></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">其中，m&ne;n，d<sub>m</sub>和d<sub>n</sub>分别为两个向量（搜索方向），G为对称正定矩阵。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#800080;">对于&ldquo;共轭&rdquo;，我有一个自己&ldquo;捏造&rdquo;出来的说法，来帮助你记忆它的含义：看到&ldquo;共轭&rdquo;，就想到&ldquo;共遏&rdquo;，即&ldquo;互相遏制&rdquo;，这不，两个向量中间夹着一个矩阵互相发力，结果谁也占不到便宜&mdash;&mdash;积为0。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">共轭方向法也是只利用了目标函数的梯度信息，即一阶导数信息，不用计算Hesse矩阵，使得其计算量比牛顿法小很多。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">但是，怎么在每一步迭代的过程中，都得到若干个两两共轭的搜索方向？<a href="http://www.codelast.com/?p=388" target="_blank" rel="noopener noreferrer">Powell共轭方向集方法</a>是一个选择，它可以构造出若干个两两共轭的方向。不过，它本身也有一些缺陷：在构造共轭方向的过程中，各方向会逐渐变得线性相关，这就达不到&ldquo;共轭&rdquo;的要求了。所以，有很多种对Powell算法进行修正的策略被人们应用到了实际场景中，现在说到Powell方法，应该或多或少都包含了那些修正策略吧（我的感觉）。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;"><span style="color:#b22222;">特别值得一提的是</span>，在共轭方向法中，新搜索方向的确定，是要满足<span style="color:#006400;">&ldquo;下降&rdquo;条件</span>的，即方向与梯度之积&lt;0：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="descent property" height="34" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_19.png" width="95" /></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">是不是意味着目标函数值下降量越大，这个方向就越可取呢？不是。在人们已经发现的修正Powell算法的有效方法中，有一种方法是舍弃目标函数值下降最大的方向&mdash;&mdash;这看似不合理的做法恰恰蕴含了合理的结果：放弃目标函数值下降最大的方向能更好地避免各方向线性相关。关于这一点，这里就不详述了。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">一句话总结共轭方向法的过程：选定搜索方向d，使之满足<span style="color:#006400;">共轭条件</span>以及<span style="color:#006400;">下降条件</span>，在此搜索方向上通过<a href="http://www.codelast.com/?p=2348" target="_blank" rel="noopener noreferrer">精确线搜索</a>确定移动的步长，然后将当前点移动到下一点，再重新选定搜索方向，周而复始，直到满足终止条件。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(128, 0, 128); ">共轭方向法的收敛性</span>：对二次函数，最多在n步（n为自变量的维数）内就可找到其极小值点。对一般的非二次函数，经适当修正后，也可以达到相同的效果。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(128, 0, 128); ">共轭方向法的收敛速度</span>：比最速下降法快，比牛顿法慢。</span></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(255, 0, 0); ">【</span><font class="Apple-style-span" color="#0000FF">4</font><span style="color: rgb(255, 0, 0); ">】</span><span style="color: rgb(0, 0, 255); ">共轭梯度法</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#ff0000;">注意：下面那些长长的推导过程，其实是有部分错误的，当年我认为我弄懂了，其实到了某个推导步骤以后，我就理解错了，只不过我以为我对了，我即将在另一篇文章里写上我认为正确的推导，对不住大家了...</span><br />
	&ldquo;共轭梯度法&rdquo;是一种特殊的&ldquo;共轭方向法&rdquo;。既然叫共轭梯度法，它与梯度必然是有关系的。共轭方向法与梯度也有关系&mdash;&mdash;共轭方向法利用了目标函数的梯度信息（梯度与方向的积满足&ldquo;下降&rdquo;条件）。共轭梯度法与此关系有所区别：<span style="color:#006400;">用当前点的负梯度方向，与前面的搜索方向进行共轭化，以得到新的搜索方向</span>。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">具体来说，这个新的搜索方向是怎么计算出来的呢？推导起来比较麻烦，下面就慢慢道来。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">首先，需要说明<span style="color:#b22222;">共轭梯度法的一个理论基础（记为T1）</span>：<span style="color:#4b0082;">在迭代过程中，我们会从初始点开始，在搜索方向上通过<a href="http://www.codelast.com/?p=2348" target="_blank" rel="noopener noreferrer">精确线搜索</a>的方法，找到使目标函数值符合要求（例如，min f(X)）的步长，然后将点移动到下一点。这样不断进行下去，就会得到很多个点。在N维空间R<sup>n</sup>中，在每一个搜索方向上，都有无数个点，它们构成了一个轨迹（或者说一个集合），我们称之为<span style="color:#f00;"><a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">线性流形</a></span>&mdash;&mdash;拿二维空间（二维平面）作比喻，就好像是一个点在二维平面上的移动形成的轨迹：</span></span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><span style="color:#4b0082;"><img loading="lazy" decoding="async" alt="two-dimension track" height="228" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_21.png" width="278" /></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#4b0082;">只不过在高维空间中，我们想像不出这个轨迹的样子，不过这没关系，能引申上去就好了。</span></span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color:#4b0082;">当目标函数是二次函数时，在这个线性流形中，每一个我们迭代到的点都是极小值点。在某些书中，你可能还会看到一种说法，称此线性流形为N维超平面，也是一个意思，不过概念太多了会让人很晕，尤其是在没有掌握足够的背景的情况下，往往不能判断一个概念与另一个概念是不是同一个意思，这样就导致理解受到影响，因此，在刚开始学习的时候，我觉得努力弄懂一个概念就好了。</span></span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">这个理论基础在推导&ldquo;如何获取共轭梯度法的搜索方向&rdquo;的过程中会用到。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p style="display: inline !important; ">
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由于上面的理论基础是在目标函数为二次函数的情况下得到的，因此，在推导共轭梯度法的搜索方向的公式之前，我们先假定目标函数是二次函数：</span></span></p>
<p style="display: inline !important; ">
	&nbsp;</p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="quadratic function(x - multidimensional)" height="46" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_22.png" width="305" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">其中G为n阶对称正定矩阵。X为自变量（一个n维向量）。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">如果觉得这个X为n维向量的函数形式有点怪的话，那么还是对比一下X为1维（可以视为一个标量）的函数形式，就很清楚了：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="quadratic function(x - one dimension)" height="49" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_23.png" width="253" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在下面的推导过程中，如果你遇到看上去很&ldquo;别扭&rdquo;的式子，只要按照这样的规则来对比就行了。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由于共轭梯度法就是与梯度相关的方法，因此我们必须要求[2]式的函数的梯度（即一阶导数）：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="gradient of dest function" height="29" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_24.png" width="210" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">现在，假设初始点为X<sub>0</sub>，我们从X<sub>0</sub>出发，先推导出前几个搜索方向的计算方法，从而总结出若干规律，进而再得到通用的公式。下面我们就开始这样做。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">在每一个迭代点处，新的搜索方向都是用前面的搜索方向与当前点的负梯度方向共轭化得到的。在初始点处，并没有&ldquo;前面的搜索方向&rdquo;，因此，初始点处的搜索方向d<sub>0</sub>简单地定为负梯度方向：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="negative gradient direction" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_25.png" width="239" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">上面的式子中，将目标函数在X<sub>0</sub>点的梯度g(X<sub>0</sub>)写为g<sub>0</sub>，是为了表达简洁。同理，</span>g(X<sub>1</sub>)也记为g<sub>1</sub>，等等。</span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">第二个迭代到的点为X<sub>1</sub>，它与X<sub>0</sub>满足关系：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="X1" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_26.png" width="206" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">这表明，点X<sub>1</sub>是在d<sub>0</sub>方向上，由X<sub>0</sub>点移动一定的距离得到的。移动的步长&alpha;<sub>0</sub>，则是通过<a href="http://www.codelast.com/?p=2348" target="_blank" rel="noopener noreferrer">精确线搜索</a>的方法计算得到的，X<sub>1</sub>是一个极小值点，在点X<sub>1</sub>处，目标函数的一阶导数为零，即：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="first derivative" height="32" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_27.png" width="456" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">所以一阶导数再乘以d<sub>0</sub>仍然为零：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="the product of g1 &amp; d0" height="31" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_28.png" width="162" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">这个式子，在紧接着的推导中马上要用到。我发现从[7]到[8]我真的太废话了，好吧，我承认我很啰嗦&hellip;</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">既然第一个搜索方向d<sub>0</sub>毫无难度地取了负梯度方向，那么我们就来看看下一个搜索方向d<sub>1</sub>怎么获取。从共轭梯度法的定义（或者说是原则）&mdash;&mdash;新的搜索方向是用前面的搜索方向与当前点的负梯度方向共轭化得到的&mdash;&mdash;来看，d<sub>1</sub>与d<sub>0</sub>（前面的搜索方向）有关，也与-g<sub>1</sub>（当前点的负梯度方向）有关，因此，只需要假定d<sub>1</sub>是-g<sub>1</sub>与d<sub>0</sub>的线性组合即可：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="relationship of d1, -g1 &amp; d0" height="29" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_29.png" width="213" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">其中，r<sub>0</sub>是一个实数。此外，由于每一个搜索方向与前面的搜索方向都是共轭的，因此，d<sub>1</sub>与d<sub>0</sub>还要满足共轭条件：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="d1 &amp; d0 are conjugated" height="32" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_30.png" width="198" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">但是r<sub>0</sub>到底是什么值呢？只有知道了r<sub>0</sub>，我们才能算出d<sub>1</sub>，从而继续算出d<sub>2</sub>，d<sub>3</sub>，&hellip;&hellip;</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由上面的式[8]，可以联想到，是否在式[9]的左右两边分别乘以一些矩阵或向量，从而得到一个等式，以求出r<sub>0</sub>？对，就是在式[9]的两边均左乘d<sub>0</sub><sup>T</sup>G，可推出：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="value of r0" height="161" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_31.png" width="414" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">得到了r<sub>0</sub>，我们先记下它的形式，后面再使用。紧接着，来计算其他几个式子并由它们得到一些规律。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">首先是在同一点处，</span>搜索方向与梯度的点积d<sub>k</sub><sup>T</sup>g<sub>k</sub>：</span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="dot product of direction vector &amp; gradient vector" height="160" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_32.png" width="320" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">看出规律来了吗？d<sub>k</sub><sup>T</sup>g<sub>k</sub>=-g<sub>k</sub><sup>T</sup>g<sub>k</sub>？像这么回事。也就是说，在同一点处，搜索方向与梯度的点积等于负梯度与梯度的点积。所以我们估计d<sub>2</sub><sup>T</sup>g<sub>2</sub>，d<sub>3</sub><sup>T</sup>g<sub>3</sub>，&hellip;&hellip;都是符合这个规律的。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">其次是在某一点处的梯度与前面所有的梯度的点积</span>g<sub>m</sub><sup>T</sup>g<sub>n</sub>(m&gt;n)：</span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="dot product of different gradient vectors" height="62" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_33.png" width="407" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由前文所描述的共轭梯度法的理论基础T1，我们知道点X<sub>2</sub>，X<sub>3</sub>，&hellip;&hellip;均为极小值点，因此，在这些点处，目标函数的梯度为零，即g(X<sub>k</sub>)=0，所以有g<sub>2</sub><sup>T</sup>d<sub>0</sub>=0，g<sub>2</sub><sup>T</sup>d<sub>1</sub>=0，因此上面的[14]，[15]式均为零：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="dot product of different gradient vectors is zero" height="62" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_34.png" width="162" /></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">又看出一点规律没有？g<sub>m</sub><sup>T</sup>g<sub>n</sub>=0(m&gt;n)？像是这么回事。也就是说，在某一点处的梯度与前面所有梯度的点积为零。</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">由上面的特例的计算，我们可以总结出一些规律并用这些规律来得到通用的结论了。假设对所有的搜索方向和梯度，有如下规律：</span></span></p>
<div style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="summarized rules" height="165" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_35.png" width="216" /></span></div>
<div>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">再重复一遍以上四个式子的含义：同一点处的搜索方向与梯度的点积等于该点处的负梯度与梯度的点积，某一点处的梯度与前面所有搜索方向的点积为0，某一点处的梯度与前面所有梯度的点积为0，某一点处的搜索方向与前面所有搜索方向共轭。</span></span></div>
<p>
	<span style="font-family:微软雅黑;"><span style="color: rgb(255, 255, 255); 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></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">前面我们单独地求出了d<sub>0</sub>和d<sub>1</sub>，现在要来看方向d的通用的表达式怎么求了。可以设：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="general direction expression" height="57" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_36.png" style="cursor: default; " width="263" /></span></p>
<p>
	&nbsp;</p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">为什么可以这样表示方向d？乍一看，这个式子表示的含义是：<span style="color:#00f;">当前点的搜索方向是当前点的负梯度方向与前面所有方向的线性组合</span>&mdash;&mdash;似乎很有道理，但是有什么理论依据可以让我们这样假设呢？其实，<span style="color:#f00;">这是有线性代数理论支持的，但是这个证明涉及到更多的推导，所以这里就不扯过去了</span>。前文所述的方向d<sub>1</sub>，也是这样假设之后再求出来的。我就是这样记忆的：<span style="color:#00f;">当前点的搜索方向是当前点的负梯度方向与前面所有方向的线性组合</span>。我觉得这种感觉很直观，并且也符合我心中的设想，而且事实上它也是对的，初学者就这样记住就好了。<br />
	</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">[22]式不够直观，所以，我还是拿一个特例来演示：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="an example of the general direction expression" height="90" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_37.png" style="cursor: default; " width="438" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">这下够清晰了吧？</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">但是，如何求出[22]式中的每一个r<sub>i,m</sub>呢？我们会想到，式子的左边是一个方向向量，在共轭梯度法中，我们要保证某一点的搜索方向与前面所有搜索方向是G共轭的，因此，这提醒了我们，应该在[22]式两边均左乘一个式子，形成&ldquo;G共轭&rdquo;的表达式&mdash;&mdash;等式两边均左乘的式子就是d<sub>n</sub><sup>T</sup>G（n=0，1，&hellip;，m-1）：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="formula derivation of variable r" height="124" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_38.png" style="cursor: default; " width="336" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">我认为在共轭梯度法的推导中，最令人费解的就是这个式子。恕我愚笨，我看了4本最优化的书才搞懂，每一本书不是这里略过去了，就是那里略过去了，总有让人坐过山车的跨越感，但想明白之后的感觉终究是很舒坦的，我在这里就要把它彻底写明白了。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:微软雅黑;">首先要对一个概念非常清楚：在[24]式中，我们乘的d<sub>n</sub><sup>T</sup>G，不是说我们要乘n个式子，而是说，对[22]式来说，当m选定以后，那么n就唯一选定了。例如，当m=4时，[22]式就是用来求d<sub>4</sub>的，此时，我们乘的d<sub>n</sub><sup>T</sup>G就是d<sub>3</sub><sup>T</sup>G：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="an example of calculating variable r" height="204" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_39.png" style="cursor: default; " width="517" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">写得如此详细的一个例子，看懂了吗？从这个例子中，我们知道，对n所取的任何值，在[24]式的求和式&sum;中，除最后一项外，其余所有项的值均为0&mdash;&mdash;这是因为任何一个方向与前面所有方向都是G共轭的（参看G共轭的定义）。所以现在可以写出[24]式的结果了：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="" height="34" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_40.png" style="cursor: default; " width="328" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">其中，r的写法很不直观&mdash;&mdash;其实，对每一个方向d来说，[25]式中只含有一个r，不会像[24]式那样，由于有多个r，使得必须要用复杂的下标来区分，因此此处我们完全可以用r<sub>n</sub>来代替[25]式中那个怪怪的r的表达式：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:微软雅黑;"><img loading="lazy" decoding="async" alt="expression of r" height="185" src="http://www.codelast.com/wp-content/uploads/2011/05/methods_collection_41.png" style="cursor: default; " width="371" /></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">顺便将[27]式转换了一下，得到了[29]式，即 r 的计算方法&mdash;&mdash;这就是我们日夜思念的式子啊，终于揭开面纱了！</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">（<span style="color:#f00;">待补全</span>）</span></span></p>
<p>
	<span style="font-family:微软雅黑;"><span style="font-size:14px;">共轭梯度法同样会有这样的问题：经过n步迭代之后，产生的新方向不再有共轭性。所以在实际运用中，也有很多修正方向的策略。其中一种策略是：经过n步迭代之后，取负梯度方向作为新的方向。</span></span></p>
<p style="color: rgb(0, 0, 0); font-family: Simsun; font-size: medium; ">
	<span style="font-size:14px;"><span style="font-family:微软雅黑;"><span style="color: rgb(128, 0, 128); ">共轭梯度法的收敛性：</span>比最速下降法的收敛性要好得多。</span></span><br />
	<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%9b%e6%9c%80%e9%80%9f%e4%b8%8b%e9%99%8d%e6%b3%95%ef%bc%8c%e7%89%9b%e9%a1%bf%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%96%b9%e5%90%91%e6%b3%95%ef%bc%8c%e5%85%b1%e8%bd%ad%e6%a2%af%e5%ba%a6/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
			</item>
		<item>
		<title>[原创]选主元的高斯-约当（Gauss-Jordan）消元法解线性方程组/求逆矩阵</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%85%a8%e9%80%89%e4%b8%bb%e5%85%83%e7%9a%84%e9%ab%98%e6%96%af-%e7%ba%a6%e5%bd%93%ef%bc%88gauss-jordan%ef%bc%89%e6%b6%88%e5%85%83%e6%b3%95%e8%a7%a3%e7%ba%bf%e6%80%a7%e6%96%b9/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%85%a8%e9%80%89%e4%b8%bb%e5%85%83%e7%9a%84%e9%ab%98%e6%96%af-%e7%ba%a6%e5%bd%93%ef%bc%88gauss-jordan%ef%bc%89%e6%b6%88%e5%85%83%e6%b3%95%e8%a7%a3%e7%ba%bf%e6%80%a7%e6%96%b9/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Sun, 13 Mar 2011 14:39:15 +0000</pubDate>
				<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[Gauss-Jordan]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[最优化]]></category>
		<category><![CDATA[消元]]></category>
		<category><![CDATA[线性方程组]]></category>
		<category><![CDATA[选主元]]></category>
		<category><![CDATA[高斯-约当]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=1288</guid>

					<description><![CDATA[<p>
	&#160;</p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">选主元的高斯-约当（Gauss-Jordan）消元法在很多地方都会用到，例如求一个矩阵的逆矩阵、解线性方程组（插一句：<a href="http://www.codelast.com/?p=29" target="_blank" rel="noopener noreferrer">LM算法</a>求解的一个步骤），等等。它的速度不是最快的，但是它非常<span style="color:#f00;">稳定</span>（<span style="color:#008000;">来自网上的定义：一个计算方法，如果在使用此方法的计算过程中，舍入误差得到控制，对计算结果影响较小，称此方法为数值稳定的</span></span>）<span style="font-family:arial,helvetica,sans-serif;">，同时它的求解过程也比较清晰明了，因而人们使用较多。下面我就用一个例子来告诉你Gauss-Jordan法的求解过程吧。顺便再提及一些注意事项以及扩展话题。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">对本文中所提到的&#8220;主元&#8221;等概念的解释，可以参考<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">此链接</a>。</span></span></p>
<p>
<span id="more-1288"></span>	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">假设有如下的方程组：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:arial,helvetica,sans-serif;"><img loading="lazy" decoding="async" alt="equation set" height="141" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_1.png" style="cursor: default; " width="262" /> </span></p>
<p>
	写成矩阵形式就是：AX=B，其中：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Matrix A &#38; B" height="164" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_2.png" style="cursor: default; " width="339" /></p>
<p>
	<font class="Apple-style-span" face="arial, helvetica, sans-serif">且X=(X<sub>1</sub>, X<sub>2</sub>, X<sub>3</sub>)<sup>T</sup>。</font></p>
<p>
	<span style="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>
	<font class="Apple-style-span" face="arial, helvetica, sans-serif">现对矩阵A作</font><a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">初等变换</a><font class="Apple-style-span" face="arial, helvetica, sans-serif">，同时矩阵B也作同样的</font>初等变换，则当A化为单位矩阵的时候，有：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="AX=B" height="124" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_12.png" style="cursor: default; " width="224" /></p>
<p>
	显而易见，我们得到了方程组的解X=(1, 2, 4)<sup>T</sup>。</p>
<p>
	所以，我们要以一定的策略，对A和B施以一系列的<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">初等变换</a>，当A化为单位矩阵的时候，B就为方程组的解。</p>
<p>
	选主元的G-J消元法通过这样的方法来进行初等变换：在每一个循环过程中，先寻找到主元，并将主元通过行变换（无需列变换）移动到矩阵的主对角线上，然后将主元所在的行内的所有元素除以主元，使得主元化为1；然后观察主元所在的列上的其他元素，将它们所在的行减去主元所在的行乘以一定的倍数，使得主元所在的列内、除主元外的其他元素化为0，这样就使得主元所在的列化为了单位矩阵的形式。这就是一个循环内做的工作。然后，在第二轮循环的过程中，不考虑上一轮计算过程中主元所在的行和列内的元素，在剩下的矩阵范围内寻找主元，然后（如果其不在主对角线上的话）将其移动到主对角线上，并再次进行列的处理，将列化为单位矩阵的形式。余下的步骤依此类推。具体的计算过程的一个例子，请看下面我举的求逆矩阵的过程。</p>
<p>
	<span style="font-family: arial, helvetica, sans-serif; ">如果要解系数矩阵相同、右端向量不同的N个方程组，在设计</span>程序<span style="font-family: arial, helvetica, sans-serif; ">的时候，没有必要&#8221;解N次方程组&#8220;，我们完全可以在程序中，将所有的右端向量以矩阵的数据结构（类似于二维数组）来表示，在系数矩阵作行变换的时候，矩阵里的每一个</span>右端向量也做同样的变换，这样，我们在一次求解运算的过程中，实际上就是同时在解N个方程组了，这是要注意的地方。</p>
<p>
	<span style="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%9b%e5%85%a8%e9%80%89%e4%b8%bb%e5%85%83%e7%9a%84%e9%ab%98%e6%96%af-%e7%ba%a6%e5%bd%93%ef%bc%88gauss-jordan%ef%bc%89%e6%b6%88%e5%85%83%e6%b3%95%e8%a7%a3%e7%ba%bf%e6%80%a7%e6%96%b9/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
	&nbsp;</p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">选主元的高斯-约当（Gauss-Jordan）消元法在很多地方都会用到，例如求一个矩阵的逆矩阵、解线性方程组（插一句：<a href="http://www.codelast.com/?p=29" target="_blank" rel="noopener noreferrer">LM算法</a>求解的一个步骤），等等。它的速度不是最快的，但是它非常<span style="color:#f00;">稳定</span>（<span style="color:#008000;">来自网上的定义：一个计算方法，如果在使用此方法的计算过程中，舍入误差得到控制，对计算结果影响较小，称此方法为数值稳定的</span></span>）<span style="font-family:arial,helvetica,sans-serif;">，同时它的求解过程也比较清晰明了，因而人们使用较多。下面我就用一个例子来告诉你Gauss-Jordan法的求解过程吧。顺便再提及一些注意事项以及扩展话题。</span></span></p>
<p>
	<span style="font-size:14px;"><span style="font-family:arial,helvetica,sans-serif;">对本文中所提到的&ldquo;主元&rdquo;等概念的解释，可以参考<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">此链接</a>。</span></span></p>
<p>
<span id="more-1288"></span>	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">假设有如下的方程组：</span></span></p>
<p style="text-align: center; ">
	<span style="font-family:arial,helvetica,sans-serif;"><img loading="lazy" decoding="async" alt="equation set" height="141" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_1.png" style="cursor: default; " width="262" /> </span></p>
<p>
	写成矩阵形式就是：AX=B，其中：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Matrix A &amp; B" height="164" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_2.png" style="cursor: default; " width="339" /></p>
<p>
	<font class="Apple-style-span" face="arial, helvetica, sans-serif">且X=(X<sub>1</sub>, X<sub>2</sub>, X<sub>3</sub>)<sup>T</sup>。</font></p>
<p>
	<span style="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>
	<font class="Apple-style-span" face="arial, helvetica, sans-serif">现对矩阵A作</font><a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">初等变换</a><font class="Apple-style-span" face="arial, helvetica, sans-serif">，同时矩阵B也作同样的</font>初等变换，则当A化为单位矩阵的时候，有：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="AX=B" height="124" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_12.png" style="cursor: default; " width="224" /></p>
<p>
	显而易见，我们得到了方程组的解X=(1, 2, 4)<sup>T</sup>。</p>
<p>
	所以，我们要以一定的策略，对A和B施以一系列的<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">初等变换</a>，当A化为单位矩阵的时候，B就为方程组的解。</p>
<p>
	选主元的G-J消元法通过这样的方法来进行初等变换：在每一个循环过程中，先寻找到主元，并将主元通过行变换（无需列变换）移动到矩阵的主对角线上，然后将主元所在的行内的所有元素除以主元，使得主元化为1；然后观察主元所在的列上的其他元素，将它们所在的行减去主元所在的行乘以一定的倍数，使得主元所在的列内、除主元外的其他元素化为0，这样就使得主元所在的列化为了单位矩阵的形式。这就是一个循环内做的工作。然后，在第二轮循环的过程中，不考虑上一轮计算过程中主元所在的行和列内的元素，在剩下的矩阵范围内寻找主元，然后（如果其不在主对角线上的话）将其移动到主对角线上，并再次进行列的处理，将列化为单位矩阵的形式。余下的步骤依此类推。具体的计算过程的一个例子，请看下面我举的求逆矩阵的过程。</p>
<p>
	<span style="font-family: arial, helvetica, sans-serif; ">如果要解系数矩阵相同、右端向量不同的N个方程组，在设计</span>程序<span style="font-family: arial, helvetica, sans-serif; ">的时候，没有必要&rdquo;解N次方程组&ldquo;，我们完全可以在程序中，将所有的右端向量以矩阵的数据结构（类似于二维数组）来表示，在系数矩阵作行变换的时候，矩阵里的每一个</span>右端向量也做同样的变换，这样，我们在一次求解运算的过程中，实际上就是同时在解N个方程组了，这是要注意的地方。</p>
<p>
	<span style="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>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">那么，G-J法为什么可以用来求逆矩阵？</span></span></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">假设<span style="color:#00f;">AX=E</span>，其中，A为n阶系数矩阵</span>（与上面的解线性方程组对照）<span style="font-size:14px;">；E为单位矩阵，即E=(</span>e<sub>1</sub>,e<sub>2</sub>,&hellip;,e<sub>n</sub>)，其中e<sub>i&nbsp;</sub>(i=1,2,&hellip;,n) 为单位列向量；X为n个列向量构成的矩阵，即X=(x<sub>1</sub>,x<sub>2</sub>,&hellip;,x<sub>n</sub>)，其中x<sub>i&nbsp;</sub>(i=1,2,&hellip;,n) 为列向量。于是，可以把等式AX=E看成是求解n个线性方程组Ax<sub>i</sub>=e<sub>i</sub>&nbsp;(i=1,2,&hellip;,n)，求出了所有的x<sub>i</sub>之后，也即得到了矩阵X。而由AX=E可知，矩阵X是A的逆矩阵，即X=A<sup>-1</sup>。这样，就求出了A的逆矩阵了。于是，求逆矩阵的过程被化成了解线性方程组的过程，因此我们可以用Gauss-Jordan消元法来求逆矩阵。</span></p>
<p>
	求逆矩阵时，系数矩阵A和单位矩阵E可以共用一块存储区，在每一次约化过程中，系数矩阵逐渐被其逆矩阵替代。</p>
<p>
	&nbsp;</p>
<p>
	在这里，我用一个实际的例子来说明G-J法求逆矩阵的过程：</p>
<p>
	有如下的方程组：</p>
<p style="text-align: center; ">
	<font class="Apple-style-span" face="arial, helvetica, sans-serif"><img loading="lazy" decoding="async" alt="equation set" height="141" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_1.png" width="262" /><br />
	</font></p>
<p>
	显而易见，该方程组对应的系数矩阵A和右端向量矩阵B（此处只有一个右端向量）分别为：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Matrix A &amp; B" height="164" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_2.png" width="339" /></p>
<p>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">其实在求逆矩阵的过程中，矩阵B无关紧要，可以忽略，不过此处还是把它写出来了。下面，把单位矩阵E附在A的右边，构成另一个矩阵（A|E）：</span></span></p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="(A|E)" height="137" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_3.png" width="339" /></p>
<p>
	<span style="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>
	<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">下面，我们就通过矩阵的<a href="http://www.codelast.com/?page_id=963" target="_blank" rel="noopener noreferrer">初等变换</a>，将A化为单位矩阵E，而E则化为了A的逆矩阵。以下是转化步骤：</span></span></p>
<ul>
<li>
		<span style="font-family:arial,helvetica,sans-serif;"><span style="font-size:14px;">【Step 01】主元选为3，所以将Row1（第一行）与Row2（第二行）交换：</span></span></li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Setp 01" height="154" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_5.png" width="297" /></p>
<ul>
<li>
		【Step 02】主元所在行的所有元素除以主元：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 02" height="170" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_6.png" width="201" /></p>
<ul>
<li>
		【Step 03】Row1 - Row2，Row3 - 2 &times; Row2：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 03" height="189" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_7.png" width="239" /></p>
<p>
	现在，原来的矩阵A有一列被化为了单位阵的形式。</p>
<ul>
<li>
		【Step 04】重新选主元，这一次主元选为5/3，于是Row1 &divide; 5/3（主元所在行的所有元素除以主元）：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 04" height="188" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_8.png" width="245" /></p>
<ul>
<li>
		【Step 05】Row2 - (1/3) &times; Row1，Row3 - (4/3) &times; Row1：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 05" height="188" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_9.png" width="270" /></p>
<p>
	现在，原来的矩阵A又有一列被化为了单位阵的形式。</p>
<ul>
<li>
		【Step 06】重新选主元，这一次主元选为-1/5，于是Row3 &divide; (-1/5)（主元所在行的所有元素除以主元）：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 06" height="188" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_10.png" width="263" /></p>
<ul>
<li>
		【Step 07】Row1 - (2/5) &times; Row3，Row2 - (1/5) &times; Row3：</li>
</ul>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Step 07" height="123" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_11.png" width="272" /></p>
<p>
	现在，原来的矩阵A的所有列都被化为了单位阵的形式。</p>
<p>
	<font class="Apple-style-span" face="arial, helvetica, sans-serif">可见，以上过程非常适合于计算机编程求解。</font></p>
<p>
	<span style="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>
	至此，我们完成了从A到E的转换，这个过程中使用了选主元的方法，但没有使用列交换。于是，原来的单位矩阵E就变成了A<sup>-1</sup>，即：</p>
<p style="text-align: center; ">
	<img loading="lazy" decoding="async" alt="Inverse Matrix of A" height="155" src="http://www.codelast.com/wp-content/uploads/2011/03/G-J_Inverse_Matrix_4.png" width="306" /></p>
<p>
	有人说，在进行转化的过程中，如果某一步发现选中的主元为0，怎么办？当然，这种情况就进行不下去了（矩阵是奇异的）。<br />
	<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%9b%e5%85%a8%e9%80%89%e4%b8%bb%e5%85%83%e7%9a%84%e9%ab%98%e6%96%af-%e7%ba%a6%e5%bd%93%ef%bc%88gauss-jordan%ef%bc%89%e6%b6%88%e5%85%83%e6%b3%95%e8%a7%a3%e7%ba%bf%e6%80%a7%e6%96%b9/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
	</channel>
</rss>
