Bayes Classifier 分类

在模式识别的实际应用中,贝叶斯方法绝非就是post正比于prior*likelihood这个公式这么简单,一般而言我们都会用正态分布拟合likelihood来实现。
用正态分布拟合是什么意思呢?贝叶斯方法式子的右边有两个量,一个是prior先验概率,这个求起来很简单,就是一大堆数据中求某一类数据占的百分比就可以了,比如300个一堆的数据中A类数据占100个,那么A的先验概率就是1/3。第二个就是likelihood,likelihood可以这么理解:对于每一类的训练数据,我们都用一个multivariate正态分布来拟合它们(即通过求得某一分类训练数据的平均值和协方差矩阵来拟合出一个正态分布),然后当进入一个新的测试数据之后,就分别求取这个数据点在每个类别的正态分布中的大小,然后用这个值乘以原先的prior便是所要求得的后验概率post了。

C++实现简单贝叶斯分类

 
 
所用的数据文件为:weather.csv

outlook temperature humidity windy play
sunny hot high FALSE no
sunny hot high TRUE no
overcast hot high FALSE yes
rainy mild high FALSE yes
rainy cool normal FALSE yes
rainy cool normal TRUE no
overcast cool normal TRUE yes
sunny mild high FALSE no
sunny cool normal FALSE yes
rainy mild normal FALSE yes
sunny mild normal TRUE yes
overcast mild high TRUE yes
overcast hot normal FALSE yes
rainy mild high TRUE no

源代码:

/*
实现简单贝叶斯算法
Changfengmingzhi
*/
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
usingnamespace std;
vector<string> split(conststring& src,conststring& delimiter);//根据定界符分离字符串
void rejudge();//重新判断原输入数据的类别
vector<vector<string>> vect;//二维容器
map<string,int> category;//存放类别
map<string,double> pro_map;//存放各种概率的map容器
int main()
{
string strLine;
ifstream readfile(".\\weather.csv");
if(!readfile)//打开文件失败!
{
cout<<"Fail to open file weather!"<<endl;
return0;
}
else
{
cout<<"读取原始数据如下:"<<endl;
vector<vector<string>>::size_type st_x;//二维容器x坐标
vector<string>::size_type st_y;//二维容器y坐标
vector<string> temp_vect;
while(getline(readfile,strLine))//一行一行读取数据
{
cout<<strLine<<endl;
temp_vect=split(strLine,",");//调用分割函数分割一行字符串
vect.push_back(temp_vect);//插入二维容器
temp_vect.clear();//清空容器
}
string temp_string;//临时字符串
vector<string>::size_type temp_size1=vect.size();//总行数
vector<string>::size_type temp_size2=vect[0].size();//总列数
for(st_x=1;st_x<temp_size1;st_x++)//遍历二维容器,统计各种类别、属性|类别的个数,以便后面的概率的计算(跳过第一行的属性标题)
{
for(st_y=0;st_y<temp_size2;st_y++)
{
if(st_y!=temp_size2-1)//处理每一行前面的属性,统计属性|类别的个数
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;//计数加1
}
else//处理每一行的类别,统计类别的个数
{
temp_string=vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;//计数加1
category[vect[st_x][temp_size2-1]]=1;//还没有类别,则加入新的类别
}
temp_string.erase();
}
}
string::size_type st;
cout<<"统计过程如下:"<<endl;
for(map<string,double>::iterator it=pro_map.begin();it!=pro_map.end();it++)//计算条件概率(属性|类别)
{
cout<<it->first<<":"<<it->second<<endl;
if((st=it->first.find("|"))!=string::npos)
{
it->second=it->second/pro_map[it->first.substr(st+1)];
}
}
cout<<"计算概率过程如下:"<<endl;
for(map<string,double>::iterator it2=pro_map.begin();it2!=pro_map.end();it2++)//计算概率(类别)
{
if((st=it2->first.find("|"))==string::npos)
{
pro_map[it2->first]=pro_map[it2->first]/(double)temp_size1;
}
cout<<it2->first<<":"<<it2->second<<endl;
}
rejudge();
}

return0;
}
vector<string> split(conststring& src,conststring& delimiter)//根据定界符分离字符串
{
string::size_type st;
if(src.empty())
{
throw"Empty string!";
}
if(delimiter.empty())
{
throw"Empty delimiter!";
}
vector<string> vect;
string::size_type last_st=0;
while((st=src.find_first_of(delimiter,last_st))!=string::npos)
{
if(st!=last_st)//2个标记间的字符串为一个子字符串
{
vect.push_back(src.substr(last_st,st-last_st));
}
last_st=st+1;
}
if(last_st!=src.size())//标记不为最后一个字符
{
vect.push_back(src.substr(last_st,string::npos));
}
return vect;

}
void rejudge()//重新判断原输入数据的类别
{
string temp_string;
double temp_pro;
map<string,double> temp_map;//存放后验概率的临时容器
cout<<"经过简单贝叶斯算法重新分类的结果如下:"<<endl;
for(vector<vector<string>>::size_type st_x=1;st_x<vect.size();st_x++)//处理每一行数据
{
for(map<string,int>::iterator it=category.begin();it!=category.end();it++)//遍历类别,取出p(x|c1)和p(x|c2)等的概率值
{
temp_pro=1.0;
temp_string=vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];//乘上p(ci)
temp_string.erase();
for(vector<string>::size_type st_y=0;st_y<vect[st_x].size();st_y++)//处理列
{
if(it==category.begin()&&st_y!=vect[st_x].size()-1)//不输出原始数据已有的类别,使用预测出来的类别(只输出一次)
{
cout<<vect[st_x][st_y]<<" ";
}
if(st_y!=vect[st_x].size()-1)//乘上p(xi|cj),跳过最后一列,因为是类别而非属性
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];//乘上p(xi|cj)
temp_string.erase();
}
}
temp_map[it->first]=temp_pro;//存下概率
}
//////////根据概率最大判断哪个该条记录应属于哪个类别
string temp_string2;
temp_pro=0;//初始化概率为0
cout<<"后验概率:";
for(map<string,double>::iterator it2=temp_map.begin();it2!=temp_map.end();it2++)//遍历容器,找到后验概率最大的类别
{
cout<<it2->first<<":"<<it2->second<<" ";
if(it2->second>temp_pro)
{
temp_string2.erase();
temp_string2=it2->first;
temp_pro=it2->second;
}
}
cout<<"归类:"<<vect[0][vect[0].size()-1]<<"="<<temp_string2<<endl;//输出该条记录所属的类别
}
}

http://blog.sina.com.cn/s/blog_4fb4d8d40100nrcx.html

http://blog.csdn.net/xlm289348/article/details/8876862

Bayes Classifier 分类

在模式识别的实际应用中,贝叶斯方法绝非就是post正比于prior*likelihood这个公式这么简单,一般而言我们都会用正态分布拟合likelihood来实现。
用正态分布拟合是什么意思呢?贝叶斯方法式子的右边有两个量,一个是prior先验概率,这个求起来很简单,就是一大堆数据中求某一类数据占的百分比就可以了,比如300个一堆的数据中A类数据占100个,那么A的先验概率就是1/3。第二个就是likelihood,likelihood可以这么理解:对于每一类的训练数据,我们都用一个multivariate正态分布来拟合它们(即通过求得某一分类训练数据的平均值和协方差矩阵来拟合出一个正态分布),然后当进入一个新的测试数据之后,就分别求取这个数据点在每个类别的正态分布中的大小,然后用这个值乘以原先的prior便是所要求得的后验概率post了。

C++实现简单贝叶斯分类

 
 
所用的数据文件为:weather.csv

outlook temperature humidity windy play
sunny hot high FALSE no
sunny hot high TRUE no
overcast hot high FALSE yes
rainy mild high FALSE yes
rainy cool normal FALSE yes
rainy cool normal TRUE no
overcast cool normal TRUE yes
sunny mild high FALSE no
sunny cool normal FALSE yes
rainy mild normal FALSE yes
sunny mild normal TRUE yes
overcast mild high TRUE yes
overcast hot normal FALSE yes
rainy mild high TRUE no

源代码:

/*
实现简单贝叶斯算法
Changfengmingzhi
*/
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<map>
usingnamespace std;
vector<string> split(conststring& src,conststring& delimiter);//根据定界符分离字符串
void rejudge();//重新判断原输入数据的类别
vector<vector<string>> vect;//二维容器
map<string,int> category;//存放类别
map<string,double> pro_map;//存放各种概率的map容器
int main()
{
string strLine;
ifstream readfile(".\\weather.csv");
if(!readfile)//打开文件失败!
{
cout<<"Fail to open file weather!"<<endl;
return0;
}
else
{
cout<<"读取原始数据如下:"<<endl;
vector<vector<string>>::size_type st_x;//二维容器x坐标
vector<string>::size_type st_y;//二维容器y坐标
vector<string> temp_vect;
while(getline(readfile,strLine))//一行一行读取数据
{
cout<<strLine<<endl;
temp_vect=split(strLine,",");//调用分割函数分割一行字符串
vect.push_back(temp_vect);//插入二维容器
temp_vect.clear();//清空容器
}
string temp_string;//临时字符串
vector<string>::size_type temp_size1=vect.size();//总行数
vector<string>::size_type temp_size2=vect[0].size();//总列数
for(st_x=1;st_x<temp_size1;st_x++)//遍历二维容器,统计各种类别、属性|类别的个数,以便后面的概率的计算(跳过第一行的属性标题)
{
for(st_y=0;st_y<temp_size2;st_y++)
{
if(st_y!=temp_size2-1)//处理每一行前面的属性,统计属性|类别的个数
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;//计数加1
}
else//处理每一行的类别,统计类别的个数
{
temp_string=vect[0][temp_size2-1]+"="+vect[st_x][temp_size2-1];
pro_map[temp_string]++;//计数加1
category[vect[st_x][temp_size2-1]]=1;//还没有类别,则加入新的类别
}
temp_string.erase();
}
}
string::size_type st;
cout<<"统计过程如下:"<<endl;
for(map<string,double>::iterator it=pro_map.begin();it!=pro_map.end();it++)//计算条件概率(属性|类别)
{
cout<<it->first<<":"<<it->second<<endl;
if((st=it->first.find("|"))!=string::npos)
{
it->second=it->second/pro_map[it->first.substr(st+1)];
}
}
cout<<"计算概率过程如下:"<<endl;
for(map<string,double>::iterator it2=pro_map.begin();it2!=pro_map.end();it2++)//计算概率(类别)
{
if((st=it2->first.find("|"))==string::npos)
{
pro_map[it2->first]=pro_map[it2->first]/(double)temp_size1;
}
cout<<it2->first<<":"<<it2->second<<endl;
}
rejudge();
}

return0;
}
vector<string> split(conststring& src,conststring& delimiter)//根据定界符分离字符串
{
string::size_type st;
if(src.empty())
{
throw"Empty string!";
}
if(delimiter.empty())
{
throw"Empty delimiter!";
}
vector<string> vect;
string::size_type last_st=0;
while((st=src.find_first_of(delimiter,last_st))!=string::npos)
{
if(st!=last_st)//2个标记间的字符串为一个子字符串
{
vect.push_back(src.substr(last_st,st-last_st));
}
last_st=st+1;
}
if(last_st!=src.size())//标记不为最后一个字符
{
vect.push_back(src.substr(last_st,string::npos));
}
return vect;

}
void rejudge()//重新判断原输入数据的类别
{
string temp_string;
double temp_pro;
map<string,double> temp_map;//存放后验概率的临时容器
cout<<"经过简单贝叶斯算法重新分类的结果如下:"<<endl;
for(vector<vector<string>>::size_type st_x=1;st_x<vect.size();st_x++)//处理每一行数据
{
for(map<string,int>::iterator it=category.begin();it!=category.end();it++)//遍历类别,取出p(x|c1)和p(x|c2)等的概率值
{
temp_pro=1.0;
temp_string=vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];//乘上p(ci)
temp_string.erase();
for(vector<string>::size_type st_y=0;st_y<vect[st_x].size();st_y++)//处理列
{
if(it==category.begin()&&st_y!=vect[st_x].size()-1)//不输出原始数据已有的类别,使用预测出来的类别(只输出一次)
{
cout<<vect[st_x][st_y]<<" ";
}
if(st_y!=vect[st_x].size()-1)//乘上p(xi|cj),跳过最后一列,因为是类别而非属性
{
temp_string=vect[0][st_y]+"="+vect[st_x][st_y]+"|"+vect[0][vect[0].size()-1]+"="+it->first;
temp_pro*=pro_map[temp_string];//乘上p(xi|cj)
temp_string.erase();
}
}
temp_map[it->first]=temp_pro;//存下概率
}
//////////根据概率最大判断哪个该条记录应属于哪个类别
string temp_string2;
temp_pro=0;//初始化概率为0
cout<<"后验概率:";
for(map<string,double>::iterator it2=temp_map.begin();it2!=temp_map.end();it2++)//遍历容器,找到后验概率最大的类别
{
cout<<it2->first<<":"<<it2->second<<" ";
if(it2->second>temp_pro)
{
temp_string2.erase();
temp_string2=it2->first;
temp_pro=it2->second;
}
}
cout<<"归类:"<<vect[0][vect[0].size()-1]<<"="<<temp_string2<<endl;//输出该条记录所属的类别
}
}

模式识别之bayes---bayes 简单天气预测实现实例的更多相关文章

  1. 一个简单的Android小实例

    原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台   3.安装J ...

  2. mongodb 简单部署方案及实例

    mongodb 简单部署方案及实例 转载:http://my.oschina.net/zhuzhu0129/blog/53290 第一节 准备工作 一 安装mongodb  我这里选用rehl 5.6 ...

  3. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  4. 一个简单的jQuery插件开发实例

    两年前写的一个简单的jQuery插件开发实例,还是可以看看的: <script type="text/javascript" src="jquery-1.7.2.m ...

  5. springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目

    一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...

  6. [WCF REST] 一个简单的REST服务实例

    Get:http://www.cnblogs.com/artech/archive/2012/02/04/wcf-rest-sample.html [01] 一个简单的REST服务实例 [02] We ...

  7. PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...

  8. Hibernate入门2.简单的项目开发实例

    Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...

  9. 简单的Slony-I设置实例 II

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...

随机推荐

  1. linux Ctrl+z和Ctrl+c的区别

    1.Ctrl+z 挂起进程,并不会结束,执行fg命令可以重新启动这个被挂起的命令. 2.Ctrl+c 终止进程

  2. 灯光探测器LightProbe[Unity]

    灯光探测器的目的,抄手册上的话就是: Although lightmapping adds greatly to the realism of a scene, it has the disadvan ...

  3. JSch远程执行脚本

    JSch远程执行脚本 2017-02-24 在自动化测试的时候,需要远程操控服务器做一些操作,比如切日.起服务器.执行某些脚本.如何实现? 我们可以利用JSch,远程执行脚本.JSch是Java Se ...

  4. LeetCode: String to Integer (atoi) 解题报告

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  5. maven pom属性 详解

    pom.xml文件(实践用):<project xmlns="http://maven.apache.org/POM/4.0.0"   xmlns:xsi="htt ...

  6. 把Java中\u格式的unicode编码转成中文

    使用org.apache.commons.lang.StringEscapeUtils#unescapeJava(String)方法. 当然用org.apache.commons.lang.Strin ...

  7. C#学习笔记(5)——大项目查找

    说明(2017-5-27 16:34:39): 1. 注意事项: (0)设计窗体,添加一个dgv,添加5个列名,修改名字和绑定数据. (1)添加引用,system.data.sqlclient (2) ...

  8. 25个必须记住的SSH命令【转】

    OpenSSH是SSH连接工具的免费版本.telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃 ...

  9. Centos 5.2 下配置 php 的 json 扩展

    01.下载源文件包:   wget http://www.aurore.net/projects/php-json/php-json-ext-1.2.1.tar.bz2 02.解压文件包:   tar ...

  10. jQuery笔记二——基础/动画

    1. jQuery的基础语法: $(selector).action() 2. 很多jQuery的语句放在ready里面 $(document).ready(function(){ // jQuery ...