样本文件下载:ex2Data.zip

ex2x.dat文件中是一些2-8岁孩子的年龄。

ex2y.dat文件中是这些孩子相对应的体重。

我们尝试用批量梯度下降法,随机梯度下降法和小批量梯度下降法来对这些数据进行线性回归,线性回归原理在:http://www.cnblogs.com/mikewolf2002/p/7560748.html

1.批量梯度下降法(BGD)

BGD.m代码:

clear all; close all; clc;
x = load('ex2x.dat'); %装入样本输入特征数据到x,年龄
y = load('ex2y.dat'); %装入样本输出结果数据到y,身高
figure('name','线性回归-批量梯度下降法');
plot(x,y,'o') %把样本在二维坐标上画出来
xlabel('年龄') %x轴说明
ylabel('身高') %y轴说明 m = length(y); % 样本数目
x = [ones(m, 1), x]; % 输入特征增加一列,x0=1
theta = zeros(size(x(1,:)))'; % 初始化theta MAX_ITR = 1500;%最大迭代数目
alpha = 0.07; %学习率
i = 0;
while(i<MAX_ITR)
grad = (1/m).* x' * ((x * theta) - y);%求出梯度
theta = theta - alpha .* grad;%更新theta
if(i>2)
delta = old_theta-theta;
delta_v = delta.*delta;
if(delta_v<0.000000000000001)%如果两次theta的内积变化很小,退出迭代
break;
end
end
old_theta = theta;
i=i+1;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-') % x现在是一个2列的矩阵
legend('训练数据', '线性回归')%标记每个数据设置

程序输结果如下:迭代次数达到了上限1500次,最后梯度下降法求解的theta值为\([0.7502,0.0639]^T\),两个预测值3.5岁,预测身高为0.9737米,7岁预测为1.1973米。

注意学习率的选择很重要,如果选择太大,可能不能得到收敛的\(\theta\)值。

i =

        1500

theta =

    0.7502
0.0639 predict1 = 0.9737 predict2 = 1.1973

2.随机梯度下降法

sgd.m代码如下,注意最大迭代次数增加到了15000,1500次迭代不能得到收敛的点,可见随机梯度下降法,虽然计算梯度时候,工作量减小,但是因为不是最佳的梯度下降方向,可能会使得迭代次数增加:

clear all; close all; clc;
x = load('ex2x.dat');
y = load('ex2y.dat');
figure('name','线性回归-随机梯度下降法');
plot(x,y,'o')
xlabel('年龄') %x轴说明
ylabel('身高') %y轴说明
m = length(y); % 样本数目
x = [ones(m, 1), x]; % 输入特征增加一列
theta = zeros(size(x(1,:)))';%初始化theta MAX_ITR = 15000;%最大迭代数目
alpha = 0.01;%学习率
i = 0;
while(i<MAX_ITR)
%j = unidrnd(m);%产生一个最大值为m的随机正整数j,j为1到m之间
j = mod(i,m)+1;
%注意梯度的计算方式,每次只取一个样本数据,通过轮转的方式取到每一个样本。
grad = ((x(j,:)* theta) - y(j)).*x(j,:)';
theta = theta - alpha * grad;
if(i>2)
delta = old_theta-theta;
delta_v = delta.*delta;
if(delta_v<0.0000000000000000001)
break;
end
end
old_theta = theta;
i=i+1;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-')
legend('训练数据', '线性回归')

程序结果输出如下:

i =

       15000

theta =

    0.7406
0.0657 predict1 = 0.9704 predict2 = 1.2001

3.小批量梯度下降法

mbgd.m代码如下,程序中批量的样本数目,我们选择5:

clear all; close all; clc;
x = load('ex2x.dat');
y = load('ex2y.dat');
figure('name','线性回归-小批量梯度下降法')
plot(x,y,'o')
xlabel('年龄') %x轴说明
ylabel('身高') %y轴说明
m = length(y); % 样本数目 x = [ones(m, 1), x]; % 输入特征增加一列
theta = zeros(size(x(1,:)))'; %初始化theta MAX_ITR = 15000;%最大迭代数目
alpha = 0.01;%学习率
i = 0;
b = 5; %小批量的数目
while(i<MAX_ITR)
j = mod(i,m-b)+1;
%每次计算梯度时候,只考虑b个样本数据
grad = (1/b).*x(j:j+b,:)'*((x(j:j+b,:)* theta) - y(j:j+b));
theta = theta - alpha * grad;
if(i>2)
delta = old_theta-theta;
delta_v = delta.*delta;
if(delta_v<0.0000000000000000001)
break;
end
end
old_theta = theta;
i=i+b;
end
i
theta
predict1 = [1, 3.5] *theta
predict2 = [1, 7] *theta
hold on
plot(x(:,2), x*theta, '-')
legend('训练数据', '线性回归')

程序的输出结果:

i =

       15000

theta =

    0.7418
0.0637 predict1 = 0.9647 predict2 = 1.1875

matlib实现梯度下降法的更多相关文章

  1. matlib实现梯度下降法(序一)

    数据来源:http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant 数据描述: 有四个输入特征,这些数据来自电厂,这四个特征和 ...

  2. [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...

  3. 机器学习基础——梯度下降法(Gradient Descent)

    机器学习基础--梯度下降法(Gradient Descent) 看了coursea的机器学习课,知道了梯度下降法.一开始只是对其做了下简单的了解.随着内容的深入,发现梯度下降法在很多算法中都用的到,除 ...

  4. 一种利用 Cumulative Penalty 训练 L1 正则 Log-linear 模型的随机梯度下降法

    Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之一,其训练常采用最大似然准则,且为防止过拟合,往往在目标函数中加入(可以产生稀疏性的) L1 正则.但对于这种带 L ...

  5. coursera机器学习笔记-机器学习概论,梯度下降法

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  6. 重新发现梯度下降法--backtracking line search

    一直以为梯度下降很简单的,结果最近发现我写的一个梯度下降特别慢,后来终于找到原因:step size的选择很关键,有一种叫backtracking line search的梯度下降法就非常高效,该算法 ...

  7. 梯度下降法VS随机梯度下降法 (Python的实现)

    # -*- coding: cp936 -*- import numpy as np from scipy import stats import matplotlib.pyplot as plt # ...

  8. Gradient Descent 和 Stochastic Gradient Descent(随机梯度下降法)

    Gradient Descent(Batch Gradient)也就是梯度下降法是一种常用的的寻找局域最小值的方法.其主要思想就是计算当前位置的梯度,取梯度反方向并结合合适步长使其向最小值移动.通过柯 ...

  9. 理解梯度下降法(Gradient Decent)

    1. 什么是梯度下降法?   梯度下降法(Gradient Decent)是一种常用的最优化方法,是求解无约束问题最古老也是最常用的方法之一.也被称之为最速下降法.梯度下降法在机器学习中十分常见,多用 ...

随机推荐

  1. zoj 3644 记忆化搜索

    题目:给出一个有向图,从1到n,每个结点有个权值,每走一步,分值为结点权值的LCM,而且每一步的LCM都要有变化,问到达N的时候分值恰好为K的路径有多少条 记忆化搜索,虽然做过很多了,但是一直比较慢, ...

  2. 20172308《Java软件结构与数据结构》第四周学习总结

    教材学习内容总结 第 6 章 列表 一. 列表集合 列表集合:一种概念性表示法,思想是使事物以线性列表的方式进行组织 特点: 列表集合没有内在的容量大小,它可以随着需要而增大 列表集合更具一般化,可以 ...

  3. pygame系列_小球完全弹性碰撞游戏_源码下载

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  4. LPC43xx Asymmetric Dual Core : Cortex-M0 and Cortex-M4

  5. PHP项目收藏

    API接口管理系统 Github上的PHP资源汇总大全 Github.com上有哪些比较有趣的PHP项目 SOAP NuSOAP - SOAP Toolkit for PHP [官网] [教程] 通用 ...

  6. [Go] 反射 - reflect.ValueOf()

    类型 和 接口 由于反射是基于类型系统(type system)的,所以先简单了解一下类型系统. 首先 Golang 是一种静态类型的语言,在编译时每一个变量都有一个类型对应,例如:int, floa ...

  7. Linux 下smi/mdio总线通信

    Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...

  8. vs断点未能绑定

    原文链接:http://blog.csdn.net/pc0de/article/details/41790063 突然发现所有的c++项目在调试的时候加断点都会报错:”不能设置下面的断点.....断点 ...

  9. 最简单的例子理解Javascript闭包

    理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...

  10. Android提交数据到服务器的两种方式四种方法

    本帖最后由 yanghe123 于 2012-6-7 09:58 编辑 Android应用开发中,会经常要提交数据到服务器和从服务器得到数据,本文主要是给出了利用http协议采用HttpClient方 ...