继续学习http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html,上一节课学习速率是固定的,而这里我们的目的是找到一个比较好的学习速率。我们主要是观察 不同的学习速率对应的不同的损失值与迭代次数之间的函数曲线是怎么样的,找到那条最快达到收敛的函数曲线,其对应的学习速率就是我们要找的比较好的学习速率。在这里我们分别取速率值为:0.001,0.01,0.1,1,2,当我们选择完学习速率后,其余的都跟上一节课一样了。本文要解决的问题是给出了47个训练样本,训练样本的y值为房子的价格,x属性有2个,一个是房子的大小,另一个是房子卧室的个数。需要通过这些训练数据来学习系统的函数,从而预测房子大小为1650,且卧室有3个的房子的价格。
代码如下:
x = load(‘ex3x.dat‘); y = load(‘ex3y.dat‘); x = [ones(size(x,1),1) x];%每一行是一个样本,在这里每个样本增加一维1,原因在前面课说了(讲wx+b变成w‘x齐次的) meanx = mean(x);%求均值 接下来四行是让样本的每一维度(除第一维1外)的值标准化。 sigmax = std(x);%求标准偏差 但是前面不是说线性的不用进行feature scale吗(第一课讲的) 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--‘};%建了一个包,每一个值代表画出的曲线样式不同,b是blue蓝色, %r是red ,g是green..b--是blue颜色--代表的是虚线,而前面那些不加的是实现。 theta_grad_descent = zeros(size(x(1,:))); for alpha_i = 1:length(alpha) %alpha_i是1,2,...6,表示的是学习速率向量和曲线格式向量的坐标:alpha(alpha_i),plotstyle(alpha_i) theta = zeros(size(x,2),1); %theta是cost function的参数,初始值赋值为0向量(3*1的向量,x有几维theta就是几维的参数向量) Jtheta = zeros(itera_num, 1);%Jthete是个100*1的向量,第n个元素代表第n次迭代cost function的值(预测与真实y的总均方误差) for i = 1:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数 Jtheta(i) = (1/(2*sample_num)).*(x*theta-y)‘*(x*theta-y);%Jtheta是个100*1的列向量。(x*theta-y)‘*(x*theta-y)代表的就是 %cost function 公式的那个平方,因为在向量水平上平方没有直接平方,所以就是这种转置后内积的形式。并且得到的是 %一个标量,所以再与前面的系数相乘可以直接用*,而不用.* 还有一点是前面的系数 我还是不明白为什么 %是(1/(2*sample_num)) 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函数来转换因为包用()索引后得到的还是包cell, %所以才要用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))]‘
实验结果:
时间: 2024-11-09 22:57:30