贝叶斯学习 -- matlab、python代码分析(3)

实例分析(Matlab)
实例 1 来源于 http://blog.csdn.net/zhulf0804/article/details/52424809 加以整理分析
这里写图片描述

数据说明
共5列, 有625个训练样例 第一列为标签,剩余4列为属性(x1 x2 x3 x4)
标签 :R L B 属性值 为 1 2 3 4 5

我们在这里序号末尾为1的样本当作测试集,共有63个,其他的作为训练集,共有562个

clc;clear;close all;

% 没有头文件并且全是数字用load,有头文件并且数据类型统一用importdata
% 如果没有文件头,importdata读出来的是一个数组,不再是数据结构,不能用A.data去访问
% 数据,直接用A就可以了

file = importdata('data.txt'); % importdata 读取txt,返回data和textdata两个变量 data存储数据矩阵(只有数字) textdata存储元素矩阵 
data = file.data; % 得到数据矩阵
m = size(file.textdata, 1); % 得到数据大小

% 将标签 L B R 用1 2 3 代替
label = zeros(m,1);
for i=1:m
    if (file.textdata{i,1} == 'L') % file.data为cell形式,可通过file.data{i,j} 调用第i个cell里的第j个值 还可以通过 strcmp(A,B)函数来实现
        label(i) = 1;
    elseif (file.textdata{i,1} == 'B') 
        label(i) = 2;
    else
        label(i) = 3;
    end
end

% 朴素贝叶斯算法实现分类问题(三类 1 2 3)
% 我们在这里序号末尾为1的样本当作测试集,共有63个,其他的作为训练集,共有562个
% 联系前面的公式 V={1,2,3} 属性为{x1 x2 x3 x4} 属性值为(1,2,3,4,5)
% 比如一个实例<x1=1,x2=3,x3=4,x4=5>
m_test = 63;
m_train = 562;
count1 = 0; % 第一类样本的数量 用于计算P(V_i) 
count2 = 0;
count3 = 0;
count_1 = zeros(4,5); % 存储第一类 第i个属性 值为j的样本个数 用于计算P(i = j|v_i)
count_2 = zeros(4,5);
count_3 = zeros(4,5);
%test = [];
counttemp = 1;
% 抽出训练矩阵和测试矩阵,并计算每个属性值出现的数量 
for i=1:m
    if (mod(i,10)==1) % 序号末尾为1的样本
        test(counttemp,:) = data(i,:);
        test_label(counttemp,:) = label(i,:);
        counttemp = counttemp+1;
    else
        train = data(i,:); % 1*4 向量
        if label(i)==1  %如果是第一类样本
            count1 = count1+1; % 计算第一类样本的总数量
            for j=1:4 % 第i个属性
                for k=1:5 % 第j个属性
                    if (train(j)==k) % 属性值同
                        count_1(j,k) = count_1(j,k)+1; % 第一类,第i个属性 ,值为j的样本个数
                        break; % 为什么用break????
                    end
                end
            end
        elseif (label(i)==2)
            count2 = count2+1; % 计算第一类样本的总数量
            for j=1:4 % 第i个属性
                for k=1:5 % 第j个属性
                    if (train(j)==k) % 属性值同
                        count_2(j,k) = count_2(j,k)+1; % 第2类,第i个属性 ,值为j的样本个数
                        break; % 为什么用break????
                    end
                end
            end
        else
            count3 = count3+1; % 计算第一类样本的总数量
            for j=1:4 % 第i个属性
                for k=1:5 % 第j个属性
                    if (train(j)==k) % 属性值同
                        count_3(j,k) = count_3(j,k)+1; % 第3类,第i个属性 ,值为j的样本个数
                        break; % 为什么用break????
                    end
                end
            end
        end 
    end
% 利用上面的数量来求频率
    p1 = count1/m_train;  %P(V_i)
    p2 = count2/m_train;
    p3 = count3/m_train;

% 然后求P(i = j|v_i) 
    for i=1:4
        for j=1:5
            p_1(i,j) = count_1(i,j)/count1; % 第一类 属性i值为j的概率
            p_2(i,j) = count_2(i,j)/count2;
            p_3(i,j) = count_3(i,j)/count3;
        end
    end
end


%%% 接下来做预测!! 求V_NB
rate = 0; %正确率
for i=1:m_test
    X = test(i,:);
    Y = test_label(i);
    % 分别求出三类的朴素贝叶斯概率
    Vnb_1 = p1*p_1(1,X(1))*p_1(2,X(2))*p_1(3,X(3))*p_1(4,X(4)); % 共四个属性,用测试样本来实例化
    Vnb_2 = p2*p_2(1,X(1))*p_2(2,X(2))*p_2(3,X(3))*p_2(4,X(4));
    Vnb_3 = p3*p_3(1,X(1))*p_3(2,X(2))*p_3(3,X(3))*p_3(4,X(4));

    % 下面求出正确率
    if (max(Vnb_1,max(Vnb_2,Vnb_3)) == Vnb_1) % 判断三个里面最大的 判为该类
        if Y == 1 % 如果实际分类和得到的分类相同
            rate = rate+1;
        end
    end
    if (max(Vnb_1,max(Vnb_2,Vnb_3))== Vnb_2) % 判断三个里面最大的 判为该类
        if Y == 2 % 如果实际分类和得到的分类相同
            rate = rate+1;
        end
    end
    if (max(Vnb_1,max(Vnb_2,Vnb_3))== Vnb_3) % 判断三个里面最大的 判为该类
        if Y == 3 % 如果实际分类和得到的分类相同
            rate = rate+1;
        end
    end
end

fprintf('rate is %f', rate/m_test*100);

%%
% 输出 rate is 85.7143
%%

代码: 链接:http://pan.baidu.com/s/1kVflcGJ 密码:78af

===================================================
实例 2 设计基于最小风险的贝叶斯分类器,将行人与背景进行分类
已知把行人分为背景的风险为1.5, 背景判为行人的风险是 0.5,假设出现背景的先验概率为0.95,出现行人的先验概率为0.05
由于是有监督的学习,所以要把样本随即划分为 等量的训练样本集和测试样本集。
原始行人样本和背景样本 都为 500*252 随机分割 250个样本

function [train, test] = randSeg(X)
 %返回 随机选取的饿训练、测试样本集 

基于最小风险的贝叶斯分类器
理论:
**这里写图片描述**

逐行写代码:

% 随机函数得到行人 背景 训练测试数据  hm_tr  hm_test bg_tr bg_test 都为[250, 252]
M_hm = sum(hm_tr,1)/250; % 理论里面的 M1 
M_bg = sum(bg_tr,1)/250; % M2
E_hm = (hm_tr-repmat(M_hm,250,1))*(hm_tr-repmat(M_hm,250,1))';
E_bg = (hm_bg-repmat(M_bg,250,1))*(hm_bg-repmat(M_bg,250,1))';

% 设计判决函数
count=0
for i=1:250
    R1 = log(0.5)+log(0.95)+log(abs(det(E_bg)))/2-((hm_test(i,:)-M_bg)'*inv(E_bg)*(hm_test(i,:)-M_bg));
    R2 = log(1.5) + log(0.05)+log(abs(det(E_hm)))/2-((hm_test(i,:)-M_hm)'*inv(E_hm)*(hm_test(i,:)-M_hm));
    if (R1<=R2)
        count = count+1;  % 计数器,统计分类正确的个数
    end
end
rate = count/250;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值