昨天介绍的最小二乘算法中,有个使用输入样本X生成的H矩阵,可以使用
得到最优的参数,该表达式是由J关于求偏导,并且令偏导数为0得到的结果,但是,实际中得到的H矩阵维数可能非常大,这时候使用上式计算时会出现内存不足的情况。在这种情况下,使用随机梯度算法旺旺会产生很好的效果。
随机梯度下降(SGD, stochastic gradient descent):名字中已经体现了核心思想,随机选取一个店做梯度下降,而不是遍历所有样本后进行参数迭代。因为梯度下降法的代价函数计算需要遍历所有样本,而且是每次迭代都要遍历,直至达到局部最优解,在样本量庞大时就显得收敛速度比较慢了,计算量非常庞大。
SGD的迭代表达式如下:
代码如下:
clear; closeall; clc;
n = 50;% 训练样本个数
N = 1000;% 测试样本个数
x = linspace(-3,3,n)';% n个样本服从-3到3的均匀分布
X = linspace(-3,3,N)';
pix = pi*x;
y = sin(pix)./pix - 0.01*x + 0.05*randn(n,1);% 拟合的函数
hh = 2*0.3^2;
t0 = randn(n,1);
e = 0.1;% 学习率
eps = 1e-6;
foro = 1:n*1000
i = ceil(rand*n);% 随机选择某个训练样本
ki = exp(-(x-x(i)).^2/hh);
t = t0 - e*ki*(ki'*t0 - y(i));% 梯度下降
ifnorm(t-t0)
break;
end
t0 = t;
end
K = exp(-(repmat(X.^2,1,n) + repmat(x.^2',N,1) - 2*X*x')/hh);
F = K*t;
plot(X,F,'g-','linewidth',2);
holdon
plot(x,y,'bo','linewidth',2);
axis([-2.8,2.8,-0.5,1.2]);
legend('测试样本','训练样本');
运行结果如下:
以上就是今天推送的内容,欢迎讨论。
领取专属 10元无门槛券
私享最新 技术干货