斯坦福机器学习实现与分析之二(线性回归)

回归问题提出



  首先需要明确回归问题的根本目的在于预测。对于某个问题,一般我们不可能测量出每一种情况(工作量太大),故多是测量一组数据,基于此数据去预测其他未测量数据。

  比如课程给出的房屋面积、房间数与价格的对应关系,如下表:

  若要测量出所有情况,不知得测到猴年马月了。有了上面这一组测量数据,我们要估计出一套房子(如2800平方英尺5个房间)的价格,此时回归算法就可以荣耀登场了。

回归算法推导



  有了上面这个问题,如何来估计房子的价格呢?首先需要建立模型,一种最简单的模型就是线性模型了,写成函数就是:

\( h_\theta(x_1,x_2)={\theta_0}+{\theta_1}{x_1}+{\theta_2}{x_2} \)

  其中\(x_1\)是房子面积,\(x_2\)是房间数,\(h\)是对应的房子面积,\(\theta_j\)就是我们需要求的系数。

  对于每个具体问题,需要根据测量数据的情况来确定是否为线性。这里假设为线性模型会限制适用范围,如果房屋面积与价格不是线性关系,则此模型估计的房子价格可能会偏差很大。因此实际上这里也可以假设为其他关系(如指数、对数等),那么估计结果可能就极度不准确了,当然那也就不是线性回归,这里就不必讨论。

  上面公式写成向量形式,则为

\( h_\theta(x)=\sum_{i=0}^n{\theta_i{x_i}}=\theta^T{x} \)

  其中

\(\theta=(\theta_0, \theta_1,..., \theta_n)^T\)

\( x=(1,x_1, ... ,x_n)^T \)

  那么上面的测量数据可以表示为\( (x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}),..., (x^{(m)},y^{(m)}) \),其中的y为测量的房屋面积。这样如何根据这m个测量数据来求解参数\(\theta \)就是我们需要解决的问题了。

  我们可以通过保证此组测量的预测误差最小来约束求解。代价函数为

\(J(\theta)={\frac{1}{2}}\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2}\)

  该代价函数表达的是测量数据的均方误差和。通过最小化该代价函数,即可估计出参数\( \theta \)。前面那个1/2并没有实质意义,主要为了后面求导方便加的;实际上为1/m更具有绝对意义。

回归算法求解



  如何求解上述问题?主要有梯度下降法,牛顿迭代法,最小二乘法。这里主要讲梯度下降法,因为该方法在后面使用较多,如神经网络、增强学习等求解都是使用梯度下降。

  函数在沿着其梯度方向增加最快的,那么要找到该函数的最小值,可以沿着梯度的反方向来迭代寻找。也就是说,给定一个初始位置后,寻找当前位置函数减小最快的方向,加上一定步长即可到达下一位置,然后再寻找下一位置最快的方向来到达再下一个位置……,直至其收敛。上述过程用公式表达出来即如下所示:

\( \theta_j = \theta_j - \alpha{\frac{\partial}{\partial{\theta_j}}}{J(\theta)}\)

  根据上述表达式,可以求得代价函数的偏导数为:

\( {\frac{\partial}{\partial{\theta_j}}}{J(\theta)} = \sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)}) {\frac{\partial}{\partial{\theta_j}}}{h_\theta(x^{(i)})}} = \sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}} \)

  这样,迭代规则为

\( \theta_j = \theta_j - \alpha\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}}\quad (j=1,2,...,n)\)

  这个公式即是所谓的批量梯度下降。仔细观察该公式,每次迭代都需要把m个样本全部计算一遍,如果m很大时,其迭代将非常慢,因此一种每次迭代只计算1个样本的随机梯度下降(或增量梯度下降)可以极大减少运算量,其迭代如下:

\( \theta_j = \theta_j - \alpha {(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}}\quad (i=1,2,...,n \quad j=1,2,...,n)\)

  若所有样本迭代完成后还未收敛,则继续从第1个样本开始迭代。

算法实现与结果



  首先使用下面代码生成一组数据,为了后续显示方便,数据为一条直线上叠加一定噪声:  

1         N = 100;
2         x = rand(N, 1) * 10;
3         y = 5 * x + 10 + 5 * randn(N, 1);
4         Sample = [x y];
5         save(‘data.mat‘, ‘Sample‘)
6         figure,plot(x, y, ‘o‘);

  数据显示出来如下图:

  线性回归函数使用梯度下降求解:

 1 %返回值Theta为回归结果
 2 %IterInfo为迭代的中间过程信息,用于调试,查看
 3 %Sample为训练样本,每一行为一个样本,每个样本最后一个为Label值
 4 %BatchSize为每次批量迭代的样本数
 5 function [Theta, IterInfo]=LinearRegression(Sample, BatchSize)
 6     [m, n] = size(Sample); %m个样本,每个n维
 7     Y = Sample(:, end); %label
 8     X = [Sample(:,1:end-1), ones(m,1)]‘;%x加入常数项1,并转换为每列表示1个样本
 9
10     BatchSize = min(m, BatchSize);
11     Theta = zeros(n, 1);
12     Theta0= Theta;
13     Alpha = 1e-2 * ones(n, 1);
14     StartID = 1;
15
16     IterInfo.Grad = [];
17     IterInfo.Theta = [Theta];
18
19     %梯度下降,迭代求解
20     MaxIterTime = 5000;
21     for i = 1:MaxIterTime
22         EndID = StartID + BatchSize;
23         if(EndID > m)
24             TX = [X(:, StartID:m) X(:, 1:EndID-m)];
25             TY = [Y(StartID:m); Y(1:EndID-m)];
26         else
27             TX = X(:, StartID:EndID);
28             TY = Y(StartID:EndID);
29         end
30
31         Grad = CalcGrad(TX, TY, Theta);
32         Theta = Theta + Alpha .* Grad;
33
34         %记录中间结果
35         IterInfo.Grad = [IterInfo.Grad Grad];
36         IterInfo.Theta = [IterInfo.Theta Theta];
37
38         %迭代收敛检验
39         Delta = Theta - Theta0;
40         if(Delta‘ * Delta < 1e-10)
41             break;
42         end
43
44         Theta0 = Theta;
45         StartID = EndID + 1;
46         StartID = mod(StartID, m) + 1;
47     end
48
49     IterInfo.Time = i;
50 end
51
52 %梯度计算
53 function Grad = CalcGrad(X, Y, Theta)
54     D = 0;
55     for i = 1:size(X,2)
56         G = (Y(i) - Theta‘ * X(:,i)) * X(:,i);
57         D = D + G;
58     end
59     Grad = D / size(X,2);
60 end

  测试函数:

 1     %回归
 2     load(‘data.mat‘);
 3
 4     BatchSize = 100;
 5     [Theta, IterInfo] = LinearRegression(Sample, BatchSize)
 6
 7     %显示结果,以下代码不通用,样本维数增加时显示不可用
 8     figure,plot(Sample(:,1), Sample(:,2), ‘o‘);
 9     t = 0:0.1:10;
10     z = Theta(1) * t + Theta(2);
11     hold on, plot(t, z, ‘r‘)
12
13     for i = 1:size(IterInfo.Theta,2)
14         err(i) = Error(Sample, IterInfo.Theta(:,i));
15     end
16     figure,plot(log(err),‘b‘);pause(.1)
17
18     [t1,t2]=meshgrid(0:0.1:20);
19     for i = 1:size(t1,1)
20         for j = 1:size(t1,2)
21             E(i,j) = Error(Sample, [t1(i,j); t2(i,j)]);
22         end
23     end
24     figure,mesh(t1, t2, E);hold on
25     [R,C]=find(E==min(min(E)));
26     plot3(t1(R,C), t2(R,C), min(min(E)), ‘rs‘,‘MarkerEdgeColor‘,‘b‘,...
27                 ‘MarkerFaceColor‘,‘r‘,...
28                 ‘MarkerSize‘,15);hold on
29
30     t1 = IterInfo.Theta(1,:);
31     t2 = IterInfo.Theta(2,:);
32     for i = 1:size(IterInfo.Theta,2)
33         ItErr(i)=Error(Sample, IterInfo.Theta(:,i));
34     end
35     plot3(t1,t2,ItErr,‘--rs‘,‘LineWidth‘,1,...
36                 ‘MarkerEdgeColor‘,‘k‘,...
37                 ‘MarkerFaceColor‘,‘g‘,...
38                 ‘MarkerSize‘,10);hold on

  实际上上述代码中真正涉及算法求解的不多,其他都是保存中间结果和绘图等用于调试分析的。回归结果如图,蓝色点为上面保存的数据,红色直线是回归拟合的直线:

  其中每次迭代后,代价函数J的变化则如下图(考虑其范围过大,绘制的是其对数图):

  可以看出,当迭代超过1000次时,代价函数已经基本不变了。梯度下降迭代过程如下左图,xy坐标分别为\(\theta_0和\theta_1\),z轴为对应\(\theta\)的代价函数值,图中心的红色小块是真实的最优值,绿色方块是每次迭代的位置,可以看到迭代过程是不断靠近最优解。由于图中绿色方块重叠过多导致绘图出来中间部分显示为黑色了,右图为局部放大的结果。

      

算法分析



  1. 梯度下降法中,BatchSize为一次迭代使用的样本数量,当其为m时,即为批量梯度下降,为1时即是随机梯度下降。实验效果显示,BatchSize越大,迭代越耗时,但其收敛越稳定;反之,则迭代越快,而易产生振荡现象;具体可修改测试代码中的BatchSize来看实验结果。

  2. 关于步长的选择。在梯度下降法中,步长的影响是非常大的,步长过小会导致收敛非常慢,过大则容易导致不收敛。上述程序中的步长是经过若干次运行修改的,换一组其他数据可能不收敛,这是该程序存在的问题,待回归算法完结后将专门来一篇分析该问题,并给出解决方法。

时间: 2024-11-06 03:48:16

斯坦福机器学习实现与分析之二(线性回归)的相关文章

斯坦福机器学习实现与分析之一(前言)

自去年底开始学习Andrew Ng的机器学习公开课,欲依其课件试着实现部分算法以加深理解,然在此过程中遇到部分问题,或为程序实现,或为算法理解.故而准备将此课程整理,并记录自己的理解,或对或错可共同讨论. 此课程主要包括三部分:监督学习算法.无监督学习算法以及学习理论.监督学习部分讲了回归.生成学习算法与SVM:无监督学习则讲了K-means,MOG,EM,PCA,ICA以及增强学习等算法:学习理论则是讲解算法的评估,模型与特征的选择等方法.此处课程整理的顺序将与原讲义相同. 另外,考虑此处主要

斯坦福机器学习实现与分析之四(广义线性模型)

指数分布族 首先需要提及下指数分布族,它是指一系列的分布,只要其概率密度函数可以写成下面这样的形式: \(\begin{aligned} p(y;\eta)=b(y)exp(\eta^TT(y)-a(\eta))\end{aligned}\) 一般的很多分布(如高斯分布,泊松分布,二项式分布,伽马分布等)都属于指数分布族.该分布族有很多良好的特性,参见<Generalized Linear Models (2nd ed.)>一书3.3节. 广义线性模型构建假设 广义线性模型主要基于以下假设:

斯坦福机器学习实现与分析之六(朴素贝叶斯)

朴素贝叶斯(Naive Bayes)适用于离散特征的分类问题,对于连续问题则需将特征离散化后使用.朴素贝叶斯有多元伯努利事件模型和多项式事件模型,在伯努利事件模型中,特征每一维的值只能是0或1,而多项式模型中特征每一维的值可取0到N之间的整数,因此伯努利模型是多项式模型的一种特例,下面的推导就直接使用伯努利模型. 朴素贝叶斯原理推导 与GDA类似,朴素贝叶斯对一个测试样本分类时,通过比较p(y=0|x)和p(y=1|x)来进行决策.根据贝叶斯公式: \( \begin{aligned} p(y=

斯坦福机器学习

---title: 斯坦福机器学习-线性回归photos: - http://7xrw7v.com1.z0.glb.clouddn.com/bb2cf32cadac65e934ab587c5f456329.pngtags: - 斯坦福机器学习date: 2016-09-05 16:34:34--- 摘要: - 单变量线性回归- 代价函数- 梯 度 下 降- 学习率- 多 变 量 线 性 回 归- 特 征 缩 放- 多 项 式 回 归- 正 规 方 程 <!--more--> 不积跬步,无以至千

cs229 斯坦福机器学习笔记(一)

前言 说到机器学习,很多人推荐的学习资料就是斯坦福Andrew Ng的cs229,有相关的视频和讲义.不过好的资料 != 好入门的资料,Andrew Ng在coursera有另外一个机器学习课程,更适合入门.课程有video,review questions和programing exercises,视频虽然没有中文字幕,不过看演示的讲义还是很好理解的(如果当初大学里的课有这么好,我也不至于毕业后成为文盲..).最重要的就是里面的programing exercises,得理解透才完成得来的,毕

斯坦福机器学习课程汇总

斯坦福机器学习课程汇总 前言 首先感谢吴恩达建立Coursera这样一个优秀的在线学习平台,以及他发布在这个平台上的机器学习课程. 这门课程将整个机器学习领域的基础知识,用浅显易懂的方式,深入浅出的进行了介绍.使得一个拥有高中数学知识的学生也能听得明白. 如果你想要涉足机器学习.人工智能领域,或者对这一领域有浓厚的兴趣想要深入了解,那么你会发现很多机器学习入门课程推荐的资料中,都有吴恩达老师的这一系列课程.甚至在大多数资料中,都把这门课放在了首选的位置上. 因此,我把吴恩达老师的课程整理成了Ma

机器学习 1 linear regression 作业(二)

机器学习 1 linear regression 作业(二) 这个线性回归的作业需要上传到https://inclass.kaggle.com/c/ml2016-pm2-5-prediction 上面,这是一个kaggle比赛的网站.第一次接触听说这个东西,恰好在京东上有一本刚出来的关于这个的书<Python机器学习及实践:从零开始通往Kaggle竞赛之路>.把我自己写的代码运行保存的结果提交上去后发现,损失函数值很大,baseline是6,而我的却是8,于是很不心甘,尝试了其他方法无果后,准

七月算法--12月机器学习在线班-第十二次课笔记—支持向量机(SVM)

七月算法-12月机器学习在线班--第十二次课笔记-支持向量机(SVM) 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com ? 复习的内容: 对偶问题 KKT条件 ? SVM 1.1三类数据类型 线性可分支持向量机 线性支持向量机 非线性支持向量机 ? 1.2 线性分类 1.2.1 样本到分类面的距离的意义 点到直线的距离,ABC是归一化的."+"正类别,"-"负类别 因此距离可以直接用AX+BY+c=f(x,

ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法

ng机器学习视频笔记(三) --线性回归的多变量.特征缩放.标准方程法 (转载请附上本文链接--linhxx) 一.多变量 当有n个特征值,m个变量时,h(x)= θ0+θ1x1+θ2x2-+θnxn,其中可以认为x0=1.因此,h(x)= θTx,其中θ是一维向量,θ=[θ0, θ1-θn] T,x也是一维向量,x=[x0,x1..xn] T,其中x0=1. 二.特征缩放(Feature Scaling) 特征缩放的目的,是为了让每个特征值在数量上更加接近,使得每个特征值的变化的影响相对比较"