观察原始数据分布
function plotData(X,y)
figure;
%一种类别一种画法
one=find(y==1)
zero=find(y==0)%返回类别为0的下标
plot(X(one,1),X(one,2),'rx','MarkerSize',10);
hold on;
plot(X(zero,1),X(zero,2),'ro','MarkerFaceColor','y','MarkerSize',10);%填色操作
end
计算代价函数,求导
function g = sigmoid( z )
g=1./(1+exp(-z));%因为z是一个矩阵 除法运算不能将矩阵作为分母要./ 加法可以 代表每个元素加
end
function [J grad] = costFunction(theta, X, y);
m=length(y);
grad=zeros(size(theta));%返回倒数
J=0;
J=-( y'*log(sigmoid(X*theta))+(1-y)'*log(1-sigmoid(X*theta)) )/m;
%sigmoid的结果是m*1矩阵 X是m*3矩阵 grad是3*1
grad=X'*(sigmoid(X*theta)-y)/m;
end
正则化
1.两个特征映射为多个特征
function X = mapFeature(X1, X2)
degree=6;%最高次为6次
X=ones(size(X1(:,1)));
for i=1:degree
for j=0:i
X(:,end+1)=(X1.^(i-j)).*(X2.^j);%118行 28列 end+1在末列递增
end
end
end
2.正则化代价函数
function [J, grad] = costFunctionReg(theta, X, y, lambda)
m=length(y);
J=0;
grad=zeros(size(theta));%指定大小 后面用end
zhengzexiang= (lambda/(2*m))*sum(theta(2:end).^2); %theta0不算
J=-(y'*log(sigmoid(X*theta))+(1-y)'*log(1-sigmoid(X*theta)))/m+ zhengzexiang;
grad(1,1)=X(:,1)'*(sigmoid(X*theta)-y)/m;
grad(2:end,1)=X(:,2:end)'*(sigmoid(X*theta)-y)/m+lambda/m*theta(2:end);
end
3.绘制决策边界
function plotDecisionBoundary(theta, X, y);
%PLOTDECISIONBOUNDARY 此处显示有关此函数的摘要
% 此处显示详细说明
plotData(X(:,2:3),y);
hold on;
if size(X,2)<=3
plot_x=[min(X(:,2))-2,max(X(:,2))+2];%第一个特征量的范围为横轴
plot_y=(-1./theta(3)).*(theta(2).*plot_x+theta(1));
%决策边界是X*theta=0的值 theta0+theta1.x1+theta2.x2
plot( plot_x, plot_y);
else
u=linspace(-1,1.5,50);
v=linspace(-1,1.5,50);
z=zeros(length(u),length(v));
for i=1:length(u)
for j=1:length(v)
%u,v表示待映射的特征量
z(i,j)=mapFeature(u(i),v(j))*theta;
end;
end;
z=z';
contour(u,v,z,[0,0],'LineWidth',3);%决策边界的方程是X*theta=0 即z=0
end
end
4.算法准确度度量
function p = predict(theta, X)
%p=X*theta>0;
m=size(X,1)
p=zeros(m,1);
p=(sigmoid(X*theta)>=0.5);
end
p = predict(theta, X);
fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100);