您的位置:首页 > 其它

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

2016-08-25 20:02 323 查看
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;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐