使用fminunc实现的线性回归

时间:2017-06-30 13:58:13

标签: octave linear-regression

我正在尝试使用Octave中的fminunc仅使用一个功能实现线性回归。

这是我的代码。

x = load('/home/battousai/Downloads/ex2Data/ex2x.dat');
y = load('/home/battousai/Downloads/ex2Data/ex2y.dat');

m = length(y);
x = [ones(m , 1) , x];
theta = [0 , 0]';

X0 = [x , y , theta];

options = optimset('GradObj' , 'on' , 'MaxIter' , 1500);
[x , val] = fminunc(@computeCost , X0 , options) 

这是成本函数,它返回梯度以及成本函数的值。

function [J , gradient] = computeCost(x , y , theta)
  m = length(y);
  J = (0.5 / m) .* (x * theta - y )' * (x * theta - y );
  gradient = (1/m) .* x' * (x * theta - y);
end

数据集的长度为50,即维度为50 x 1。我不知道如何将X0传递给fminunc

更新了驱动程序代码:

x = load('/home/battousai/Downloads/ex2Data/ex2x.dat');
y = load('/home/battousai/Downloads/ex2Data/ex2y.dat');

m = length(y);
x = [ones(m , 1) x];
theta_initial = [0 , 0];
options = optimset('Display','iter','GradObj','on' , 'MaxIter' , 100);
[X , Cost] = fminunc(@(t)(computeCost(x , y , theta)), theta_initial , options) 

更新了成本函数代码:

function [J , gradient] = computeCost(x , y , theta)
  m = length(y);
  J = (1/(2*m)) * ((x * theta) - y )' * ((x * theta) - y) ;
  gradient = (1 / m) .* x' * ((x * theta) - y);  
end

现在我将theta的值设为[0,0]但是当我使用普通方程时,theta的值变为[0.750163 , 0.063881]

1 个答案:

答案 0 :(得分:2)

来自fminunc的文档:

  

FCN应接受定义未知变量的向量(数组)

  

X0确定开始猜测。

由于您的输入是 cost 函数(即它将您选择的参数向量与成本相关联),您的成本函数的输入参数需要通过fminunc进行优化只有theta,因为xy(即你的观察和你的目标)被认为是问题的“给定”方面,而不是你想要优化的东西。因此,您要声明xy全局,并从您的函数中访问它们,如下所示:

function [J , gradient] = computeCost(theta_0)
  global x; global y;
  % ...

然后将fminunc调用为:fminunc (@computeCost, t_0, options)

,将您的computeCost函数保留为computeCost(x, y, theta),并将fminunc调用更改为以下内容:

[x , val] = fminunc(@ (t) computeCost(x, y, t) , t0 , options) 

更新不确定您做错了什么。这是完整的代码和运行它的八度音程。看起来很好。

%% in file myscript.m
x = load('ex2x.dat');
y = load('ex2y.dat');

m = length(y);
x = [ones(m , 1) , x];
theta_0 = [0 , 0]';

options = optimset('GradObj' , 'on' , 'MaxIter' , 1500);
[theta_opt, cost] = fminunc(@ (t) computeCost(x,y,t) , theta_0 , options) 

%% in file computeCost.m
function [J , gradient] = computeCost(x , y , theta)
  m = length(y);
  J = (0.5 / m) .* (x * theta - y )' * (x * theta - y );
  gradient = (1/m) .* x' * (x * theta - y);
end

%% in the octave terminal:
>> myscript
theta_opt =

   0.750163
   0.063881

cost =    9.8707e-04