模式识别之bayes---bayes 简单天气预测实现实例
Bayes Classifier 分类
C++实现简单贝叶斯分类
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 分类
C++实现简单贝叶斯分类
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 简单天气预测实现实例的更多相关文章
- 一个简单的Android小实例
原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台 3.安装J ...
- mongodb 简单部署方案及实例
mongodb 简单部署方案及实例 转载:http://my.oschina.net/zhuzhu0129/blog/53290 第一节 准备工作 一 安装mongodb 我这里选用rehl 5.6 ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- 一个简单的jQuery插件开发实例
两年前写的一个简单的jQuery插件开发实例,还是可以看看的: <script type="text/javascript" src="jquery-1.7.2.m ...
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...
- [WCF REST] 一个简单的REST服务实例
Get:http://www.cnblogs.com/artech/archive/2012/02/04/wcf-rest-sample.html [01] 一个简单的REST服务实例 [02] We ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
- Hibernate入门2.简单的项目开发实例
Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...
- 简单的Slony-I设置实例 II
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页 回到顶级页面:PostgreSQL索引页 接前面例子, 简单的Slony-I设置实例 这次我 ...
随机推荐
- linux命令(50):comm命令的用法,求交集
Linux comm命令 使用局限比较大,适用于特殊场合: Linux comm命令用于比较两个已排过序的文件. 排序:sort -u file 这项指令会一列列地比较两个已排序文件的差异,并将其结果 ...
- Zend Studio 12 windows 无限期试用
安装: 1.下载最新版本Zend Studio:http://downloads.zend.com/studio-eclipse/12.0.0/ZendStudio-12.0.0-win32.win3 ...
- iOS开发如何学习前端(2)
iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...
- 【Cmd】批处理
小续 看了下时间,10年写的了 批处理是个很强大的东西,现在任何一个工具都包含这个功能,只是被工具给封闭起来了 怀念下dos时代的批处理啊 rem即高级语言中的注释的意思,能看懂每个程序的作用了吧 @ ...
- vue2.0如何自定义全局变量的方法
方法一:http://www.jianshu.com/p/04dffe7a6b74 //在mian.js中写入函数 Vue.prototype.changeData = function (){ al ...
- curl传输文件实例
curl -H "Authorization:Bearer 5d719398-4230-44c7-b88b-f280b6a8d070" -H "Accept: appli ...
- 【转】关于 SELECT /*!40001 SQL_NO_CACHE */ * FROM 的解惑
由于 在数据库做了缓存,在对数据库做了备份,然后在慢查询日志中发现了这一串字符: SELECT /*!40001 SQL_NO_CACHE */ * FROM 上网查了一下,发现好多答案,好多人说的都 ...
- FireFox在新标签中打开搜索结果
原文:https://jingyan.baidu.com/article/20b68a88563a1b796cec6228.html 步骤如下: (1)在浏览器的地址栏输入:about:config, ...
- 【Deep Learning】Hinton. Reducing the Dimensionality of Data with Neural Networks Reading Note
2006年,机器学习泰斗.多伦多大学计算机系教授Geoffery Hinton在Science发表文章,提出基于深度信念网络(Deep Belief Networks, DBN)可使用非监督的逐层贪心 ...
- Thinkphp CURD中的where方法
今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置.where方法的用法是ThinkPHP查询语言的精髓,也是Think ...