详情请参阅《模式分类》第二版第二章上机练习2.5节第2题

数据说明:

有w1,w2,w3三组样本数据如下(符合正态分布):

(1)假设P(w1)=P(w2)=0.5,P(w3)=0,仅利用x1特征值为这两类判别设计一个分类器,并确定样本的经验训练误差,即误分点的百分比。
(2)假设P(w1)=P(w2)=0.5,P(w3)=0,利用x1,x2两个特征值为这两类判别设计一个分类器,并确定样本的经验训练误差,即误分点的百分比。
(3)假设P(w1)=P(w2)=0.5,P(w3)=0,利用x1,x2和x3三个特征值为这两类判别设计一个分类器,并确定样本的经验训练误差,即误分点的百分比。

实验步骤:

由于这两类数据符合正态分布,可以求出每一类数据的均值mu和协方差sigma,然后我们利用课本第二章式(49)的判别函数来对每一个样本数据进行判别分类。原本在w1类的数据点被分进w2或原本在w2的数据点被分进w1的那部分即为误分的数据点,误分点的百分比即为误分的数据点个数占全部数据的百分比。
由于我们在进行判别的时候会频繁用到式(49)的判别函数,因此我们将其写成一个函数,需要的时候调用即可。Matlab程序如下:

function r=discriminant_function(x,u,sigma,P)
% Inputs:
%   x      - Input vector:d*1
%   u      - Mean of distribution:d*1
%   sigma - Covariance matrix of distribution:d*d
%   P      - Prior probability
% Ouputs:
%   r      - Discriminant result
r= -0.5*((x - u)'/sigma)*(x - u) - size(u, 1)/2.0*log(2*pi) - 0.5*log(det(sigma)) + log(P);
end

需要注意的是,输入向量x是d维列向量,均值u是d维列向量,sigma是d*d的方阵。
现在考虑(1),利用一个特征向量,在matlab中取w1中的第一列作为x1,取w2中的第一列作为x2,利用mean函数求其均值,cov函数求其协方差(由于一维,协方差即方差):

load sample.mat
x1=w1(:,1);
x2=w2(:,1);
mu1=mean(x1);mu2=mean(x2);
sigma1=cov(x1);sigma2=cov(x2);

求出均值方差后,调用上述dicriminant_function判别函数比较大小后分类,分类结果存于result1和result2中,result1和result2均为列向量:

num_sample1=size(x1,1);num_sample2=size(x2,1);
result1=zeros(num_sample1,1);result2=zeros(num_sample2,1);%存储分类结果
%开始分类
for i=1:num_sample1if(discriminant_function(x1(i,:),mu1,sigma1,0.5)>=discriminant_function(x1(i,:),mu2,sigma2,0.5))result1(i,1)=1;  %分给类别1elseresult1(i,1)=2;  %分给类别2end
end
for i=1:num_sample2if(discriminant_function(x2(i,:),mu2,sigma2,0.5)>=discriminant_function(x2(i,:),mu1,sigma1,0.5))result2(i,1)=2;  %分给类别2elseresult2(i,1)=1;  %分给类别1end
end

分类结束后,需要找出误分的数据点,result1中类别为2和result2中类别为1的数据点均为误分点,可利用find函数,find函数返回n个匹配项的索引,为n*1的列向量,将误分点相加除于总数据点即为误分率,最后为了将数据点和类别显示出来,用disp函数打印出来。Matlab程序如下:

num_error=size(find(result1==2),1)+size(find(result2==1),1);
%find函数返回n个匹配项的索引,为n*1的列向量
error=num_error/(num_sample1+num_sample2);
disp('    w1.x1     class');
X=[x1 result1];
disp(X);  %输出w1分类结果
disp('    w2.x1     class');
Y=[x2 result2];
disp(Y);   %输出w2分类结果
fprintf('训练误差:%f\n',error);

最后的结果截图如下图1:

由结果可看出,w1中属于w2和w2中属于w1的数据点共有6个,因此误分比为:6/20=0.3。
现在来考虑利用两个特征值,大体思想都一样,区别就是输入向量x是二维,均值也是二维,协方差矩阵为2*2:

load sample.mat
x1=w1(:,1:2);  %两个特征值
x2=w2(:,1:2);
mu1=mean(x1',2);mu2=mean(x2',2);
sigma1=cov(x1);sigma2=cov(x2);

这里需要注意的是,均值向量是列向量,因此求均值mean的时候需要先转置(‘),cov函数的输入是n*d的矩阵,n是样本的个数,d是数据的维数,因此不需转置。核心部分与一维差不多,只需注意把输入变量x转置为列向量:

num_sample1=size(x1,1);num_sample2=size(x2,1);
result1=zeros(num_sample1,1);result2=zeros(num_sample2,1);
%存储分类结果
%开始分类
%调用discriminat_fuction的时候注意输入向量x是列向量
for i=1:num_sample1if(discriminant_function(x1(i,:)',mu1,sigma1,0.5)>=discriminant_function(x1(i,:)',mu2,sigma2,0.5))result1(i,1)=1;  %分给类别1elseresult1(i,1)=2;  %分给类别2end
end
for i=1:num_sample2if(discriminant_function(x2(i,:)',mu2,sigma2,0.5)>=discriminant_function(x2(i,:)',mu1,sigma1,0.5))result2(i,1)=2;  %分给类别2elseresult2(i,1)=1;  %分给类别1end
end

接着计算误分比:

%计算训练误差
num_error=size(find(result1==2),1)+size(find(result2==1),1);%find函数返回n个匹配项的索引,为n*1的列向量
error=num_error/(num_sample1+num_sample2);
disp('    w1.x1     w1.x2     class');
X=[x1 result1];
disp(X);  %输出w1分类结果
disp('    w2.x1     w2.x2     class');
Y=[x2 result2];
disp(Y);   %输出w2分类结果
fprintf('训练误差:%f\n',error);

输出结果如下图2:

由上图可看出,二维误分比为0.45,比一维误分比0.3大。

对于三维情况,与二维基本一样,这里不再赘述。图3是三维情况下的结果:

由上图看出,三维情况下,误分比为0.15。

结论分析:

由以上实验结果可知,一维误分比0.3,二维误分比为0.45,三维为0.15。因此,对于一有限数据集,有可能在更高的数据维数下训练误差会增加。我猜想,可能是因为增加的特征值与已有的特征值之间不独立,会相互影响,具体内在的缘由现在还不太清楚。

利用贝叶斯判别函数设计分类器相关推荐

  1. 贝叶斯模型构建分类器的设计与实现

    多种贝叶斯模型构建及文本分类的实现 作者:白宁超 2015年9月29日11:10:02 摘要:当前数据挖掘技术使用最为广泛的莫过于文本挖掘领域,包括领域本体构建.短文本实体抽取以及代码的语义级构件方法 ...

  2. 【Matlab】利用贝叶斯网络工具箱中的K2算法进行结构学习

    下面首先介绍一个结构学习方法,接着利用Matlab中的贝叶斯网络工具箱的K2算法学习该贝叶斯网络的结构.有关贝叶斯网络工具箱的使用,请看[Matlab]贝叶斯网络工具箱简介. 问题:服务器数据传送 现 ...

  3. 利用贝叶斯模型对sklearn中的手工数据集进行分析

    def b1():'''朴素贝叶斯算法是有监督学习算法,朴素贝叶斯算法分类为:贝努利朴素贝叶斯,高斯朴素贝叶斯,多项式朴素贝叶斯'''#利用贝努利朴素贝叶斯(二项分布)对手工数据进行分析#导入数据集生 ...

  4. 利用贝叶斯算法对垃圾邮件进行分类处理

    代码及注释如下: #使用贝叶斯算法实现垃圾邮件过滤 #将一个大字符串解析为字符串列表 def textParse(bigString):import relistOfTokens = re.split ...

  5. 手写字体识别用python实现_利用贝叶斯算法实现手写体识别(Python)

    #!/usr/bin/python#-*- coding: utf-8 -*-##########################################Bayes : 用来描述两个条件概率之 ...

  6. 朴素贝叶斯Naive Bayesian分类器 (NBC)

    诸神缄默不语-个人CSDN博文目录 本文介绍常见的机器学习模型朴素贝叶斯Naive Bayesian. 朴素贝叶斯模型属于generative model,即通过输出的结果反推生成结果的模型概率. 文 ...

  7. 不可小视的贝叶斯(二)

    上次介绍了贝叶斯理论的基本知识,接下来介绍剩下的两部分内容,即:贝叶斯分类器和贝叶斯网络.对于这两部分的内容,涉及太多东西,这里讲述的只是一些基础知识,尽可能将我知道的分享给大家,有错误的地方还希望指 ...

  8. 机器学习 —— 基础整理(一)贝叶斯决策论;二次判别函数;贝叶斯错误率;生成式模型的参数方法...

    本文简单整理了以下内容: (一)贝叶斯决策论:最小错误率决策.最小风险决策:经验风险与结构风险 (二)判别函数:生成式模型:多元高斯密度下的判别函数:线性判别函数LDF.二次判别函数QDF (三)贝叶 ...

  9. matlab最小错误率决策,利用MATLAB实现最小错误率贝叶斯判别

    利用MATLAB实现最小错误率贝叶斯判别 摘要:matlab软件平台为用户提供了强大的科学计算与可视化功能,具有简单.易用的用户环境,尤其适合矩阵数据的计算处理.根据matlab的特点,将其与模式识别 ...

最新文章

  1. 其他算法-高斯白噪声
  2. 现代简明魔法 php内核,你所必须知道的PHP 9种非常有用的函数和特征!
  3. 使用py2exe打包python脚本为exe可执行程序
  4. 希捷硬盘读取固件区数据
  5. Table options do not contain an option key ‘connector‘ for discovering a connector
  6. php单例型(singleton pattern)
  7. Bob‘s Problem
  8. ubuntu16.04下安装codeblocks(2分钟安装)
  9. poj 1228 Grandpa's Estate 给定了一个凸包的部分顶点和边上的点,判断是否能唯一确定一个凸包...
  10. 数据访问类用静态方法。。。当多个人调用时返回值会返回别人的?。。。特别奇怪的问题???...
  11. java 重命名_Java如何重命名文件?
  12. [Win系统][临时方案]系统任务管理器不能使用临时性解决方案
  13. java 静态 编译_Java中的动态和静态编译
  14. Java中CountDownLatch的使用和求多线程的运行时间
  15. Java解析JSON,按规则获取JSON节点内容
  16. Base64转MultipartFile
  17. 2019年中国计算机学会(CCF)推荐国际学术会议-计算机网络(2019.04.25)
  18. 5G NR 下行同步SSB(1)-- SSB时频资源
  19. 论如何在网页中插入一张图片
  20. 10+编程语言实现云笔记

热门文章

  1. IP地址分类以及C类IP地址的子网划分
  2. Paxos——分布式一致性协议
  3. AJAX调用方式总结
  4. 关于质数的后代的解题
  5. rabbitmq 限制速度_如何控制消息队列的消费速度?
  6. linux红帽安装qq,Linux如何安装QQ软件_Centos_redhat_ubuntu
  7. APP发布平台与加固平台
  8. 一次排队就餐带来的思考
  9. 经济学人:民主出了什么问题
  10. CSS字体 ,文本属性