在上次进行了画图之后,这次重点讲一下梯度下降,这个在后面的作业中会反复用到
2.2 梯度下降
梯度下降的目的是得到一个线性回归的估计参数
进行计算之前我们再来回顾一下梯度下降。其实在这里你并不用了解梯度下降的具体原理,现在我们只需要明确梯度下降是一种寻找让代价函数最小的方式。
2.2.1 更新等式
梯度函数是根据代价函数计算出来的,因此我们需要回顾一下代价函数:
这里
线性回归,顾名思义就是通过线性函数来,我们的目标就是通过调整直线的斜率和截距,让误差函数最小,误差函数中的就是估计值减去实际值再平方,为什么平方?是因为如果不平方的话如果估计值小于理论值这个误差就是负数,直接加会减少误差。
我们用梯度下降来逐渐修改值,确定值其实只需要两组数据就够了,因为两点就能确定一条直线。
现在给出梯度下降中的值更新式子:
警告:需要注意的是所有必须同步更新!!!
%% =================== Part 3: Cost and Gradient descent ===================
X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters 这里定义了两行一列的theta向量,当然都是0
% Some gradient descent settings 梯度下降的设置
iterations = 1500; %迭代次数 也就是我们要计算1500次参数
alpha = 0.01; %计算步长,可以看做是一次下降多少的调整
这部分是对梯度下降进行了初始化
首先对数据x增加了一列全1的数字,为什么?因为我们可以看出实际上我们有两个,一个是没有跟数据进行计算的,这样的话我们需要对数据进行补齐,方便我们后面的矩阵运算。
这里回顾一下步长设置对下降的影响:
1)步长越大下降越快
2)步长过大会导致梯度下降震荡无法收敛,可以理解为在最低点之外荡秋千,始终无法收敛
fprintf('\nTesting the cost function ...\n')
% compute and display initial cost
J = computeCost(X, y, theta);
fprintf('With theta = [0 ; 0]\nCost computed = %f\n', J);
fprintf('Expected cost value (approx) 32.07\n');
这里开始就要计算代价函数了,这里给出了预计的一个代价函数值,可以跟你自己计算出来的对比,看是否正确,
这里theta都是0哦
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.
J=sum((X*theta-y).^2)/(2*m);
% =========================================================================
end
这里贴出我自己的计算代价函数的值,这里我直接用了矩阵的方式,没有采用循环,事实上矩阵方式往往更简洁,但是需要你时时刻刻把握矩阵的维度
在接下来的作业中最重要的事说三遍!
维度 维度 维度!
我们从维度来对这个计算进行分析,首先我们最后得到是一个数字,也就是1x1。
X是我们的数据,有m组,显然通过我们补1后,现在的数据矩阵是mx2,然后我们再看里面的平方,是点乘,即每个元素,因为这时我们计算出来的是一个mx2矩阵乘2x1矩阵=mx1的向量,这个正好可以减去mx1的y向量,因为我们m数据自然有m个已经存在的y值,这样一分析维度对应,意义对应,我们的计算肯定是没问题的,最后这个sum是可以把所有元素相加的神奇函数。
Testing the cost function ...
With theta = [0 ; 0]
Cost computed = 32.072734
Expected cost value (approx) 32.07
输出结果可以看到,没有问题,非常正确
---------------------
原文:https://blog.csdn.net/cactusff/article/details/79953733