机器学习——随机梯度最小二乘算法

昨天介绍的最小二乘算法中,有个使用输入样本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('测试样本','训练样本');

运行结果如下:

以上就是今天推送的内容,欢迎讨论。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329G1Z3PU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券