本系列是在coursera上由Andrew Ng主讲的machine learning课程学习笔记。

1. Linear Regression

Linear Regression(线性回归)是机器学习一个经典入门问题,本文根据课程中第一次编程作业内容,使用机器学习解决线性回归问题。

考虑问题:调查发现food-truck的利润和城市人口之间关系如图1,求人口和利润之间的线性关系?

Fig.1 population-profit
Fig.1 population-profit

既然呈线性关系,那就线性模型求解。平面上的直线公式是:

习惯写成:

问题在于如何确定这条直线?也就是要确定参数的值。

一个Intuitive的想法是直线应该到各点的距离尽量小。而预测值到单个点的距离可以表示为Lost(error) function:

其中即为图1中各个sample,而对所有sample的距离表示为Cost function

因为希望直线到各个点的距离尽可能小,即的值尽可能小,所以问题也就转化为求的值,使得Cost function的值尽可能小。

这种方法也叫最小二乘或最小平方法(Least Square)。

1.1 计算Cost function的代码:

编程作业中计算Cost function的代码:

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.

h_theta = X * theta;
J = sumsq(h_theta - y) / (2 * m );

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

end

其中theta为向量:

X为所有samples的横坐标矩阵

Y为所有samples的纵坐标矩阵

X多加了第一列是为了和做矩阵乘法,所以得到的矩阵,也就是。而

J = sumsq(h_theta - y) / (2 * m );

就是公式2的Octave代码实现。

2. Gradient Descent求解Cost function

现在问题转化为了一个优化问题:已知samples:,求的值,使得Cost function尽可能小。

这里使用梯度下降法(Gradient Descent),具体的细节在系列其它文章已有讨论,不再赘述。

对Cost function的分别求偏导,有:

在每一次梯度下降的迭代中,更新

梯度下降的Octave代码:

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
%GRADIENTDESCENT Performs gradient descent to learn theta
%   theta = GRADIENTDESCENT(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.
    %
    h_theta = X * theta;
    cost = h_theta - y;
    theta0_update = alpha * sum(cost .* X(:,1)) / m;
    theta1_update = alpha * sum(cost .* X(:,2)) / m;
    theta(1) = theta(1) - theta0_update;
    theta(2) = theta(2) - theta1_update;
    % ============================================================

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

end

end

其中.*表示element multiplication,X(:,1)表示取矩阵X的第1列。

alpha=0.01,num_iters=1500,在1500次迭代之后,有:

相应的如下图:

Fig.2 linear regression of population-profit
Fig.2 linear regression of population-profit