模式识别与机器学习(5)

http://www.cnblogs.com/tornadomeet/archive/2013/03/17/2964515.html



clear;
%x=load('./ex5Data/ex5Linx.dat');
%y=load('./ex5Data/ex5Liny.dat');
x=load('../Linear Regression/ex2Data/ex2x.dat');
y=load('../Linear Regression/ex2Data/ex2y.dat');
plot(x,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
x=[ones(length(x),1) ,x, x.^2, x.^3 ,x.^4,x.^5]; %这就是多项式模拟么?之前找了半天,不知怎么做的
[m, n]=size(x);
n=n-1;
%计算参数sidta,并且绘制出拟合曲线
rm=diag([0;ones(n,1)]); %lamda后面的矩阵

lamda=[0 1 10];
colortype={'g','b','r'};
sida=zeros(n+1,3);  %其实3个参数一起求了
%线性空间生成100个数
xrange=linspace(min(x(:,2)),max(x(:,2)))';
hold on;
for i=1:3
    sida(:,i)=inv(x'*x+lamda(i).*rm)*x'*y;
    norm_sida=norm(sida);
    yrange=[ones(size(xrange)),xrange,xrange.^2,xrange.^3,...
        xrange.^4,xrange.^5]*sida(:,i);
    plot(xrange,yrange,char(colortype(i)));
    hold on;
end
legend('traning data', '\lambda=0', '\lambda=1','\lambda=10')%注意转义字符的使用方法
hold off;


logistic_regu.m

clear;
figure;
addpath('./ex5Data');
x=load('./ex5Data/ex5Logx.dat');
y=load('./ex5Data/ex5Logy.dat');
%画出数据的分布图
plot(x(find(y),1),x(find(y),2),'o','MarkerFaceColor','b');
hold on;
plot(x(find(y==0),1),x(find(y==0),2),'r+');
legend('y=1','y=0');
x = map_feature(x(:,1), x(:,2)); %用高维,因为画的不是直线而是弯的,像这里就是圆
[m, n] = size(x);
theta = zeros(n, 1);
g = inline('1.0 ./ (1.0 + exp(-z))'); 
% setup for Newton's method
MAX_ITR = 15;
J = zeros(MAX_ITR, 1);
lambda = 1;%lambda=0,1,10
%牛顿法
for i=1:MAX_ITR
    z=x*theta;
    h=g(z);
    J(i)=(1/m)*sum(-y.*log(h)-(1-y).*log(1-h))+...
        (lambda/(2*m))*norm(theta)^2;
     G = (lambda/m).*theta;G(1) = 0 ;%这样不管什么时候,都能保证首项是正确的
     L = (lambda/m).*eye(n); L(1) = 0;
     grad = ((1/m).*x' * (h-y)) + G;
     H = ((1/m).*x' * diag(h) * diag(1-h) * x) + L;
     theta = theta - H\grad;
    %计算一阶导和2阶导
end

u = linspace(-1, 1.5, 200);
v = linspace(-1, 1.5, 200);
z1 = zeros(length(u), length(v));
for i = 1:length(u)
    for j = 1:length(v)
        z1(i,j) = map_feature(u(i), v(j))*theta;%这里绘制的并不是损失函数与迭代次数之间的曲线,而是线性变换后的值
    end
end
z1 = z1';
%下面画的是z1=0 的时候,也就是变量u v,取值的时候,z1为0,然后也就是等高线了。
contour(u, v, z1,[0,0], 'LineWidth', 2)%在z上画出为0值时的界面,因为为0时刚好概率为0.5,符合要求
legend('y = 1', 'y = 0', 'Decision boundary')
title(sprintf('\\lambda = %g', lambda), 'FontSize', 14);


hold off;









猜你喜欢

转载自blog.csdn.net/snailyww/article/details/52317756