本文共 1369 字,大约阅读时间需要 4 分钟。
代价函数:
下降梯度:
假设函数:
x代表年龄,y代表身高
预测身高与年龄的关系
Code:
x = load('ex2x.dat'); y = load('ex2y.dat');[m,n] = size(x);x = [ones(m,1),x];%偏置项 x0 = 1figure % open a new figure windowplot(x(:,2), y, 'o');%袁术数据分布hold on;ylabel('Height in meters')xlabel('Age in years');inittheta = zeros(n+1,1);[theta J] = linearReg(x,y,inittheta);%下降梯度函数 求theta 与各步代价plot(x(:,2),x*theta,'g');%画出边界函数hold off;
linearRegression:
function [theta J] = linearReg(x,y,inittheta) % x0已经被置为1了 [m,n] = size(x); theta = inittheta; MAX_ITR = 1500; %迭代 1500次 alpha = 0.07;%学习率 J = zeros(MAX_ITR,1); for i = 1:MAX_ITR h = x*theta;//预测值 grad = (1/m).*(x'*(h-y));%梯度向量 theta = theta - alpha*grad; J(i) = 1/(2*m)*(sum((h-y).^2));%每一步的代价 end
可以画出代价函数随着两个参数theta(1),theta(2)的取值变化情况:
执行命令:
J_vals = J_vals';figure;surf(theta0_vals, theta1_vals, J_vals);hold on;xlabel('\theta_0'); ylabel('\theta_1');
测试函数
function J_vals = testJ(x,y) [m,n] = size(x); J_vals = zeros(100, 100); % initialize Jvals to 100x100 matrix of 0's theta0_vals = linspace(-3, 3, 100); theta1_vals = linspace(-1, 1, 100); for i = 1:length(theta0_vals) for j = 1:length(theta1_vals) t = [theta0_vals(i); theta1_vals(j)]; J_vals(i,j) = 1/(2*m)*(sum((x*t-y).^2)); end end
代价随参数变化情况:
还可画出等高线:
contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15))xlabel('\theta_0'); ylabel('\theta_1')
参考:(内含数据)