机器学习—西瓜书-chapter3—对率回归

编程实现对率回归,并给出西瓜数据集3.0α上的结果

对率函数是任意阶可导的凸函数,这是非常重要的性质。

西瓜数据集3.0

机器学习—西瓜书-chapter3—对率回归_第1张图片

暂时不知道什么原因导致,结果差别这么大,记录下来。

%matlab code
%对率回归 西瓜数据集3.0ɑ
old_l=0;    %记录上次计算的l
n=0;    %计算迭代次数
b=[0;0;1];  %初始参数 (自定义)

x = xlsread('E:\matlab-work\watermelon_book\3.0alpha.xlsx', 'sheet1', 'A1:Q3');%数据集包含,第一行17个 ,密度值,第二行17个 ,含糖率
y = xlsread('E:\matlab-work\watermelon_book\3.0alpha.xlsx', 'sheet1', 'A3:Q3');%获取含糖率

while(1)
   cur_l=0;
   bx=zeros(17,1); 
   %计算当前参数下的l
   for i=1:17
        bx(i) = b.'*x(:,i); %获取对应的好瓜坏瓜的判断结果(0,1)
        cur_l = cur_l + ((-y(i)*bx(i)) )+log(1+exp(bx(i)));
   end
 %迭代终止条件
        if abs(cur_l-old_l)<0.001  
            break;
        end
   %更新参数(牛顿迭代法)以及保存当前l
   p1=zeros(17,1);
   n=n+1;
   old_l = cur_l;
   dl=0;
   d2l=0;

   for i=1:17
        p1(i) = 1 - 1/(1+exp(bx(i)));
        dl = dl - x(:,i)*(y(i)-p1(i));
        d2l = d2l + x(:,i) * x(:,i).'*p1(i)*(1-p1(i));
   end
   b = b - d2l\dl;
end

%画出散点图以及计算出的直线
%逐点画  分别表示是否好瓜
for i=1:17     
    if y(i)==1
       plot(x(1,i),x(2,i),'+r');
       hold on;
    else if y(i)==0
          plot(x(1,i),x(2,i),'og');    
          hold on;
        end
    end
end
%计算出直线边界点 并绘制直线
ply=-(0.1*b(1)+b(3))/b(2);
pry=-(0.9*b(1)+b(3))/b(2);
line([0.1 0.9],[ply pry]);

xlabel('密度');
ylabel('含糖率');
title('对率回归'); 
set(gca,'Fontname','Monospaced');

你可能感兴趣的:(西瓜书)