Линейная регрессия с использованием реализации fminunc



Я пытаюсь реализовать линейную регрессию только с одной функцией, используя 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].
466   1  

1 ответ:

Из документации для fminunc:

FCN должен принимать вектор (массив), определяющий неизвестные переменные

И

X0 определяет начальную догадку.

Поскольку ваши входные данные-это функция cost (то есть она связывает ваш выбор вектора параметров со стоимостью), входной аргумент для вашей функции затрат, который должен быть оптимизирован с помощью fminunc, является только тэтой, так как x и y (то есть ваши наблюдения и ваши результаты). цели) считаются "заданными" аспектами проблемы и не являются тем, что вы пытаетесь оптимизировать. Таким образом, вы либо объявляете x и y глобальными и обращаетесь к ним из своей функции следующим образом:

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

Comments

    Ничего не найдено.