拟合的代价函数
目标:
用直线把一组数据拟合到最好(虽然已经有成熟的最小二乘法,但是这里不用)。首先要有一组训练数据,M代表训练数据的总数,假设为47。
这里需要有一个假设函数(Hypothesis),也就是用来拟合的函数形式,这里因为要用直线线性拟合,故假设函数为:
其中 被称为模型参数。目标就是确定这些参数的值。
梯度下降算法
问题描述
- 有一个目标函数
- 目标:求使得J取到最小值的 的值
梯度下降法
首先初始化向量 ,并沿梯度方向更新向量 (改变 的值使得代价函数最快的变小),直到达到了预期的最小值。如图所示:
注意 梯度下降法找到的是局部最优解,而不是全局最优。具体是哪一个局部最优取决于初始值,如下图:
梯度下降法的核心算法伪代码所示如下:
for j = 0 and j = 1:
repeat until convergence {
另外注意 在循环过程中必须同时更新向量 中的每一个分量,不能先更新某一个分量再来计算更新另一个分量,即每一次更新计算都必须使用上一个点出的值。
循环内的算法
更新 向量的两个式子如下:
其中 为代价函数,为:
对于线性回归的代价函数(如上)来说,它是一个弓形函数(convex function),它只存在一个局部最优,就是全局最优。所以对于这个函数使用梯度下降法并不会像最开始说梯度下降一样陷入某个局部最优。
下面将偏导数计算出结果来,迭代表达式如下:
MATLAB代码实现
使用MATLAB代码实现,若假设样本数据 存在向量x和y中,代码如下:
自己写代码运行发现,若数据点过少(10个左右)的时候可能导致算法发散;当数据点数目改成100个时才能看到明显收敛现象(数据点数目,步长
$\alpha$
、迭代次数等相关量都对结果有影响。
%先随机产生样本,存在x和y中
x = rand(1,100);
y = 13 + 7*x;
m = 100;
alpha = 0.1;
n = 601; %迭代次数
%初始化theta向量和假设函数的句柄函数
theta0 = 0;
theta1 = 0;
h = @(x)(theta0 + theta1*x);
%开始迭代
for i = 1:n
sum0 = 0;
sum1 = 0;
for j = 1:m
sum0 = sum0 + h(x(j))-y(j);
sum1 = sum1 + (h(x(j))-y(j))*x(j);
end
theta0 = theta0 - alpha*(1/m)*sum0;
theta1 = theta1 - alpha*(1/m)*sum1;
h = @(x)(theta0+theta1*x); %重置句柄假设函数
if mod(i,20) == 0
fprintf('(%d,%d)\n',theta0,theta1);
end
end