精华内容
下载资源
问答
  • 以狼来了为例,使用贝叶斯分类器对小孩三次说谎后的可信度的一个计算,并介绍了二分类问题的matlab实现
  • 采用贝叶斯等几种分类方法对数据分类,效果不错
  • 带操作界面的贝叶斯分类代码(Matlab贝叶斯分类Matlab源码
  • matlab实现贝叶斯分类

    2018-05-05 09:56:45
    matlab实现贝叶斯分类。随机生成一组高斯正态分布数,利用贝叶斯算法分类。
  • matlab贝叶斯分类源码,数据集为UCI下载的Iris,代码包括数据预处理
  • 最简单的贝叶斯分类器演示Matlab程序。入门必备。 详细请参考本人的博客http://blog.csdn.net/ranchlai/article/details/10375579
  • 使用贝叶斯分类器进行判断文章类别,其中使用了斯密斯smoothing方法,课程作业,自己编写的matlab源码,直接运行BayesClassifier即可,由于数据量庞大,大概需要运行1分钟左右
  • 朴素贝叶斯分类器MATLAB源代码)

    热门讨论 2014-09-30 18:07:20
    朴素贝叶斯分类器 MATLAB 源代码,里面含有使用实例,用的是 UCI 的 mushroom 数据集。 分类器详细介绍见: http://blog.csdn.net/yunduanmuxue/article/details/39693917
  • 利用matlab实现的贝叶斯分类算法,其中包含数据格式转换算法,交叉验证算法和数据集统计算法,是UCI数据集通用的分类算法,准确率达到0.9427.
  • 朴素贝叶斯分类器Matlab代码)

    热门讨论 2014-09-06 17:52:21
    不是matlab 官方版本,自己动手写的并含有测试模块,适合学习贝叶斯编程过程。
  • 基于matlab编程实现贝叶斯分类器,实验原理、公式推导、参考程序、结果展示。
  • 贝叶斯分类器matlab实现

    千次阅读 2019-11-08 22:17:23
    matlab模拟最小错误率贝叶斯分类器与最小风险分类器,效果个人感觉还算能看的下去^_^ 注意:如果对实验原理还不算太懂,可以看其他大牛的博客或者看书,不管怎么样概率论知识是前提,不如乘法定理,条件概率,...

    用matlab模拟最小错误率贝叶斯分类器与最小风险分类器,效果个人感觉还算能看的下去^_^

    注意:如果对实验原理还不算太懂,可以看其他大牛的博客或者看书,不管怎么样概率论知识是前提,不如乘法定理,条件概率,贝叶斯公式等等

    本实验应用身高和体重两个特征进行试验

    一、最小错误率贝叶斯分类器的实现

    首先假设身高体重不相关(这里只根据身高判断,当然体重也行)

           1.  以(a)身高或者(b)体重数据作为特征,在正态分布假设下利用贝叶斯估计法估计分布密度参数,建立最小错误率Bayes分类器。

    具体做法:

    下面贴下程序代码:

    %%  不相关  有两个错误
    clc;clear all;
    %求均值和方差以及正态分布图
    male_data = importdata('male.txt');
    female_data = importdata('female.txt');
    male_avr = mean(male_data);
    female_avr = mean(female_data);
    male_v = var(male_data);
    female_v = var(female_data);
    X = 0:300;
    male_norm = normpdf(X,male_avr(:,1),male_v(:,1));
    figure(1);subplot(211);
    plot(X ,male_norm,'r-','LineWidth',3 );title('男生身高')

    female_norm = normpdf(X,female_avr(:,1),female_v(:,1));
    subplot(212);
    plot(X ,female_norm,'r-','LineWidth',3 );title('女生身高')
    %接下来就是按照所述步骤进行
    pw1_1 = 15/35; pw2_1 = 1-pw1_1;
    pw1_2 = 50/250; pw2_2 = 1-pw1_1;
    %读test
    height_test1 = zeros(35,1);
    weight_test1 = zeros(35,1);
    fid = fopen('test1.txt','r','n','UTF-8');
    i=1;
    while 1
        tline = fgetl(fid);    
        if ~ischar(tline)   
            break
        end
        height_test1(i) = str2double(tline(:,1))*100+str2double(tline(:,2)).*10+str2double(tline(:,3));
        weight_test1(i) = str2double(tline(:,5))*10+str2double(tline(:,6));
        i=i+1;
        %disp(weight_test1);
    end
    fclose(fid);
    PXi_W1 = 1/sqrt(2*pi*male_v(1))*exp(-(height_test1-male_avr(1)).^2/2/male_v(1));
    PXi_W2 = 1/sqrt(2*pi*female_v(1))*exp(-(height_test1-female_avr(1)).^2/2/female_v(1));

    PW1_Xi = PXi_W1.*pw2_1;
    PW2_Xi = PXi_W2.*pw1_1;
    i=1; panduan=zeros(35,1);
    for i = 1:35
    if(PW1_Xi(i)>PW2_Xi(i))
        fprintf('第 %d个是男的\n',i);
    else
        fprintf('第 %d个是女的\n',i);
    end
    end

    首先看下训练数据

    接下来是运行结果(基本都正确,第四个和第23个错误):                           

    身高体重相关(这里要根据身高和体重判断)

     

    下面贴下程序代码:

     

    %% 相关
    clc;clear all;
    male_data = importdata('male.txt');
    female_data = importdata('female.txt');
    male_avr = mean(male_data);
    female_avr = mean(female_data);
    pw1_1 = 15/35; pw2_1 = 1-pw1_1;
    % 协方差矩阵
    juzhen_male = cov(male_data); juzhen_male_det = det(juzhen_male);
    juzhen_male_ni = juzhen_male^(-1);
    juzhen_female = cov(female_data);juzhen_female_det = det(juzhen_female);
    juzhen_female_ni = juzhen_female^(-1);

    pw1_1 = 15/35; pw2_1 = 1-pw1_1;%根据样本的数据算出来的

    %读test2
    test2 = fopen('test2.txt');
    T2=textscan(test2,'%d%d%s','Delimiter',{':',';'});
    fclose(test2);
    test2_H=double([T2{1,1}]);
    test2_W=double([T2{1,2}]);
    man_woman = char([T2{1,3}]);
    hei_wei = [test2_H,test2_W];
    PXk_W1 = zeros(1,300);
    PXk_W2 = zeros(1,300);
    error =0;num_woman = 0;num_man  = 0;
    % 红色代表女的,蓝色代表男的  如果判断错了,弄成黑色星号
    figure(1);
    for i = 1:300
        if(man_woman(i)=='F')
            num_woman = num_woman +1;
            plot(test2_H(i),test2_W(i),'r.');
        else
            num_man = num_man +1;
            plot(test2_H(i),test2_W(i),'b.');
        end
        hold on;
        PXk_W1(i) = 1/sqrt(4*pi*pi*juzhen_male_det)*exp(-0.5*(hei_wei(i,:)-male_avr)*juzhen_male_ni* (hei_wei(i,:)-male_avr)' );
        PXk_W2(i) = 1/sqrt(4*pi*pi*juzhen_female_det)*exp(-0.5*(hei_wei(i,:)-female_avr)*juzhen_female_ni* (hei_wei(i,:)-female_avr)' );
        PW1_Xi = PXk_W1(i)*pw2_1;
        PW2_Xi = PXk_W2(i)*pw1_1;
        if(PW1_Xi>PW2_Xi)
            fprintf('第 %d个是男的\n',i);
            if(man_woman(i)=='F')
                error = error+1;
                plot(test2_H(i),test2_W(i),'k*');
            end
        else
            fprintf('第 %d个是女的\n',i);
            if(man_woman(i)=='M')
                error= error+1;
                plot(test2_H(i),test2_W(i),'k*');
            end
        end
    end
    %fprintf('错误率:%f%%',error/length(PXk_W1)*100);
    fprintf('共测试了%d个数据\r男性为%d 女性为%d\r',length(man_woman),num_man,num_woman)
    fprintf('           test2\n  ')
    fprintf('总  数  %5d\n  ',length(man_woman))
    fprintf('男  性  %5d\n  ',num_man)
    fprintf('女  性  %5d\n  ',num_woman)
    fprintf('错误数  %5d\n  ',error)
    fprintf('错误率  %0.2f%%\n ',error/length(PXk_W1)*100)

    看下测试样本:

    结果:

     

    % 红色代表女的,蓝色代表男的  如果判断错了,弄成黑色星号

    先贴这么多,看运行结果:

    第 1个是女的
    第 2个是女的
    第 3个是女的
    第 4个是女的
    第 5个是女的
    第 6个是女的
    第 7个是女的
    第 8个是女的
    第 9个是女的
    第 10个是女的
    第 11个是女的
    第 12个是女的
    第 13个是女的
    第 14个是女的
    第 15个是女的
    第 16个是女的
    第 17个是男的
    第 18个是女的
    第 19个是女的
    第 20个是女的
    第 21个是女的
    第 22个是女的
    第 23个是女的
    第 24个是女的
    第 25个是女的
    第 26个是女的
    第 27个是女的
    第 28个是女的
    第 29个是女的
    第 30个是女的
    第 31个是女的
    第 32个是女的
    第 33个是女的
    第 34个是女的
    第 35个是女的
    第 36个是女的
    第 37个是女的
    第 38个是女的
    第 39个是女的
    第 40个是女的
    第 41个是女的
    第 42个是女的
    第 43个是女的
    第 44个是女的
    第 45个是女的
    第 46个是女的
    第 47个是女的
    第 48个是女的
    第 49个是女的
    第 50个是女的
    第 51个是男的
    第 52个是男的
    第 53个是男的
    第 54个是女的
    第 55个是男的
    第 56个是男的
    第 57个是男的
    第 58个是男的
    第 59个是女的
    第 60个是女的
    第 61个是女的
    第 62个是男的
    第 63个是男的
    第 64个是男的
    第 65个是男的
    第 66个是男的
    第 67个是男的
    第 68个是男的
    第 69个是男的
    第 70个是男的
    第 71个是男的
    第 72个是男的
    第 73个是男的
    第 74个是男的
    第 75个是男的
    第 76个是男的
    第 77个是男的
    第 78个是男的
     

    二、最小风险贝叶斯

    下面贴代码和运行结果:

    %% 最小风险
    clc;clear all;
    male_data = importdata('male.txt');
    female_data = importdata('female.txt');
    male_avr = mean(male_data);
    female_avr = mean(female_data);
    male_v = var(male_data);
    female_v = var(female_data);
    %读文件
    fid = fopen('test1.txt','r','n','UTF-8');
    test1 = fopen('test1.txt');
    T2=textscan(test1,'%d%d%s','Delimiter',{':',';'});
    fclose(test1);
    height_test1 = double([T2{1,1}]);
    weight_test1 = double([T2{1,2}]);
    man_woman = char(T2{1,3});
    %W1是女的
    PXi_W1 = 1/sqrt(2*pi*female_v(1))*exp(-(height_test1-female_avr(1)).^2/2/female_v(1));
    PXi_W2 = 1/sqrt(2*pi*male_v(1))*exp(-(height_test1-male_avr(1)).^2/2/male_v(1));

    PW1_Xi = PXi_W1./(PXi_W1+PXi_W2);
    PW2_Xi = PXi_W2./(PXi_W1+PXi_W2);
    %定义风险系数矩阵
    L = [0,6;1,0];
    PWi_Xi = [PW1_Xi';PW2_Xi'];
    %决策矩阵
    deci = L*PWi_Xi;
    i = 1;
    %谁的风险大我就不选谁
    error = 0;
    num_woman = 0;num_man  = 0;
    for i=1:35
        if(man_woman(i)=='f')
            num_woman = num_woman +1;
        else
            num_man = num_man +1;
        end
        if(deci(1,i)>deci(2,i))
            fprintf('第%d个是男的\n',i);
            if(man_woman(i)=='f')
                error = error+1; 
            end
        else
            fprintf('第%d个是女的\n',i);
            if(man_woman(i)=='m')
                error =error+1;
            end
        end
    end
    % fprintf('错误率:%f%%\n',error/length(man_woman)*100);
    fprintf('共测试了%d个数据\r男性为%d 女性为%d\r',length(man_woman),num_man,num_woman)
    fprintf('           test1\n  ')
    fprintf('总  数  %5d\n  ',length(man_woman))
    fprintf('男  性  %5d\n  ',num_man)
    fprintf('女  性  %5d\n  ',num_woman)
    fprintf('错误数  %5d\n  ',error)
    fprintf('错误率  %0.2f%%\n ',error/length(man_woman)*100)

     

    结果的部分截图:

     

     

     

     

     

     

     

    展开全文
  • 基于MATLAB贝叶斯分类器设计.pdf
  • 贝叶斯分类器MATLAB经典程序

    热门讨论 2012-05-06 15:14:32
    贝叶斯分类器MATLAB经典程序
  • MATLAB实现贝叶斯分类器

    万次阅读 多人点赞 2015-03-30 17:27:08
    贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化,它...

    贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是最小错误率意义上的优化,它遵循“多数占优”这一基本原则。

    一、分类器的基本概念

    经过了一个阶段的模式识别学习,对于模式和模式类的概念有一个基本的了解,并尝试使用MATLAB实现一些模式类的生成。而接下来如何对这些模式进行分类成为了学习的第二个重点。这就需要用到分类器。
    表述模式分类器的方式有很多种,其中用的最多的是一种判别函数这里写图片描述的形式,如果对于所有的j≠i,有:
    这里写图片描述

    则此分类器将这个特征向量x判为ωi类。因此,此分类器可视为计算c个判别函数并选取与最大判别值对应的类别的网络或机器。一种分类器的网络结构如下图所示:

    这里写图片描述

    二、贝叶斯分类器

    一个贝叶斯分类器可以简单自然地表示成以上网络结构。贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。在具有模式的完整统计知识条件下,按照贝叶斯决策理论进行设计的一种最优分类器。分类器是对每一个输入模式赋予一个类别名称的软件或硬件装置,而贝叶斯分类器是各种分类器中分类错误概率最小或者在预先给定代价的情况下平均风险最小的分类器。它的设计方法是一种最基本的统计分类方法。

    对于贝叶斯分类器,其判别函数的选择并不是唯一的,我们可以将所有的判别函数乘上相同的正常数或者加上一个相同的常量而不影响其判决结果;在更一般的情况下,如果将每一个gi (x)替换成f(gi (x)),其中f(∙)是一个单调递增函数,其分类的效果不变。特别在对于最小误差率分类,选择下列任何一种函数都可以得到相同的分类结果,但是其中一些比另一些计算更为简便:

    这里写图片描述

    一个典型的模式识别系统是由特征提取和模式分类两个阶段组成的,而其中模式分类器(Classifier)的性能直接影响整个识别系统的性能。 因此有必要探讨一下如何评价分类器的性能,这是一个长期探索的过程。分类器性能评价方法见:http://blog.csdn.net/liyuefeilong/article/details/44604001

    三、基本的Bayes分类器实现

    这里将在MATLAB中实现一个可以对两类模式样本进行分类的贝叶斯分类器,假设两个模式类的分布均为高斯分布。模式类1的均值矢量m1 = (1, 3),协方差矩阵为S1 =(1.5, 0; 0, 1);模式类2的均值矢量m2 = (3, 1),协方差矩阵为S2 =(1, 0.5; 0.5, 2),两类的先验概率p1 = p2 = 1/2。详细的操作包含以下四个部分:

    1.首先,编写一个函数,其功能是为若干个模式类生成指定数目的随机样本,这里为两个模式类各生成100个随机样本,并在一幅图中画出这些样本的二维散点图;

    这里写图片描述

    2.由于每个随机样本均含有两个特征分量,这里先仅仅使用模式集合的其中一个特征分量作为分类特征,对第一步中的200个样本进行分类,统计正确分类的百分比,并在二维图上用不同的颜色画出正确分类和错分的样本;(注:绿色点代表生成第一类的散点,红色代表第二类;绿色圆圈代表被分到第一类的散点,红色代表被分到第二类的散点! 因此,里外颜色不一样的点即被错分的样本。)

    这里写图片描述

    3.仅用模式的第二个特征分量作为分类特征,重复第二步的操作;

    这里写图片描述

    4.同时用模式的两个分量作为分类特征,对200个样本进行分类,统计正确分类百分比,并在二维图上用不同的颜色画出正确分类和错分的样本;

    这里写图片描述

    正确率:

    这里写图片描述

    可以看到,单单使用一个分类特征进行分类时,错误率较高(多次试验均无法得出较好的分类结果),而增加分类特征的个数是提高正确率的有效手段,当然,这会给算法带来额外的时间代价。

    四、进一步的Bayes分类器

    假设分类数据均满足高斯分布的情况下,设计一个判别分类器,实验目的是为了初步了解和设计一个分类器。

    1.编写一个高斯型的Bayes判别函数GuassianBayesModel( mu,sigma,p,X ),该函数输入为:一给定正态分布的均值mu、协方差矩阵sigma,先验概率p以及模式样本矢量X,输出判别函数的值,其代码如下:

    2.以下表格给出了三类样本各10个样本点,假设每一类均为正态分布,三个类别的先验概率相等均为P(w1)=P(w2 )=P(w3 )=1/3。计算每一类样本的均值矢量和协方差矩阵,为这三个类别设计一个分类器。

    这里写图片描述

    3.用第二步中设计的分类器对以下测试点进行分类:(1,2,1),(5,3,2),(0,0,0),并且利用以下公式求出各个测试点与各个类别均值之间的Mahalanobis距离。以下是来自百度百科的关于马氏距离的解释:

    这里写图片描述

    马氏距离计算公式:

    这里写图片描述

    更具体的见: http://baike.baidu.com/link?url=Pcos75ou28q7IukueePCNqf8N7xZifuXOTrwzeWpJULgVrRnytB9Gji6IEhEzlK6q4eTLvx45TAJdXVd7Lnn2q

    4.如果P(w1)=0.8, P(w2 )=P(w3 )=0.1,再进行第二步和第三步实验。实验的结果如下:

    首先是得出三类样本点各自的均值和协方差矩阵:

    这里写图片描述

    这里写图片描述

    在三个类别的先验概率均为P(w1)=P(w2 )=P(w3 )=1/3时,使用函数进行分类并给出分类结果和各个测试点与各个类别均值之间的Mahalanobis距离。

    这里写图片描述

    这里写图片描述

    这里写图片描述

    验证当三个类别的先验概率不相等时,同样使用函数进行分类并给出分类结果和各个测试点与各个类别均值之间的Mahalanobis距离。

    这里写图片描述

    这里写图片描述

    这里写图片描述

    可以看到,在Mahalanobis距离不变的情况下,不同的先验概率对高斯型Bayes分类器的分类结果影响很大~ 事实上,最优判决将偏向于先验概率较大的类别。

    完整的代码如下由两个函数和主要的执行流程组成:

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 产生模式类函数
    % N:生成散点个数 C:类别个数 d:散点的维数
    % mu:各类散点的均值矩阵
    % sigma:各类散点的协方差矩阵
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function result = MixGaussian(N, C, d, mu, sigma)
    color = {'r.', 'g.', 'm.', 'b.', 'k.', 'y.'}; % 用于存放不同类数据的颜色
    % if nargin <= 3 & N < 0 & C < 1 & d < 1
    %   error('参数太少或参数错误');
    if d == 1
            for i = 1 : C
                for j = 1 : N/C
                r(j,i) = sqrt(sigma(1,i)) * randn() + mu(1,i);
                end
                X = round(mu(1,i)-5);
                Y = round(mu(1,i) + sqrt(sigma(1,i))+5);
                b = hist(r(:,i), X:Y);
                subplot(1,C,i),bar(X:Y, b,'b');
                title('三类一维随机点的分布直方图');
                grid on
            end
    elseif d == 2
                for i = 1:C
                    r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                    plot(r(:,1,i),r(:,2,i),char(color(i)));
                    hold on;
                end
    elseif d == 3
                for i = 1:C
                    r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
                    plot3(r(:,1,i),r(:,2,i),r(:,3,i),char(color(i)));
                    hold on;
                end
    else disp('维数只能设置为1,2或3');
    end
    result = r;
    
    
    
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %  高斯型Bayes判别函数
    %  mu:输入正态分布的均值
    %  sigma:输入正态分布的协方差矩阵
    %  p:输入各类的先验概率
    %  X:输入样本矢量
    %  输出判别函数值、马氏距离和判别结果
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function GuassianBayesModel( mu,sigma,p,X )
    
    % 构建判别函数
    % 计算点到每个类的Mahalanobis距离
    for i = 1:3;
    P(i) = mvnpdf(X, mu(:,:,i), sigma(:,:,i)) * p(i);
    r(i) = sqrt((X - mu(:,:,i)) * inv(sigma(:,:,i)) * (X - mu(:,:,i))');
    end
    % 判断样本属于哪个类的概率最高
    % 并显示点到每个类的Mahalanobis距离
    maxP = max(P);
    style = find(P == maxP);
    disp(['点[',num2str(X),']关于第一类的判别函数值为:',num2str(P(1))]);
    disp(['点[',num2str(X),']关于第二类的判别函数值为:',num2str(P(2))]);
    disp(['点[',num2str(X),']关于第三类的判别函数值为:',num2str(P(3))]);
    
    disp(['点[',num2str(X),']到第1类的Mahalanobis距离为:',num2str(r(1))]);
    disp(['点[',num2str(X),']到第2类的Mahalanobis距离为:',num2str(r(2))]);
    disp(['点[',num2str(X),']到第3类的Mahalanobis距离为:',num2str(r(3))]);
    
    disp(['点[',num2str(X),']属于第',num2str(style),'']);
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %贝叶斯分类器实验主函数
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    % 生成两类各100个散点样本
    mu(:,:,1) = [1 3];  
    sigma(:,:,1) = [1.5 0; 0 1];
    p1 = 1/2;
    
    mu(:,:,2) = [3 1];  
    sigma(:,:,2) = [1 0.5; 0.5 2];
    p2 = 1/2;
    % 生成200个二维散点,平分为两类,每类100个
    aa = MixGaussian(200, 2, 2, mu, sigma);
    title('两类共200个高斯分布的散点');
    
    % 只x分量作为分类特征的分类情况
    figure;
    % 正确分类的散点个数
    right1 = 0;
    right2 = 0;
    % 正确率
    rightRate1 = 0;
    rightRate2 = 0;
    for i = 1:100
        x = aa(i,1,1);
        plot(aa(:,1,1),aa(:,2,1),'r.');
    % 计算后验概率
    P1 = normpdf(x, 1, sqrt(1.5));
    P2 = normpdf(x, 3, sqrt(1));
    
    if P1 > P2
        plot(aa(i,1,1),aa(i,2,1),'ks');
        hold on;
        right1 = right1 + 1;% 统计正确个数
    elseif P1 < P2
        plot(aa(i,1,1),aa(i,2,1),'go');
        hold on;
    end
    end
    rightRate1 = right1 / 100; % 正确率
    
    for i = 1:100
        x = aa(i,1,2);
        plot(aa(:,1,2),aa(:,2,2),'g.');
    % 计算后验概率
    P1 = normpdf(x, 1, sqrt(1.5));
    P2 = normpdf(x, 3, sqrt(1));
    
    if P1 > P2
        plot(aa(i,1,2),aa(i,2,2),'ks');
        hold on;
    elseif P1 < P2
        plot(aa(i,1,2),aa(i,2,2),'go');
        hold on;
        right2 = right2 + 1; % 统计正确个数
    end
    end
    rightRate2 = right2 / 100;
    title('使用第一个分类特征的分类结果');
    disp(['只用第一个特征时,第一类分类的准确率为:',num2str(rightRate1*100),'%']);
    disp(['只用第一个特征时,第二类分类的准确率为:',num2str(rightRate2*100),'%']);
    
    % 只使用y分量的分类特征的分类情况
    figure;
    % 正确分类的散点个数
    right1 = 0;
    right2 = 0;
    % 正确率
    rightRate1 = 0;
    rightRate2 = 0;
    for i = 1:100
        y = aa(i,2,1);
          plot(aa(:,1,1),aa(:,2,1),'r.');
    % 计算后验概率
    P1 = normpdf(y, 3, sqrt(1));
    P2 = normpdf(y, 1, sqrt(2));
    
    if P1 > P2
        plot(aa(i,1,1),aa(i,2,1),'ks');
        hold on;
        right1 = right1 + 1; % 统计正确个数
    elseif P1 < P2
        plot(aa(i,1,1),aa(i,2,1),'go');
        hold on;
    end
    end
    rightRate1 = right1 / 100; % 正确率
    
    for i = 1:100
        y = aa(i,2,2);
          plot(aa(:,1,2),aa(:,2,2),'g.');
    % 计算后验概率
    P1 = normpdf(y, 3, sqrt(1));
    P2 = normpdf(y, 1, sqrt(2));
    
    if P1 > P2
        plot(aa(i,1,2),aa(i,2,2),'ks');
        hold on;
    
    elseif P1 < P2
        plot(aa(i,1,2),aa(i,2,2),'go');
        hold on;
        right2 = right2 + 1; % 统计正确个数
    end
    end
    rightRate2 = right2 / 100; % 正确率
    title('使用第二个分类特征的分类结果');
    disp(['只用第二个特征时,第一类分类的准确率为:',num2str(rightRate1*100),'%']);
    disp(['只用第二个特征时,第二类分类的准确率为:',num2str(rightRate2*100),'%']);
    
    % 同时使用两个分类特征的分类情况
    figure;
    % 正确分类的散点个数
    right1 = 0;
    right2 = 0;
    % 正确率
    rightRate1 = 0;
    rightRate2 = 0;
    for i = 1:100
        x = aa(i,1,1);
        y = aa(i,2,1);
      plot(aa(:,1,1),aa(:,2,1),'r.');
    % 计算后验概率
    P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
    P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
    
    if P1 > P2
        plot(aa(i,1,1),aa(i,2,1),'ks');
        hold on;
        right1 = right1 + 1;
    else if P1 < P2
        plot(aa(i,1,1),aa(i,2,1),'go');
        hold on;
        end
    end
    end
    rightRate1 = right1 / 100;
    
    for i = 1:100
        x = aa(i,1,2);
        y = aa(i,2,2);
        plot(aa(:,1,2),aa(:,2,2),'g.');
    % 计算后验概率
    P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
    P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
    
    if P1 > P2
        plot(aa(i,1,2),aa(i,2,2),'ks');
        hold on;
    else if P1 < P2
    
        plot(aa(i,1,2),aa(i,2,2),'go');
        hold on;
        right2 = right2 + 1;
        end
    end
    end
    rightRate2 = right2 / 100;
    title('使用两个分类特征的分类结果');
    disp(['同时使用两个特征时,第一类分类的准确率为:',num2str(rightRate1*100),'%']);
    disp(['同时使用两个特征时,第二类分类的准确率为:',num2str(rightRate2*100),'%']);
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 进一步的Bayes分类器
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % w1,w2,w3三类散点
    w = zeros(10,3,3);
    w(:,:,1) = [-5.01 -8.12 -3.68;...
                -5.43 -3.48 -3.54;...
                 1.08 -5.52  1.66;...
                 0.86 -3.78 -4.11;...
                -2.67  0.63  7.39;...
                 4.94  3.29  2.08;...
                -2.51  2.09 -2.59;...
                -2.25 -2.13 -6.94;...
                 5.56  2.86 -2.26;...
                 1.03 -3.33  4.33];
    
    w(:,:,2) = [-0.91 -0.18 -0.05;...
                 1.30 -.206 -3.53;...
                -7.75 -4.54 -0.95;...
                -5.47  0.50  3.92;...
                 6.14  5.72 -4.85;...
                 3.60  1.26  4.36;...
                 5.37 -4.63 -3.65;...
                 7.18  1.46 -6.66;...
                -7.39  1.17  6.30;...
                -7.50 -6.32 -0.31];
    
    w(:,:,3) = [ 5.35  2.26  8.13;...
                 5.12  3.22 -2.66;...
                -1.34 -5.31 -9.87;...
                 4.48  3.42  5.19;...
                 7.11  2.39  9.21;...
                 7.17  4.33 -0.98;...
                 5.75  3.97  6.65;...
                 0.77  0.27  2.41;...
                 0.90 -0.43 -8.71;...
                 3.52 -0.36  6.43];
    % 均值
    mu1(:,:,1) = sum(w(:,:,1)) ./ 10;
    mu1(:,:,2) = sum(w(:,:,2)) ./ 10;
    mu1(:,:,3) = sum(w(:,:,3)) ./ 10;
    % 协方差矩阵
    sigma1(:,:,1) = cov(w(:,:,1));
    sigma1(:,:,2) = cov(w(:,:,2));
    sigma1(:,:,3) = cov(w(:,:,3));
    % 各类别的先验概率
    % p(1) = 1/3;
    % p(2) = 1/3;
    % p(3) = 1/3;
    p(1) = 0.8;
    p(2) = 0.1;
    p(3) = 0.1;
    % 样本矢量
    X = [1 0 0];
    % 调用高斯型Bayes判别函数,输出判别函数值、马氏距离和判别结果
    GuassianBayesModel(mu1,sigma1,p,X);
    
    展开全文
  • 基于MATLAB贝叶斯分类器设计
  • 贝叶斯(Baysian)分类器[1]是一种理论上比较简单的分类器。但是结合不同的网络结构和概率模形,它又可以演化成非常复杂的分类体系。本短文主要演示Baysian + Gaussian如何解两类问题。 其中,分母部分主要用于归一化...

    贝叶斯(Baysian)分类器[1]是一种理论上比较简单的分类器。但是结合不同的网络结构和概率模形,它又可以演化成非常复杂的分类体系。本短文主要演示Baysian + Gaussian如何解两类问题。

    0818b9ca8b590ca3270a3433284dd417.png

    其中,分母部分主要用于归一化。p(y)为先验概率(prior), p(x|y)为条件概率或称之为类概率密度(即已知x是哪一类的情况下p(x)的概率密度)。 在本文中,假设p(x|y)是高斯分布,即[2]:

    0818b9ca8b590ca3270a3433284dd417.png

    而p(y)则采用伯努利(Bernoulli)分布[3]:

    0818b9ca8b590ca3270a3433284dd417.png

    其中最大似然估计后得到的\eta即为第0类中训练样本的个数占总样本数的百分比。 求得五个参数0818b9ca8b590ca3270a3433284dd417.png后,就可能通过比较后验概率得到任意样本x的类别:

    0818b9ca8b590ca3270a3433284dd417.png.

    当f(x) 大于0时即表示

    0818b9ca8b590ca3270a3433284dd417.png,

    此时把样本x归为第0类,否则归为第1类。

    下面通过Matlab程序进行演示:

    训练的代码:

    function [model_pos,model_neg ] = FindGuassianModel( x,y )

    %FINDGUASSIANMODULE Summary of this function goes here

    %   Detailed explanation goes here

    x_pos = x(:,y==1);

    model_pos.mu = mean(x_pos,2);

    model_pos.var = cov(x_pos');

    model_pos.prior = length(x_pos)/length(x);

    x_neg = x(:,y~=1);

    model_neg.mu = mean(x_neg,2);

    model_neg.var = cov(x_neg');

    model_neg.prior = length(x_neg)/length(x);

    end

    计算分类误差:

    function [err,h] = FindModelError(model_pos,model_neg, x,y )

    %FINDGUASSIANMODULE Summary of this function goes here

    %   Detailed explanation goes here

    mu1 = model_pos.mu;

    sigma1 = model_pos.var;

    p1 = model_pos.prior;

    mu2 = model_neg.mu;

    sigma2 = model_neg.var;

    p2 = model_neg.prior;

    bias = 0.5*log(det(sigma2))-0.5*log(det(sigma1))+log(p1/p2);

    err = 0;

    h = zeros(size(y));

    for i=1:length(y)

    c = bias + 0.5*(x(:,i)-mu2)'/sigma2*(x(:,i)-mu2) - 0.5*(x(:,i)-mu1)'/sigma1*(x(:,i)-mu1);

    if c > 0

    h(i) = 1;

    else

    h(i) = -1;

    end

    if h(i)~=y(i)

    err = err + 1;

    end

    end

    end

    演示主程序:

    %%

    clc;

    clear;

    close all;

    %% generate random data

    shift =3.0;

    n = 2;%2 dim

    sigma = 1;

    N = 500;

    x = [randn(n,N/2)-shift, randn(n,N/2)*sigma+shift];

    y = [ones(N/2,1);-ones(N/2,1)];

    %show the data

    figure;

    plot(x(1,1:N/2),x(2,1:N/2),'rs');

    hold on;

    plot(x(1,1+N/2:N),x(2,1+N/2:N),'go');

    title('2d training data');

    legend('Positve samples','Negative samples','Location','SouthEast');

    0818b9ca8b590ca3270a3433284dd417.png

    % model fitting using maximum likelihood

    [model_pos,model_neg] = FindGuassianModel(x,y);

    %% test on new dataset, same distribution

    n = 2;%2 dim

    %y = 1./exp(-w'*x+b)

    sigma = 2;

    N = 500;

    x = [randn(n,N/2)-shift, randn(n,N/2)*sigma+shift];

    y = [ones(N/2,1);-ones(N/2,1)];figure;plot(x(1,1:N/2),x(2,1:N/2),'rs');

    hold on;

    plot(x(1,1+N/2:N),x(2,1+N/2:N),'go');

    title('2d testing data');

    hold on;

    %% gaussian model as a baseline

    [err,h] = FindModelError(model_pos,model_neg,x,y);

    fprintf('Baysian error on test data set: %f\n',err/N);

    x_pos = x(:,h==1);

    x_neg = x(:,h~=1);

    plot(x_pos(1,:),x_pos(2,:),'r.');

    hold on;

    plot(x_neg(1,:),x_neg(2,:),'g.');

    legend('Positve samples','Negative samples','Positve samples as predicted','Negative samples as predicted','Location','SouthEast');

    最后的测试结果:

    0818b9ca8b590ca3270a3433284dd417.png

    从测试结是上看,大部分样本都能分类正确(同色的点在同色的圆或方框中),只有0.8%的点分类错误。

    展开全文
  • Matlab项目 包含用于朴素贝叶斯分类器的源代码和Matlab示例。 该项目中包含的源代码和文件在“项目文件”部分列出,请确保此资源能满足您的要求
  • matlab可用于数据挖掘,BP神经网络,构造贝叶斯分类器,训练数据,预测数据。
  • 模式识别作业-贝叶斯分类器贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。也就是说,贝叶斯分类器是...
  • 3-estimate_:估计给定数据的模型4-classify_:根据模型和数据进行分类5-测试:使用 alpha=1:0.1:1000 测试 Naive 分类器并在可视化文件夹中打印一个名为 (accuracy 1-1000.pdf) 的图6- InspectTheModel:尝试衡量...
  • 采用贝叶斯等几种分类方法对数据分类,效果不错
  • 内含贝叶斯的代码,10次10折贝叶斯的代码,直接使用即可,还用相应的数据集样本,都可直接使用不需要修改。
  • 贝叶斯分类器

    2012-01-06 09:37:39
    两类贝叶斯分类器matlab实现程序,模式识别课程题目
  • 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。贝叶斯分类器是最小错误率意义上的优化。在风险相同时,...
  • 资源包含贝叶斯分类器学习报告、实验报告、matlab代码程序,供机器学习初学者学习使用。以身高或者体重数据作为特征,在正态分布假设下利用贝叶斯估计法估计分布密度参数,建立最小错误率Bayes分类器。
  • 贝叶斯分类器MATLAB实现

    千次阅读 2016-12-21 21:22:14
    贝叶斯分类器是一种简单的模式分类器,其matlab代码如下: clear; %clc; n=100; m1=0; m2=0; num1=0;%用于计数 num2=0;%用于计数 num3=0;%用于计数 num4=0;%用于计数 mu1=[1 3]; sigma1=[1.5 0;0 1]; r1=mvnrnd(mu1,...

           贝叶斯分类器是一种简单的模式分类器,它是以特征值的统计概率为基础的,简单的讲,例如已知两个类w1和w2,一个未知样本x,这里说的未知,就是不知道它属于w1类还是属于w2类,然后根据统计方法分别计算得到x属于w1类的概率,即P(w1|x)和属于w2类的概率,即P(w2|x),如果P(w1|x)> P(w2|x),则x属于w1,反之则属于w2。

    其matlab代码如下:

    clear;
    %clc;
    n=100;
    m1=0;
    m2=0;
    num1=0;%用于计数
    num2=0;%用于计数
    num3=0;%用于计数
    num4=0;%用于计数
    mu1=[1 3];
    sigma1=[1.5 0;0 1];
    r1=mvnrnd(mu1,sigma1,n);%生成模式类1
    mu2=[3 1];
    sigma2=[1 0.5;0.5 2];
    r2=mvnrnd(mu2,sigma2,n);%生成模式类2
    subplot(1,2,1);
    plot(r1(:,1),r1(:,2),'ro',r2(:,1),r2(:,2),'b*');
    title('图1:两个模式类各生成个100正态分布的随机数二维散点图');
    p1=normpdf(r1(:,1),mu1(:,1),sqrt(1.5));
    p2=normpdf(r1(:,1),mu2(:,1),1);
    p3=normpdf(r2(:,1),mu1(:,1),sqrt(1.5));
    p4=normpdf(r2(:,1),mu2(:,1),1);
    
    for i=1:1:100
        if (p1(i)*0.5)>=(p2(i)*0.5)%进行模式判别
            num1=num1+1;
            m1=m1+1;
            a1(m1,:)=r1(i,:);%分到模式类1
        else
            num2=num2+1;
            m2=m2+1
            a2(m2,:)=r1(i,:);%分到模式类2
        end
        
        if (p3(i)*0.5)<=(p2(i)*0.5)
            num3=num3+1;
            m1=m1+1;
            a1(m1,:)=r2(i,:);%分到模式类1
        else
            num4=num4+1;
            m2=m2+1;
            a2(m2,:)=r2(i,:);%分到模式类2
        end
    end
    subplot(1,2,2);
    plot(a1(:,1),a1(:,2),'ro',a2(:,1),a2(:,2),'b*');
    title('图2:以第一特征分量对200个样本分类');

    运行结果如下图所示:



    从运行结果可看出,模式类1的一些样本点被错误分到模式类2,模式类2的一些样本点被错误分到模式类1,也就是说,贝叶斯分类器的分类正确率不高。

    下图为更全面的实验结果截图


    展开全文
  • 朴素贝叶斯算法写的关于鸢尾花分类的程序,有需要的可以自己下载修改使用.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,934
精华内容 1,573
关键字:

matlab贝叶斯分类器设计

matlab 订阅