我在Octave 5.1.0上尝试对一组数据进行线性回归,该数据集将GRE分数与录取概率相关联。数据集的形式如下,
337 0.92
324 0.76
316 0.72
322 0.8
.
.
.
我的主程序文件Program.m如下,
% read the data data = load('Admission_Predict.txt'); % initiate variables x = data(:,1); y = data(:,2); m = length(y); theta = zeros(2,1); alpha = 0.01; iters = 1500; J_hist = zeros(iters,1); % plot data subplot(1,2,1); plot(x,y,'rx','MarkerSize', 10); title('training data'); % compute cost function x = [ones(m,1), (data(:,1) ./ 300)]; % feature scaling J = computeCost(x,y,theta); % run gradient descent [theta, J_hist] = gradientDescent(x,y,theta,alpha,iters); hold on; subplot(1,2,1); plot((x(:,2) .* 300), (x*theta),'-'); xlabel('GRE score'); ylabel('Probability'); hold off; subplot (1,2,2); plot(1:iters, J_hist, '-b'); xlabel('no: of iteration'); ylabel('Cost function');
computeCost.m文件如下,
function J = computeCost(x,y,theta) m = length(y); h = x * theta; J = (1/(2*m))*sum((h-y) .^ 2);endfunction
而gradientDescent.m文件如下,
function [theta, J_hist] = gradientDescent(x,y,theta,alpha,iters) m = length(y); J_hist = zeros(iters,1); for i=1:iters diff = (x*theta - y); theta = theta - (alpha * (1/(m))) * (x' * diff); J_hist(i) = computeCost(x,y,theta); endforendfunction
然后绘制的图表看起来像这样,
从图表中可以看出,尽管我的成本函数似乎已经最小化,但结果看起来并不正确。
请问有人能告诉我这是正确的吗?如果不是,我哪里做错了?
回答:
检查你的实现是否正确的简单方法是与一个经过验证的线性回归实现进行比较。我建议使用这里建议的另一种实现方法,然后比较你的结果。如果拟合结果一致,那么这就是你数据的最佳线性拟合;如果不一致,那么你的实现可能存在问题。