贝叶斯学习 -- matlab、python代码分析(3)
来源:互联网 发布:手机淘宝如何取消代付 编辑:程序博客网 时间:2024/06/07 23:59
实例分析(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; endend% 朴素贝叶斯算法实现分类问题(三类 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 endend%%% 接下来做预测!! 求V_NBrate = 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 endendfprintf('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; % M2E_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=0for 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; % 计数器,统计分类正确的个数 endendrate = count/250;
0 0
- 贝叶斯学习 -- matlab、python代码分析(3)
- 贝叶斯学习 -- matlab、python代码分析(4)
- matlab调用python代码
- Python调用Matlab代码
- MATLAB深度学习代码详细分析(一)__nnff.m
- 机器学习之一:logistic回归分析(含Matlab代码)
- python ethereum 代码分析 《3》
- 【Matlab】SIFT_feature代码学习
- 集成学习(1)--Matlab/Python
- HMM matlab代码实现+分析
- 灵敏度分析和MATLAB代码
- MATLAB学习(3)
- BoxFilter包滤波器的Matlab代码实现分析(基础)
- 目标跟踪:KCF代码分析(matlab版本)
- 数学类网站、代码(Matlab & Python & R)
- 决策树(Decision Tree)--python实例代码分析(3)
- 【Matlab学习】自己的Matlab代码整理
- matlab:深度学习CNN matlab代码解析
- 第12周OJ实践 利用参数宏进行角度与弧度转换
- bzoj 4520: [Cqoi2016]K远点对 KDtree
- javaScript深度解析(1)--作用域
- 1001.高精度乘法的处理方法
- Activity not started, its current task has been brought to the front
- 贝叶斯学习 -- matlab、python代码分析(3)
- codeforces 554B B. Ohana Cleans Up
- openwrt上单独安装python-light使用json的问题
- mysql与oracle区别
- 细节决定成败
- 自定义GridView
- CoderForces 734B
- Linux进程管理三剑客ps、htop、dstat
- [kuangbin带你飞]专题九 连通图 A - Network of Schools (强连通分量)(模板)