机器学习(周志华) 参考答案 第三章 线性模型 3.4

8 篇文章 0 订阅
3 篇文章 0 订阅

4.选择两个UCI数据集,比较10折交叉验证法和留一法所估计出的对率回归的错误率。

选取了UCI上iris数据集,内部共150个数据,3种类别,每类50个样本。
每次选择两类做二分类计算,做3轮计算。每轮选取100个样本,10折法选45正45反,剩下10个作为验证,一共10组,共验证100例;留一法每次留1个做验证,一共100组,也是100例。每个方法最终验证300例,直接比较错误分类的个数就能评价两种方法在该数据集上的适用程度。

一:Excel表处理iris数据集
iris数据集

二:10折交差验证

%对率回归 iris数据集
%数据集3类数据 A-AX AY-CV CW-ET   各50组
%为了程序读取方便对数据集做了处理1-6  1,2类数据 7-12 1,3类数据 13-18 2,3类数据   A-CV  

x = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'A52:E151'); %训练数据每次取两类100个
y = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'F52:F151');
%数据集分类用了1,2,3来表示  使用不同的类别对y的处理也不同(总之保证y的取值为{0,1})
y = y-1;
k=100;

%10折交差与留1法主体部分一样,只是在过滤用来验证样本的地方有区别 为了简单复制了大部分代码

%10折交差验证
err0=0;%记录错误分类的次数
for tn=0:9
   old_l=0;    %记录上次计算的l
   b=[0;0;0;0;1];  %初始参数 (自定义)
  while(1)
     cur_l=0;
     bx=zeros(k,1);
     %计算当前参数下的l
     for i=1:k
         if fix(mod(i-1,50)/5) == tn      %跳过用来检验的样本
             continue;
         end

          bx(i) = b.'*(x(i,:))';
          if bx(i)>30 %防止exp函数的参数过大导致无穷大 手动计算
              tlog=bx(i);
          else
              tlog=log(1+exp(bx(i)));
          end
          cur_l = cur_l - y(i)*bx(i) +tlog;
     end

     %迭代终止条件
     if abs(cur_l-old_l)<0.0001  
         break;
     end
     %更新参数(牛顿迭代法)以及保存当前l
     old_l = cur_l;
     p1=zeros(k,1);
     dl=0;
     d2l=0;

     for i=1:k
         if fix(mod(i-1,50)/5) == tn     %跳过用来检验的样本
             continue;
         end
          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=0:1   %用来检验的样本 如果出错则计数+1 每组5个1类5个2类
      for j=1:5
          tmp = 1/(1+exp(-b.'*x(i*50+5*tn+j,:)'));
          tmp = (tmp>=0.5);
          err0 = err0 + (tmp ~= y(i*50+5*tn+j));
      end
  end
err0
end    

三:结果
这里写图片描述
出错的共有三次

四:留1法

%对率回归 iris数据集
%数据集3类数据 A-AX AY-CV CW-ET   各50组
%为了程序读取方便对数据集做了处理1-6  1,2类数据 7-12 1,3类数据 13-18 2,3类数据   A-CV  

x = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'A52:E151'); %训练数据每次取两类100个
y = xlsread('E:\Program Files\octave\iris.xlsx', 'Sheet1', 'F52:F151');
%数据集分类用了1,2,3来表示  使用不同的类别对y的处理也不同(总之保证y的取值为{0,1})
y = y-1;
k=100;

%留1法
err1=0;%记录错误分类的次数
for tn=1:k
    n=0;
   old_l=0;    %记录上次计算的l
   b=[0;0;0;0;1];  %初始参数 (自定义)
while(1)
   cur_l=0;
   bx=zeros(k,1);
   %计算当前参数下的l
   for i=1:k
       if i == tn     %跳过用来检验的样本
           continue;
       end
        bx(i) = b.'*(x(i,:))'; %防止exp函数的参数过大导致无穷大 手动计算
        if bx(i)>30
            tlog=bx(i);
        else
            tlog=log(1+exp(bx(i)));
        end
        cur_l = cur_l - y(i)*bx(i) +tlog;
   end

   %迭代终止条件
   if abs(cur_l-old_l)<0.001  
       break;
   end
   n=n+1;
   %更新参数(牛顿迭代法)以及保存当前l
   old_l = cur_l;
   p1=zeros(k,1);
   dl=0;
   d2l=0;

   for i=1:k
        if i == tn     %跳过用来检验的样本
           continue;
        end
        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
    %用来检验的样本 如果出错则计数+1 每组1个
   tmp = 1/(1+exp(-b.'*(x(tn,:))'));
   tmp = (tmp>=0.5);
   err1 = err1 + (tmp ~= y(tn));
   err1
end

五:运行结果
这里写图片描述
出错的共有三次

来自

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值