到这里,公式就推导完毕了。
看个例子明白点:
希望可以将带星号和带加号区分开来
下面是主要代码:
function [th,ll] = plotdots(x,y,z)
% rows of X are training samples
% rows of Y are corresponding 0/1 values
hold on;
%% 画原始点的图
for i = 1:size(x,1)
if(z(i)==0)
plot(x(i),y(i),'*');
elseif (z(i)==1)
plot(x(i),y(i),'+');
end
end
xy = [x,y];
[th,ll] = logistic_grad_ascent(xy,z);
t = x;
X = [ones(size(xy,1),1), x];
thx = th(1:2);
thy = -th(3);
y1 = X*thx./thy;
plot(t,y1,'r-');
end
logistic_grad_ascent函数:
这个函数的for循环就是上面推导公式的应用,也就是算法的核心:
(1)hx的得到sigmoid的值,就是公式(1),
(2)theta是不断迭代siyata(不想贴图片了,囧),就是公式(8)
(3)ll(k)就是公式(5)
function [theta, ll] = logistic_grad_ascent(X,y)
% rows of X are training samples
% rows of Y are corresponding 0/1 values
% output ll: vector of log-likelihood values at each iteration
% ouptut theta: parameters
alpha = 0.01; %步长
[m,n] = size(X);
max_iters = 50000; %迭代次数
X = [ones(size(X,1),1), X]; % append col of ones for intercept term
theta = zeros(n+1, 1); % initialize theta
for k = 1:max_iters
hx = sigmoid(X*theta);
theta = theta + alpha * X' * (y-hx);
ll(k) = sum( y .* log(hx) + (1 - y) .* log(1 - hx) );
end
最后得到的结果.
可以拓展成三维四维的情况,不过四维以后就不是那么好直观看了。