数据
数据下载: ex3Data.zip。看过斯坦福大学吴恩达老师的机器学习课程的同学都知道一个关于房子大小与房子价格的数据集,我们本次选用的数据集正是这47个样本数据,x表示房子面积与卧室的数量,y表示房子的价格。我们的目标是预测房子大小为1650,且卧室有3个的房子的价格。
数据预处理
数据添加x0项,该项数据初始化为1
x = [ones(m, 1), x];
数据尺寸大小的不同对梯度下降算法的影响较大,我们应对数据进行一种映射处理。具体方法是先求标准偏差以及平均值,然后该数据减去均值后再除以标准偏差即可。
sigma = std(x);%求标准偏差 mu = mean(x); %求均值 x(:,2) = (x(:,2) - mu(2))./ sigma(2); %对第二列房子面积进行处理 x(:,3) = (x(:,3) - mu(3))./ sigma(3); %对第三列房子卧室数量进行处理
梯度下降
关于梯度下降相关公式可参考上一篇博文,此处不再重复介绍。
学习率的选择
学习率的选择范围一般在
|
通过运行梯度下降法观察损失函数的函数值变化相应的调整学习率大小,以便寻找最佳的学习率
theta = zeros(size(x(1,:)))'; % initialize fitting parameters alpha = %% Your initial learning rate %% J = zeros(50, 1); for num_iterations = 1:50 J(num_iterations) = %% Calculate your cost function here %% theta = %% Result of gradient descent update %% end % now plot J % technically, the first J starts at the zero-eth iteration % but Matlab/Octave doesn't have a zero index figure; plot(0:49, J(1:50), '-') xlabel('Number of iterations') ylabel('Cost J')
如果你在一个比较好的范围内选择了一个学习率,你应该会出现如下图所示的曲线图。
如果你得到的曲线图与它很不相同时,你应该试着去调整你的学习率。
当然,你也可以使用正规方程组方式求解。
下面我们给出主要程序代码:
%% 方法一:梯度下降法 x = load('ex3x.dat'); y = load('ex3y.dat'); x = [ones(size(x,1),1) x]; meanx = mean(x);%求均值 sigmax = std(x);%求标准偏差 x(:,2) = (x(:,2)-meanx(2))./sigmax(2); x(:,3) = (x(:,3)-meanx(3))./sigmax(3); figure itera_num = 100; %尝试的迭代次数 sample_num = size(x,1); %训练样本的次数 alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];%因为差不多是选取每个3倍的学习率来测试,所以直接枚举出来 plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'}; theta_grad_descent = zeros(size(x(1,:))); for alpha_i = 1:length(alpha) %尝试看哪个学习速率最好 theta = zeros(size(x,2),1); %theta的初始值赋值为0 Jtheta = zeros(itera_num, 1); for i = 1:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数 Jtheta(i) = (1/(2*sample_num)).*(x*theta-y)'*(x*theta-y);%Jtheta是个行向量 grad = (1/sample_num).*x'*(x*theta-y); theta = theta - alpha(alpha_i).*grad; end plot(0:49, Jtheta(1:50),char(plotstyle(alpha_i)),'LineWidth', 2)%此处一定要通过char函数来转换 hold on if(1 == alpha(alpha_i)) %通过实验发现alpha为1时效果最好,则此时的迭代后的theta值为所求的值 theta_grad_descent = theta end end legend('0.01','0.03','0.1','0.3','1','1.3'); xlabel('Number of iterations') ylabel('Cost function') %下面是预测公式 price_grad_descend = theta_grad_descent'*[1 (1650-meanx(2))/sigmax(2) (3-meanx(3)/sigmax(3))]' %%方法二:normal equations x = load('ex3x.dat'); y = load('ex3y.dat'); x = [ones(size(x,1),1) x]; theta_norequ = inv((x'*x))*x'*y price_norequ = theta_norequ'*[1 1650 3]'
用梯度下降法在各个不同学习率下求得的曲线图如下:
由图可知,当学习率为1时,收敛的最快,所以我们选用学习率为1,求得的参数及预测数据结果如下
当我们采用正规方程组求解时,得到的参数及预测结果数据如下:
计算结果略有误差,但差异不大,基本为29万多点。
参考文章:
http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex3/ex3.html