Stanford机器学习Week 1—单变量线性回归

本篇讲述以下内容:

  • 单变量线性回归
  • 代价函数
  • 梯度下降

单变量线性回归

回顾下上节,在回归问题中,我们给定输入变量,试图映射到连续预期结果函数上从而得到输出。单变量线性回归就是从一个输入值预测一个输出值。输入/输出的对应关系就是一个线性函数。

下面是一个根据房屋面积预测房屋价格的例子。

假设有一个数据集,我们称作训练集,数据集包括房屋面积和房屋价格数据。

x:表示输入变量,也叫特征变量。

y:表示输出变量,也叫目标变量。

(xi,yi):表示一个识训练样本,训练集的一行。i 表示 第 i 个训练样本。

m:表示训练样本的数量。

在接下来的学习之前,先了解一下监督学习的一般工作方式。如下图,训练集通过学习算法训练后,得到一个h(hypothesis),它表示为一个函数。

函数的输入为房屋大小,输出为房屋的价格。通过这个函数我们则可以预测房屋价格,这就是机器学习中的回归问题。

在单变量线性回归中,我们的假设函数为:hθ(x)=θ01x ,其中θ0 和θ1为模型参数。

讲到这肯定有疑惑为什么要选这个函数,实际应用可能不是线性的函数,可能会是更复杂的函数。这里只是为了从简单线性方程的例子入手,假设房屋的面积和价格是一个线性关系。

好继续, 我们有了假设函数,接下来要做的就是如何选择不同的参数θ0 和θ1。下图可以看到不同的参数值会得到不同的假设函数。

我们选择参数θ0 和θ1得到的直线,应该尽量和训练数据拟合。这样才能做出比较精准的预测。

那么如何来使它来更好的拟合数据呢?我们的想法是hθ(x) 应该最接近 y 值,即问题转化成了一个mininize(hθ(x) -y) 的问题,有没有感觉转化成数学问题了。

代价函数

接下来引入一个代价函数Cost Function,也被称作平方误差函数。

函数定义如下,每个训练样本 hθ(x)-y 的平方和,再求平均。再乘1/2是为了接下来的计算上的方便。

我们想要做的就是关于θ0 和θ1对函数J(θ0 ,θ1)求最小值。即找到使得J(θ0 ,θ1)最小值的时候,θ0 和θ1的值。接下来介绍一种算法,梯度下降。它能自动的找出使 J 最小化的参数θ0 和θ1的值。

梯度下降

了解梯度下降前,我们了解一下J(θ0 ,θ1) 的函数图像。

当θ0 为0时,随着的变化θ1 将会得到下图的效果。θ1取1的时候 J 为最小值

当θ0 和θ1都有值时。

好了,回到我们之前问题描述,我们有一个代价函数J(θ0 ,θ1),想通过一个算法来使用得 J 最小化。

那么梯度下降的思想就是:

开始给定一个(θ0 ,θ1)初始值,我们想通过不断的改变θ0 ,θ1的值,每次改都使得 J 减少。最终J 减少到最小。

下面通过图我们来看梯度下降是如何工作的。

首先想象一下,对θ0 ,θ1赋以某个初始值(一般可以初始化为0)。假设初始化后,J 对应是下图的标红的这个点。

我们想象这是一座山,你站在山上的这个点上。在梯度下降中,我们要做的是看看周周围,并问自己我想要通过小碎步下山,朝哪个方向能最快下山?并朝着这个方向前行。

每走一步都需要调整最快的那个方向。最终你走出了这么一条轨迹。最终走到一个局部最优解——山脚下。当然如果你是站在另一个点,你可以会走出另一条轨迹。

上面是通过图直观的感受,那么事实上在这走一步的方向,其实就是梯度的负方向。梯度其实就是J的导数,对于一个线性函数,也就是线的斜率。

如果把每一步的长度定义为学习速率。那么每走一步的这个动作,其实就是 θ0 ,θ1 都朝梯度的负方向进行更新。控制着更新的幅度。

下图是数学定义:即按照一定的学习速率,不断重复更新θ0 ,θ1 直到 J 局部收敛到最小值。

下图是对一元线性函数的直客感受,如下图函数上的某点,沿红色方向,即斜率的反方向下降一个步长到另一点。θ1将得到 -* 斜率的更新。

另一个方向也是同样效果。

其中关于学习速率大小的的选择对算法的影响 ,如果速率太小,则下降的速度比较慢。如果速率过大,会无法收敛到最小值。

如果θ1的选择一开始就是最优点。那么这个点的导数为0,θ1则不会得到更新。

梯度下降的过程中,导数的值会不断变小,下降的幅度也会自然的减少。所有没有必要在下降的过程中调整学习速率。

在线性回归中,梯度下降的具体实现

前面讲了梯度下降的数学特性,那么在线性回归的训练算法中是如何应用的呢。

下图左边是梯度下降的算法,右边是线性回归的模型。

要实现这个算法,我们还差这个关键项。它表示分别对θ0 ,θ1求导,可以参数数学上的求导方法。

对θ0 求导后得到

对θ1求导后得到

然后代到梯度下降的公式中。每一次循环,都要分别求出θ0 ,θ1的更新值然后更新。

课后练习代码,Octave实现。

现在有一家餐饮连锁公司,关于城市人口和利润的数据。我们要得到城市人口和利润的预测函数。

先用可视化的方式Plot 这些数据。

%% ======================= Part 2: Plotting =======================
fprintf(‘Plotting Data ...\n‘)
data = load(‘ex1data1.txt‘);
X = data(:, 1); y = data(:, 2);
m = length(y); % number of training examples

% Plot Data
% Note: You have to complete the code in plotData.m
plotData(X, y);

fprintf(‘Program paused. Press enter to continue.\n‘);
pause;
function plotData(x, y)
%PLOTDATA Plots the data points x and y into a new figure
%   PLOTDATA(x,y) plots the data points and gives the figure axes labels of
%   population and profit.

% ====================== YOUR CODE HERE ======================
% Instructions: Plot the training data into a figure using the
%               "figure" and "plot" commands. Set the axes labels using
%               the "xlabel" and "ylabel" commands. Assume the
%               population and revenue data have been passed in
%               as the x and y arguments of this function.
%
% Hint: You can use the ‘rx‘ option with plot to have the markers
%       appear as red crosses. Furthermore, you can make the
%       markers larger by using plot(..., ‘rx‘, ‘MarkerSize‘, 10);

figure; % open a new figure window

plot(x, y, ‘rx‘,‘MarkerSize‘,10); %Plot the data

ylabel(‘Profit in $10,000s‘); %Set the y-axis lable

xlabel(‘Population of City in 10,000s‘); %Set the x-axis lable

% ============================================================

end

用梯度下降方法,得到一个最佳似合直线。

%% =================== Part 3: Gradient descent ===================
fprintf(‘Running Gradient Descent ...\n‘)

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters

% Some gradient descent settings
iterations = 1500; %定义循环次数
alpha = 0.01; %定义学习速率

% compute and display initial cost
computeCost(X, y, theta)

% run gradient descent
theta = gradientDescent(X, y, theta, alpha, iterations);

CostFunction 代价函数实现,

function J = computeCost(X, y, theta)
%COMPUTECOST Compute cost for linear regression
%   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
%   parameter for linear regression to fit the data points in X and y

% Initialize some useful values
m = length(y); % number of training examples

% You need to return the following variables correctly
J = 0;

% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta
%               You should set J to the cost.

temp = (X * theta) - y ;

J = (1 / (2 * m)) * sum( (temp.^2) ) ;
% 矩阵运算方式
% temp‘*temp 
% =========================================================================

end

梯度下降实现

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
%   theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by
%   taking num_iters gradient steps with learning rate alpha

% 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.
    %

temp1 = theta(1) - (alpha / m) * sum((X * theta - y ).*X(:,1));

temp2 = theta(2) - (alpha / m) * sum((X * theta - y).* X(:,2));  

theta(1) = temp1;

theta(2) = temp2;
% 矩阵运算方式
% theta = theta - alpha * (X‘ * (X * theta - y)) / m;
    % ============================================================

    % Save the cost J in every iteration
    J_history(iter) = computeCost(X, y, theta);

end

end

打印结果

% print theta to screen
fprintf(‘Theta found by gradient descent: ‘);
fprintf(‘%f %f \n‘, theta(1), theta(2));

% Plot the linear fit
hold on; % keep previous plot visible
plot(X(:,2), X*theta, ‘-‘)
legend(‘Training data‘, ‘Linear regression‘)
hold off % don‘t overlay any more plots on this figure

% Predict values for population sizes of 35,000 and 70,000
predict1 = [1, 3.5] *theta;
fprintf(‘For population = 35,000, we predict a profit of %f\n‘,...
    predict1*10000);
predict2 = [1, 7] * theta;
fprintf(‘For population = 70,000, we predict a profit of %f\n‘,...
    predict2*10000);

fprintf(‘Program paused. Press enter to continue.\n‘);
pause;

注:上述学习资料参考:https://www.coursera.org/learn/machine-learning

时间: 2024-10-01 00:28:51

Stanford机器学习Week 1—单变量线性回归的相关文章

Stanford机器学习课程笔记——单变量线性回归和梯度下降法

Stanford机器学习课程笔记--单变量线性回归和梯度下降法 1. 问题引入 单变量线性回归就是我们通常说的线性模型,而且其中只有一个自变量x,一个因变量y的那种最简单直接的模型.模型的数学表达式为y=ax+b那种,形式上比较简单.Stanford的机器学习课程引入这个问题也想让我们亲近一下machine learning这个领域吧~吴恩达大神通过一个房屋交易的问题背景,带领我们理解Linear regression with one variable.如下: 不要看这个问题简答,大神就是大神

机器学习入门之单变量线性回归(上)——梯度下降法

在统计学中,线性回归(英语:linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归(multivariate linear regression).——————维基百科 一直以来,这部分内容都是ML的敲门砖,吴恩达教授在他的课程中也以此为第一个例子,同时,本篇也参考了许多吴教授的内容. 在这里,我简单把

机器学习门户网站——单变量线性回归

线性回归的概念.在高中的数学书出现了. 给你一些样本点,怎样找出一条直线,使得最逼近这些样本点. 给出一个样例:如果 x 是房子面积,y是房子价格.确定一条直线须要theta0和theta1. 给出x,我们就能够计算出房子的价格 h(x) = theta0+theta1*x 关键是怎样计算出theta0和theta1,也就是怎样找出这么一条直线呢? 在这里,引入一个概念,叫做cost function.m表示样本个数,也就是训练样本数目 这是一个square error.学过统计的应该常常见到

Andrew Ng机器学习第一章——单变量线性回归

监督学习算法工作流程 h代表假设函数,h是一个引导x得到y的函数 如何表示h函数是监督学习的关键问题 线性回归:h函数是一个线性函数 代价函数 在线性回归问题中,常常需要解决最小化问题.代价函数常用平方误差函数来表示 代价函数就是用于找到最优解的目的函数,这也是代价函数的作用 ps:尽可能简化问题去理解一些抽象概念,如单一的参数变化等等 可以利用代价函数去寻找你拟合效果最好的假设函数的参数 当参数很多时,利用图表来寻找最小代价函数就变得比较复杂,故引出梯度下降法. 梯度下降法最小化任意代价函数J

机器学习【第二篇】单变量线性回归

吴恩达机器学习笔记整理--单变量线性回归 通过模型分析,拟合什么类型的曲线. 一.基本概念 1.训练集 由训练样例(training example)组成的集合就是训练集(training set), 如下图所示,其中(x,y)是一个训练样本,训练集中每一行表示一个训练样本;(x^i,y^i)表示第i个训练样本. 2.假设函数h 使用某种学习算法对训练集的数据进行训练, 我们可以得到假设函数(Hypothesis Function), 如下图所示. 在房价的例子中,假设函数就是一个房价关于房子面

Stanford公开课机器学习---2.单变量线性回归(Linear Regression with One Variable)

单变量线性回归(Linear Regression with One Variable) 2.1 模型表达(Model Representation) m 代表训练集中实例的数量 x 代表特征/输入变量 y 代表目标变量/输出变量 (x,y) 代表训练集中的实例 (x(i),y(i) ) 代表第 i 个观察实例 h 代表学习算法的解决方案或函数也称为假设(hypothesis) 单变量线性回归:只含有一个特征/输入变量 x hθ=θ0+θ1x 2.2 代价函数(Cost Function) 目标

【stanford 机器学习】学习笔记(1)--单变量线性回归

课程来自斯坦福大学吴恩达教授 machine learning: https://www.coursera.org/learn/machine-learning/home/welcome 1) Model representation(模型表示) 回到房屋价格预测问题, 首先它是一个有监督学习的问题(对于每个样本的输入,都有正确的输出或者答案),同时它也是一个回归问题(预测一个实值输出).训练集表示如下: 其中: m = 训练样本的数目 x’s = “输入”变量,也称之为特征 y’s = “输出

机器学习:单变量线性回归及梯度下降

******************************************************************************* 注:本系列博客是博主学习Stanford大学 Andrew Ng 教授的<机器学习>课程笔记.博主深感学过课程后,不进行总结很容易遗忘,根据课程加上自己对不明白问题的补充遂有此系列博客.本系列博客包括线性回归.逻辑回归.神经网络.机器学习的应用和系统设计.支持向量机.聚类.将维.异常检测.推荐系统及大规模机器学习等内容. *******

机器学习之单变量线性回归(Linear Regression with One Variable)

1. 模型表达(Model Representation) 我们的第一个学习算法是线性回归算法,让我们通过一个例子来开始.这个例子用来预测住房价格,我们使用一个数据集,该数据集包含俄勒冈州波特兰市的住房价格.在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集: 我们来看这个数据集,如果你有一个朋友正想出售自己的房子,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱. 那么,你可以做的一件事就是构建一个模型,也许是条直线.从这个数据模型上来看,也许你可以告诉你的朋友,他大概