Градиентный спуск - логистическая регрессия - странные тэты - PullRequest
0 голосов
/ 30 октября 2019

Выполнение моей функции градиентного спуска по данным обучения дает тэты [0.3157;0,0176;0,0148]. Первое значение значительно выше, чем другие. Когда дело доходит до предсказания вероятности моих тестовых данных, получается 0,42 + - 0,01. Что делает вероятность быть ближе к 0, всегда. Я считаю, что ошибка основана на функции градиентного спуска.

Функция градиентного спуска

function [theta] = GradientDescent(x, y)
    m = size(x,1);  
    n = size(x,2);  

    theta = zeros(n,1);
    alpha = .005; 
    iterations = 10000; 
    J=[];

    for i = 1:iterations
        h = x * theta;
        theta = theta - (alpha/m)* x' * (h-y);
        J_old = J;
        J = -(1/m) * sum(y .* log(h) + (1 - y) .* log(1-h));
        if((i>2 && abs(J_old - J) < 10^-5))
             break;
        end
        if(any(isnan(theta())))
            disp("breaking the iterations since theta returns NaN values");
            break;
        end
    end
    disp("Performing Gradient descent -  with "+n+" features");
end

Основной код - загрузка данных и вероятность запуска

[X, Y] = LoadData("train_q1.csv");
scatter(X(:, 2), X(:, 3), 25, Y);
% 1 is buy - on the ends
% 0 is sell - in the middle
%============ 1b.
thetas = ones(3, 1);
[theta] = GradientDescent(X, Y);
disp(theta);
% get accuracy
[trainX, trainY] = LoadData("test_q1.csv");

correct = 0;
%probability
for i=1:length(trainY)
    disp(1 ./ (1 + exp(trainX(i, :) * theta)));
    probability = round(1 ./ (1 + exp(trainX(i, :) * theta)));
    if trainY(i) == probability
        correct = correct + 1;
    end
end
disp(correct);
% print accuracy
disp("The model is " + (correct/length(trainY) * 100) + "% correct");

1 Ответ

0 голосов
/ 31 октября 2019
  • Вы использовали h = x * theta внутри вашей функции GradientDescent(..), чтобы вычислить неправильную функцию гипотезы. Это должно быть h = 1./(1 + exp(-x*theta)) (обратите внимание на знак минус).
  • Поэтому, когда вы вычисляете вероятность, она должна быть disp(1 ./ (1 + exp(-(trainX(i, :) * theta)))). Обратите внимание, что вы не включили знак минус (-) внутри exp () .

  • Также в [trainX, trainY] = LoadData("test_q1.csv") имена неверны. Это должно быть testX, testY , а не trainX, trainY, потому что вы загружаете набор тестовых данных (test_q1.csv).

...