我尝试在Octave中使用一些样本数据实现自己的线性回归模型,但theta值似乎不正确,且与正规方程提供的正确theta值不匹配。然而,使用Andrew Ng机器学习课程中的数据运行我的模型(使用不同的alpha和迭代次数)可以得到假设的正确theta值。我已经调整了alpha和迭代次数,使得成本函数下降。这是成本函数与迭代次数的图像。 如您所见,成本是下降并趋于平稳的,但没有达到足够低的成本。 有人能帮我理解这是为什么,以及我该如何解决这个问题吗?
这是数据(第一列是x值,第二列是y值):
20,4840,55.160,56.380,61.2100,68
这是数据图以及通过梯度下降(GD)和正规方程(NE)绘制的方程图。
主脚本代码:
clear , close all, clc;%loading the datadata = load("data1.txt");X = data(:,1);y = data(:,2);%Plotting the datafigureplot(X,y, 'xr', 'markersize', 7);xlabel("Mass in kg");ylabel("Length in cm");X = [ones(length(y),1), X];theta = ones(2, 1);alpha = 0.000001; num_iter = 4000;%Running gradientDescent[opt_theta, J_history] = gradientDescent(X, y, theta, alpha, num_iter);%Running Normal equationopt_theta_norm = pinv(X' * X) * X' * y;%Plotting the hypothesis for GD and NEhold onplot(X(:,2), X * opt_theta);plot(X(:,2), X * opt_theta_norm, 'g-.', "markersize",10);legend("Data", "GD", "NE");hold off%Plotting values of previous J with each iterationfigureplot(1:numel(J_history), J_history);xlabel("iterations"); ylabel("J");
用于查找梯度下降的函数:
function [theta, J_history] = gradientDescent (X, y, theta, alpha, num_iter)m = length(y);J_history = zeros(num_iter,1);for iter = 1:num_iter theta = theta - (alpha / m) * (X' * (X * theta - y)); J_history(iter) = computeCost(X, y, theta);endforendfunction
用于计算成本的函数:
function J = computeCost (X, y, theta) J = 0;m = length(y);errors = X * theta - y;J = sum(errors .^ 2) / (2 * m);endfunction
回答:
尝试使用alpha = 0.0001
和num_iter = 400000
。这将解决你的问题!
现在,你代码的问题在于学习率太低,这导致收敛速度变慢。此外,你没有给它足够的时间来收敛,因为你将训练迭代次数限制在了4000次,这对于给定的学习率来说是非常少的。
总结来说,问题是:学习率过低 + 迭代次数过少。