单变量线性回归

  本文档基于吴恩达机器学习课程单变量线性回归部分内容,记录自己对该部分内容的理解,并给出了MATLAB代码实现,以增强自己的理解,也方便后续查阅。

1、线性回归问题描述

  • 回归问题

  对于机器学习而言,主要有量方面的问题——回归和分类,回归可以理解为一种曲线拟合(逻辑回归除外,逻辑回归是分类),线性回归就是对待处理的数据拟合成一条直线,直线的通用表达式如下:
y= kx+b
式中,x是自变量,k为斜率,b为截距,kb都是常数,一旦确定上式中的kb,则确定了一条直线。

  • 约定

  为了方便描述回归问题,在此我们将要用来描述这个回归问题的标记如下:
—— 𝑚代表训练集中实例的数量
—— 𝑥代表特征/输入变量
—— 𝑦代表目标变量/输出变量
—— (𝑥^{(i)}𝑦^{(i)})代表训练集中的实例
—— h 代表学习算法的解决方案或函数也称为假设(hypothesis)

  • 代价函数

  代价函数的直观理解如下图所示:


截屏2021-01-22 下午8.15.48.png
  • 组成要素

a、假设函数h_\theta(x)

  单变量线性回归中,假设函数为一条直线,表达式如下:
h_\theta(x) = \theta_0 + \theta_1x

注意: 虽然此处改变了表达式变量,但实质上与前一节给出的直线表达式相同,改成此处的形式是为了与吴恩达课程一致。

b、代价函数J(\theta_0, \theta_1)

  选择的代价函数为误差平方和取均值,表达式如下:
J(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{i})-y^{i})^2
式中,m为样本个数。

c、目标

  最小化代价函数J(\theta_0, \theta_1),具体实现方式为通过梯度下降算法实现。

d、梯度下降

  梯度下降算法用于最小化代价函数,通过迭代不断地调整参数\theta_0\theta_1的值,迭代终止条件有两种:一是指定迭代次数;二是指定代价函数的目标值err,当代价函数的值小于err后迭代终止。
  梯度下降的实质就是求导数,具体的知识可以查阅相关资料学习,吴恩达课程也有讲解。

2、MATLAB代码实现

%%单变量线性回归
%完成该工作需要以下几个要素
% 1、训练数据 (训练模型的输入)
% 2、假设函数 h (模型集合)
% 3、 代价函数 J(衡量模型输出结果与真值之间误差的大小)
% 4、梯度下降算法 (针对指定的代价函数,根据迭代不断更新模型参数,逐渐减小误差)

clc;close all;clear         % 清除图像fig和工作空间中的变量

%% 1、产生训练数据
m = 100;                    %指定训练数据个数
n = 1;                      %参数个数,(保持与吴恩达课程一致,theta0不算)
x = linspace(0,10,m);
y = 5*x' -1;
y = y + rand(m,1);          %加入误差,得到我们的训练数据集

%% 2、训练模型
alpha = 0.001;              %学习率
Theta = rand(n+1,1);        %参数向量theta0,theta1、、、按列存储
epochNum = 10000;           %指定迭代次数
X = [ones(m,1) x'];         %输入矩阵定义为。每一行为一个训练样本,行数为样本个数,列数为样本特征数

figHand = animatedline('Color', 'b', 'Marker', 'o');    %动态画图展示训练过程中的误差
PlotNum = 1;                %记录从迭代开始到当前迭代时刻需要画图显示的数据个数
ErrMax = 0;                 %记录从迭代开始到当前迭代时刻下误差的最大值 
for epoch = 1 : epochNum
    % (1) 根据假设函数模型计算误差,假设模型函数就是上面内容中描述的h函数
    y_val= X*Theta;
    Err = (y_val - y)' * (y_val -y)/(2*m);    %通过代价函数计算误差
    
    %(2)梯度下降算法更新模型参数
    % 参数更新公式为:theta = theta - alpha*X'*(y_val - y)/m;
    Theta = Theta - alpha*X'*(y_val - y)/m;
    
    %(3)训练过程误差可视化
    ErrMax = max(ErrMax, Err);
    if (epoch == 1 || ~mod(epoch,100))
        addpoints(figHand, PlotNum, Err);
        axis([0, PlotNum+4, 0 , ErrMax*1.1]);
        drawnow
        PlotNum = PlotNum + 1;
    end
end

%% 3、模型预测
y_predict = X*Theta;

%% 4、可视化
figure
plot(x, y, 'r*');
hold on
plot(x, y_predict, 'g+');
legend('真值', '拟合值');

%% 总结:可能出现不收敛情况,很有可能是学习率参数设置太大了,可以减小学习率参数后再试试

3、结果

   训练过程中误差如下图所示:


image.png

   模型预测值与真值(训练样本)比较如下图所示:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容