【发布时间】:2017-02-18 08:51:33
【问题描述】:
我正在尝试在 MATLAB 中实现随机梯度下降,但我在某个地方出错了。我认为我检查收敛的方式可能不正确(我不太确定如何在每次迭代中更新估计器),但我不确定。我一直在尝试拟合基本的线性数据,但我得到的结果相去甚远,我希望能得到一些帮助。有人能指出我哪里出错了,为什么这不能正常工作?
谢谢!
这是数据设置和通用代码:
clear all;
close all;
clc
N_features = 2;
d = 100;
m = 100;
X_train = 10*rand(d,1);
X_test = 10*rand(d,1);
X_train = [ones(d,1) X_train];
X_test = [ones(d,1) X_test];
y_train = 5 + X_train(:,2) + 0.5*randn(d,1);
y_test = 5 + X_test(:,2) + 0.5*randn(d,1);
gamma = 0.01; %learning rate
[sgd_est_train,sgd_est_test,SSE_train,SSE_test,w] = stoch_grad(d,m,N_features,X_train,y_train,X_test,y_test,gamma);
figure(1)
plot(X_train(:,2),sgd_est_train,'ro',X_train(:,2),y_train,'go')
figure(2)
plot(X_test(:,2),sgd_est_test,'bo',X_test(:,2),y_test,'go')
而真正实现SGD的函数是:
% stochastic gradient descent
function [sgd_est_train,sgd_est_test,SSE_train,SSE_test,w] = stoch_grad(d,m,N_features,X_train,y_train,X_test,y_test,gamma)
epsilon = 0.01; %convergence criterion
max_iter = 10000;
w0 = zeros(N_features,1); %initial guess
w = zeros(N_features,1); %for convenience
x = zeros(d,1);
z = zeros(d,1);
for jj=1:max_iter;
for kk=1:d;
x = X_train(kk,:)';
z = gamma*((w0'*x-y_train(kk))*x);
w = w0 - z;
end
if norm(w0-w,2)<epsilon
break;
else
w0 = w;
end
end
sgd_est_test = zeros(m,1);
sgd_est_train = zeros(d,1);
for ll=1:m;
sgd_est_test(ll,1) = w'*X_test(ll,:)';
end
for ii=1:d;
sgd_est_train(ii,1) = w'*X_train(ii,:)';
end
SSE_test = sum((sgd_est_test - y_test).^2);
SSE_train = sum((sgd_est_train - y_train).^2);
end
【问题讨论】:
-
你能描述一下变量吗?他们的意思是什么?我可能会帮上忙,但除非我确切地知道你在做什么,否则我帮不了。
-
示例:你的更新方程是什么?你能用数学形式给我写出梯度吗?
-
我测试了一下:我 98% 确信您对
w的更新是错误的,即z=....行。如果你从数据中去除噪音并给出它工作的确切解决方案。如果你改变一点w0(2),那么它会找到正确的值,但是如果你改变w0(1),那么它就不会收敛。 -
嗨@AnderBiguri,对此感到抱歉,我对这个网站还很陌生,不知道该写什么。我使用的更新方程是:
w = w_0-\gamma (w^Tx_i - y_i)x_i,其中w是估计器的更新,w_0是估计器的先前猜测,\gamma是学习率,x_i是 @987654332 @th 个特征向量的样本,y_i是你想学习的函数的ith 个样本。
标签: matlab machine-learning linear-regression gradient-descent