正则方程(Normal Equation)

梯度下降是最小化代价函数\(J(\theta)\)的一种方式,这里提出了另一种方式即正则方式不使用迭代方式:\(\theta = (X^TX)^{-1}X^Ty\)。举例如下(m=4)

![normal equation](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fgdv8r4ymyj20gi080jsc.jpg)

在正则方式中不需要对正则方程做尺度缩放。

下表给出了对于正则方程与梯度下降方法中差异:

梯度下降 正则方程
需要选择学习速率alpha 不需选择alpha
需要更多的步骤 不需要更多的迭代
算法复杂度(\(kn^2\)) 算法复杂度(\(n^3\)),且需要计算\(X^TX\)
n值很大时,本方法以上很好运行 n的数值越大,计算越慢

从最后一项可以看出,随n的增大,计算的速度越慢。实际操作中,当n超过10000时,利用梯度下降将是比正则方程更优的选择。

这里补充关于正则方程X不可逆的问题

一般可能是以下两种原因导致\(X^TX\)不可逆的情形出现:

  • 冗余特征出现:即特征集中出现了两个特征非常密切相关的(可以说是线性相关的)
  • 含有太多的特征(如\(m\leq n\))。此时可以对特征做适量的删减或使用正规则化(此部分在后面会接触)

实际的编程工具中,我们一般使用octave或matlab软件,而取逆函数名选取"pinv"而非"inv",此时即使不可逆仍然能够给出一个值。

开始动手写代码:machine learning ex1

单变量下的线性回归

假如你是一家餐饮业老总,你想在不同的城市开设餐馆,从以往的餐馆中,你获取了相应的餐馆在每个城市的利润和人口数据。因此,你需要借助这些数据帮助你来决定下一步在何地开设。

  • 首先根据已有的数据绘出关于人口--利润的图形,代码如下:
figure; % 绘图
plot(x,y,'rx', 'MarkerSize', 10);
xlabel('Polulation of City in 10,000s');
ylabel('Profit in $10,000S');

  • 梯度下降的计算:

目的在于根据以下代价函数公式\(J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2\)使其最小化,

这里假设函数设为一阶线性:\(h_\theta(x)=\theta^Tx=\theta_0+\theta_1x_1\),在批量梯度算法中,每一步都进行更新:

经过梯度下降,参数\(\theta_j\)逐渐接近最适值,此时代价函数\(J(\theta)\)取得最小值。

代价函数计算代码如下:

% Initialize some useful values
m = length(y); % number of training examples
% You need to return the following variables correctly
J = 0;
% ====================== YOUR CODE HERE ======================
% Notice: we must add an additional first column to X and set it to all ones.
for i = 1:m
J = J + ( (theta(1)*X(i,1)+theta(2)*X(i,2))-y(i) )^2;
end
J = J/2/m;
% =============================================================

梯度下降计算代码如下:

在程序中,确保理解需要优化的内容和正在更新的内容。记住J成本函数由向量θ是决定而不是X和y。也就是说,我们最小化J(θ)的价值通过改变向量θ的值,而不是通过改变X或y,验证梯度下降是否正确工作的一个好方法是看J(θ)在每一步的运算中是否减少。

% Initialize some useful values
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
% ====================== YOUR CODE HERE ======================
% Instructions: Perform a single gradient step on the parameter vector
% theta.
%
% Hint: While debugging, it can be useful to print out the values
% of the cost function (computeCost) and gradient here.
%
v1 = 0;
v2 = 0;
for i = 1:m
v1 = v1 + ((theta(1)*X(i,1)+theta(2)*X(i,2))-y(i))*X(i,1);
v2 = v2 + ((theta(1)*X(i,1)+theta(2)*X(i,2))-y(i))*X(i,2);
end
theta(1) = theta(1) - alpha * v1 / m;
theta(2) = theta(2) - alpha * v2 / m;
% ============================================================
% Save the cost J in every iteration
J_history(iter) = computeCost(X, y, theta);

经过梯度下降后初步的到的参数做回归图线为:

![result of grad](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fgdybvtq7aj20f706g760.jpg)

* 利用contour函数描述随参数theta的变化,代价函数的取值:

% initialize J_vals to a matrix of 0's
J_vals = zeros(length(theta0_vals), length(theta1_vals));
% Fill out J_vals
for i = 1:length(theta0_vals)
for j = 1:length(theta1_vals)
t = [theta0_vals(i); theta1_vals(j)];
J_vals(i,j) = computeCost(X, y, t);
end
end % Because of the way meshgrids work in the surf command, we need to
% transpose J_vals before calling surf, or else the axes will be flipped
J_vals = J_vals';
% Surface plot
figure;
surf(theta0_vals, theta1_vals, J_vals)
xlabel('\theta_0'); ylabel('\theta_1'); % Contour plot
figure;
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20))
xlabel('\theta_0'); ylabel('\theta_1');
hold on;
plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2);

显示如下:

![surf & contour](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fgdybvllhjj20c0089jrm.jpg)

多变量下的线性回归

假设你在出售你的房子和你想知道一个好的市场价格是多少。一种方法是首先收集最近出售的房屋的信息并建立一个住房模型价格。这节我们主要通过引入两个特征元素:房子尺寸和起居室的数量,输出结果或期望得到为房屋的价格。

  • 这里起居室的尺寸是起居室数量的1000倍大概,故首先要对特征集进行标准化处理。

因此应计算所有特征元素的平均值以及它们的标准差。octave有专用的函数"mean"、"std"以计算。

代码如下:

% You need to set these values correctly
X_norm = X;
mu = zeros(1, size(X, 2));%size -->1 disp the row, 2 disp the column , 3 disp the page
sigma = zeros(1, size(X, 2)); mu = mean(X);
sigma = std(X); m = size(X,1);
n = size(X,2); for i = 1:n
for j = 1:m
X_norm(j,i) = (X(j,i) - mu(i))/sigma(i);
end
end
  • 梯度下降

之前,在单变量回归上实现了梯度下降问题。现在唯一的区别是,还有一个特性矩阵x,假设函数和批梯度下降更新规则保持不变。

![grad mul](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fgdybwabg0j20bb04uq2y.jpg)

代码如下:

%compute the costmulti
m = length(y);
J = 0;
J=(X*theta-y)'*(X*theta-y)/2/m; % the multi of grad descent
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
i = size(X,2);
v = 0;
for i = 1:i;
for j = 1:m
v = v + ((theta(1)*X(j,1)+theta(2)*X(j,2)+theta(3)*X(j,3))-y(j))*X(j,i);
end theta(i) = theta(i) - alpha * v / m;
end
% Save the cost J in every iteration
J_history(iter) = computeCostMulti(X, y, theta);
end

之后绘出代价函数的递减曲线:

![decrease of multi](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fgdybwmfgwj20ak083747.jpg)

* 正则方程

\(\theta=(X^TX)^{-1}X^Ty\)

代码如下:

theta = zeros(size(X, 2), 1);%size(X,2)返回列colum的值
theta = pinv(X'*X)*X'*y;

第二章完结,包含exam练习的更多相关文章

  1. ArcGIS API for JavaScript 4.2学习笔记[10] 2D添加指北针widget、视图保存、视图padding(第二章完结)

    这几个例子是第二章除了入门之外比较简单的几个,就做个合集,把最核心的代码(第二参数)和 引用放上来即可,不作多解释. 2D地图添加指北针widget 2D地图一般修正方向为正北方就需要这个widget ...

  2. Python 对象(type/object/class) 作用域 一等函数 (慕课--Python高级,IO并发 第二章)

    在python中一共有两种作用域:全局作用域和函数作用域全局作用域:在全局都有效,全局作用域在程序执行时创建,在程序执行结束时销毁:所有函数以外的区域都是全局作用域:在全局作用域中定义的变量,都属于全 ...

  3. python从入门到实践 第二章

    python变量赋值: python的变量赋值 可以是单引号 也可以是双引号python 变量赋值的时候不能加()的 比如 name = "My Name is GF"变量赋值的时 ...

  4. 第二章:javascript: 数组

    数组是编程世界里最常见的数据结构.任何一种编程语言都包含数组,只是形式稍微有差异.数组是编程语言中的内建类型,通常效率都很高.可以满足不同需求的数据存储,本章将探索javascript中的数组工作原理 ...

  5. 【黑金原创教程】【Modelsim】【第二章】Modelsim就是电视机

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  6. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  9. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

随机推荐

  1. centos下安装dubbo-admin步骤

    前言: 纠正网上一些错误的博文,真的害人不浅,按照他们的说法,dubbo-admin在jdk1.8的版本下无法启动注册中心,需要去github下载阿里提供的源码,然后install进本地仓库并打包成w ...

  2. 我的开发环境搭建(ubuntu菜鸟)

    前段时间把系统换成了ubuntu,经过一段时间到发展,终于可以比较正常到完成开发工作了,但是就在今天,我的系统崩了,进不了桌面,而且终端里边到中文也显示乱码,尝试了网上说到各种方法无效,最终我决定重装 ...

  3. iOS刨根问底-深入理解RunLoop

    开源的RunloopRef 通常所说的RunLoop指的是NSRunloop或者CFRunloopRef,CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的OC ...

  4. 新年伊始,.net菜鸟入院的第一篇随笔

    学习.net有半年了,大二一年都是微软校园的负责人,但是因为根本没有系统的学习过编程的知识,所以一直都是活动负责人的身份,忙忙碌碌也没有什么收获,大三一狠心就退了,想能够踏踏实实的敲敲代码,手上的学习 ...

  5. java web (j2ee)学习路线 —— 将青春交给命运

    RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:H ...

  6. LNMP之编译安装PHP出现的问题

    2010年以前,互联网公司最常用的Web服务组合就是LAMP(即Linux.Apache.MySQL.PHP),近几年随着Nginx Web服务的逐渐流行,又出现了新的Web服务环境组合--LNMP ...

  7. ANSJ中文分词使用方法

    一.前言 之前做solr索引的时候就使用了ANSJ进行中文分词,用着挺好,然而当时没有写博客记录的习惯.最近又尝试了好几种JAVA下的中文分词库,个人感觉还是ANSJ好用,在这里简单总结之. 二.什么 ...

  8. 关于初学loadrunner的心得体会

    自参加工作两年以来,深感个人知识底蕴浅薄,为此,自身也在多方寻找所需业务技能.loadrunner负载测试工具,作为性能测试典型工具之一,对于我个人的知识的丰富化起到一定作用,但也仅仅是对工作能力的略 ...

  9. Jenkins获取git tags代码

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...

  10. Mongodb密码安全设置

    先从官网下载mongo安装包(建议安装3.0之后的版本)版本选择下载链接: https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.210 ...