matlab-自己实现感知器/线性分类器-DATASETS_Cork Stoppers_Cork Stoppers.xls数据集

数据集:

DATASETS_Cork Stoppers_Cork Stoppers.xls数据集下载地址:

https://pan.baidu.com/s/1QyLF-Th_v0SpFYwaHXUKIg


Part1:感知器分类器原理

和神经网络中的一个神经元很相似,对神经网络有初步了解的会很容易理解这个原理。

这里面的x即为输入一个样本的多个特征,w为权重,核心思想是不断调节权重,然后求和,使得求和结果最终通过Sigmoid函数都可以得到0或1的值,即为二分类的最终分类标签。

下面详细介绍一下:

二分类情况的规则:

即:




多分类情况同样可以转换成二分类情况:

常用的有两种方法:

1.ovo

原理:两两配对,产生(N-1)/2个二分类任务。

结果:最终投票产生最终的分类结果

2.OVR

原理:一对其余,产生N个分类器

结果:(1)只有一个分类器预测为正类,则该结果为最终结果

           (2)多个分类器都预测为正类,则选择置信度最大的类别标记作为分类结果

这里面一个非常重要的待解决问题是:如何确定权值?

首先需要明确两点:

1.如果权向量w存在,则这些样本被称为"线性可分"

2.解向量如果存在,通常不是唯一的。

如何确定权值-梯度下降算法:

1.定义准则函数J(w),当w为解向量时,J(w)为最小。-标量函数极小化问题。

2.梯度下降算法过程:

    (1)初始化权向量w(1)。

    (2)计算其梯度向量,w(2)由w(1)向下最陡的方向移动,即梯度的负方向

    (3)为学习率

    (4)希望得到一个权向量序列:最终收敛到一个使J(w)极小化的解上。

下面是梯度下降的伪代码:


Part2:实验工具、环境及数据集

Part3:仿真实验及结果


主函数代码:

clc
clear
%读取excel数据sheet2中的所有数据,num是所读取的数据
[num,txt,raw] = xlsread('DATASETS_Cork Stoppers_Cork Stoppers.xls',2);
%第二列是标签
label=num(:,2);
%第3到12列是特征
tz=num(:,3:12);

%初始化权值
w=ones(1,10);
%初始化学习率
alpha=0.001;
%初始化错误率阈值
theta =0.1;
%m,n为特征的行数和列数
[m,n]=size(tz);
%dataIndex为样本个数
dataIndex=1:m;
%k为更新权值的最大迭代次数
k=10000;

%将多分类标签转换为2分类标签
for i=1:m
    if(label(i)==1)
        label1(i)=1
    else
        label1(i)=0;
    end
end
label1=label1';

%梯度下降算法
for i=1:k
    %随机取一个样本用来更新权值
     randIndex =floor( rand()*(length(dataIndex)-1)+1);
   
     %计算 权值和特征的乘积
     for j=1:m
       for j2=1:10
            a(j,j2) = (tz(j,j2)*w(j2));
       end   
     end
     %对乘积求和
   b=sum(a');
   
   %对求和后的值用S函数计算
   for i4=1:m
       h(i4) =  sigmoid(b(i4));
%        if((h(i4)/(1-h(i4)))>50/100)
%            h1(i4)=1;
%        else
%            h1(i4)=0;
%        end
   end
    
   %得到错误差
    error = label1-h';
    %h1为使用更新后权值计算的标签,四舍五入取整即得到0 1标签
      h1 = round(h);
    
    
    %初始化错误个数为0 
    err_cou=0;
    %统计错误个数,计算错误率
    for i3=1:m
        if(h1(i3)~=label1(i3))
            err_cou=err_cou+1;
        end
    end
    err_rate(i)=err_cou/m;  %错误率 = 错误个数/样本个数
    
    %判断错误率是否达到要求
    if(err_rate(i)<theta)
        break;
    end
    
    %没有达到要求的错误率则继续更新权值
    for i1=1:n
        w(i1) = w(i1)+alpha*error(randIndex )*tz(randIndex ,i1);
    end
end

S函数代码:

function [ y ] = sigmoid( inX )
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
y=1/(1+exp(-inX));

end
数据集:
DATASETS_Cork Stoppers_Cork Stoppers.xls数据集

https://pan.baidu.com/s/1QyLF-Th_v0SpFYwaHXUKIg


Part4:实验结果

这里的迭代次数每次运行结果都不一样,但是大概就是这样的数量级。

学习率、错误率阈值、权值都需要在程序里面进行初始化。

正确率=1-分类错误率

Part5:总结


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值