机器学习(吴恩达)-2 解决回归问题最常用函数:平方误差代价函数——学习笔记

我们通过一个预测房价的例子,来给出解决回归问题的一种常用算法函数:平方误差代价函数。(回归问题属于监督学习)

预测房价的例子如下:

已有大量的已知数据(房子大小,房价),将房子大小作为x轴数据,对应的房价作为y轴数据,根据这些数据,来推测出某一房子大小所对应的房价可能是多少?

 

部分数据示例:

Training set of housing prices
Size of feet^2(x) Prices in 1000's(y)
500 112
523 78
545 185
566 167
... ...

Notation:

m:number of training examples(训练样本的数量)

x's: "input" variables

y's: "output" variables

(x,y): one training example(一个训练样本)

\small (x^{(i)},y^{(i)}): i^th training example(第i个训练样本,如第一个训练样本:\small x^{(1)}=500, \small y^{(1)}=112) 

 


1. 如何通过已给出的大量数据来推测出某房子大小对应的房价?

通过已给出的训练集(即大量已知数据),加上一个学习算法,从而(?)给出一个假设函数h,而房子大小x作为输入数据,通过假设函数给出输出结果y(房价预测值)。

 


2. 如何给出假设函数h?

根据本次例子的房价预测,我们可以把假设函数定成一个简单的线性函数。那么可以给出函数公式:

 

                                                                h(x)=\Theta_0+\Theta_1x

                                                                \Theta_0\Theta_1:模型参数

而随着参数的不同,函数h的预测曲线与训练集的拟合程度不同。目标是尽可能使函数曲线更贴合真实数据,即使得\small h(x)-y的值尽可能小。

因此,为了更准确的表达假设函数与真实数据的差距,我们用函数\small J(\Theta_0,\Theta_1)来表示其误差,函数\small J(\Theta_0,\Theta_1)称为代价函数(也称为平方误差函数或平方误差代价函数)。

                                                    \small J(\Theta_0,\Theta_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})^2

其中\small (h_\Theta(x^{(i)})-y^{(i)})^2是函数值与真实数据值的平方误差和。

注意:也有其他的代价函数,但平方误差代价函数可能是解决回归问题最常用的手段。

那么接下来的目的就是求出最贴合真实数据的预测曲线,即求出最合适的参数\small \Theta_0\small \Theta_1,而通过求得代价函数\small J(\Theta_0,\Theta_1)的值,可以得到合适的数\small \Theta_0\small \Theta_1使\small J(\Theta_0,\Theta_1)值最小。

 


3. 如何分析代价函数J?

首先梳理下我们所用到的函数:

假设函数:

h(x)=\Theta_0+\Theta_1x

参数:

 \Theta_0\Theta_1

代价函数:

\small J(\Theta_0,\Theta_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})^2
目标:求出\small J(\Theta_0,\Theta_1)最小值,从而得到对应的\small \Theta_0\small \Theta_1参数值。

 

可知随着\small \Theta参数值的不同,代价函数\small J(\Theta_0,\Theta_1)会取不同值。为了方便观察,我们首先将假设函数\small h(x)简化为只含一个参数\small \Theta\small h_\Theta(x)=\Theta x

并给出一个简单的训练集:包含已知数据(1,1),(2,2),(3,3),如图:

我们将\small \Theta取不同值,可以得出不同的代价函数值:

\small \Theta=1,\small J(\Theta)=0;\small \Theta=0.5,\small J(\Theta)=0.58;\small \Theta=0,\small J(\Theta)=2.3 等等..

根据\small \Theta值与对应的代价函数值,我们可以画出两者之间的关系曲线:

                                                    横座标为参数\small \Theta,纵座标为代价函数\small J(\Theta)

从图中可以得到,当\small \Theta=1时,代价函数\small J(\Theta)为最小值=0,此时假设函数的曲线完全贴合训练集的数据。

 

那么当假设函数有两个参数\small \Theta_0\small \Theta_1时,我们可以得到代价函数的曲线图及相应的等高线如下图所示:

那么现在已知只要找到代价函数的最低点(最小值),就能得到相应的参数\small \Theta值,从而找到最适合的假设函数。

 


4. 如何实现找到代价函数最小值?

这里要使用梯度下降算法(Gradient descent algorithm)。

梯度下降算法:以某点为起始,选择下一步要走的点,使得下一步为当前点可最快到达最低处的点,不停地循环此步骤,直到到达局部最小值。

 

用梯度下降算法最小化任何函数\small J(\Theta_0,\Theta_1):

已知:代价函数\small J(\Theta_0,\Theta_1)

目标:\small minJ(\Theta_0,\Theta_1)(求得代价函数最小值)

要做:(1)从某一值开始;

           (2)不停地改变\small \Theta值,来使\small J(\Theta_0,\Theta_1)变小,直到找到\small J(\Theta_0,\Theta_1)的最小值(或局部最小值)

注意:之所以说是局部最小值而非全局最小值,是因为代价函数的曲线图有可能有多个局部最低点,在这种情况下,设定不同的初始theta值,有可能会到达不同的局部最低点。

 

梯度下降算法的具体实现:

Gradient descent algorithm:

        repeat until cenvergence{

                \small \Theta_j:=\Theta_j-\alpha \frac{\partial }{\partial \Theta_j}J(\Theta_0,\Theta_1)\:\:\:\:(for\:j=0\:and\:j=1)

        }

(1)\small \Theta_j表示所有的参数,在本例中参数有两个\small \Theta_0\small \Theta_1,更新参数值时要同时更新\small \Theta_0\small \Theta_1的值,同时更新的意思是两个赋值语句中间不能有任何其他的会改变参数值的赋值语句。

(2)\alpha表示learning rate(学习率),表示每次更新参数值时所更新值的幅度的大小。若\alpha过小,则从初始参数值到代价函数局部最低点所属的参数值要经过非常多次更新;而如果\alpha过大,则会有可能使参数值在更新时直接跨过局部最低点,导致算法无法收敛甚至发散。

 

将代价函数\small J(\Theta_0,\Theta_1)代入\small \frac{\partial }{\partial \Theta_j}J(\Theta_0,\Theta_1)中, 可以得到:

                                            \small \frac{\partial }{\partial \Theta_j}J(\Theta_0,\Theta_1)=\frac{\partial }{\partial \Theta_j}\cdot \frac{1}{2m}\sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})^2

根据对两个参数theta0、theta1分别求J的偏导,我们可以得到:

                                          \small \Theta_0(j=0):\frac{\partial }{\partial \Theta_0}J(\Theta_0,\Theta_1)=\frac{1}{m}\cdot \sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})\cdot 1

                                          \small \Theta_1(j=1):\frac{\partial }{\partial \Theta_1}J(\Theta_0,\Theta_1)=\frac{1}{m}\cdot \sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})\cdot x^{(i)}

因此,将梯度下降算法具体到本次例子中,算法可以写成:

Gradient descent algorithm:

        repeat until cenvergence{

                \small \Theta_0(j=0):\frac{\partial }{\partial \Theta_0}J(\Theta_0,\Theta_1)=\frac{1}{m}\cdot \sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})\cdot 1

                \small \Theta_1(j=1):\frac{\partial }{\partial \Theta_1}J(\Theta_0,\Theta_1)=\frac{1}{m}\cdot \sum_{i=1}^{m}(h_\Theta(x^{(i)})-y^{(i)})\cdot x^{(i)}

        }

 

在本例子中,因为线型回归的代价函数总是一个弓状函数(术语叫凸函数,即只有一个最低点),因此不存在局部最优解,只有一个全局最优。

 

ps:在绘制代价函数图时,发现这个凸函数并没有像课程视频中一样是个很标准的弓状函数,目前推测原因是因为选取的假设函数过于简单,只含有一个特征x,因此对于数据集来说可以有一系列对应的\small \Theta_0\small \Theta_1来符合数据,所以\small \Theta_0\small \Theta_1的取值较为宽泛,也就形成不了一个最优解。(仅推测)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章