数据挖掘分类算法之贝叶斯分类法原理及C++实现

   朴素贝叶斯分类的正式定义如下:

      1、设为一个待分类项,而每个a为x的一个特征属性。

      2、有类别集合

      3、计算

      4、如果,则

      那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

      1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

      2、统计得到在各类别下各个特征属性的条件概率估计。即

      3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

      

      因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

      

c++实现源码

#include <iostream>  
#include <fstream>  
#include <vector>  
#include <math.h>  

using namespace std;
//存放元组的属性信息  
struct Record {
	char key;
	int x1;
	int x2;
	int x3;
	int x4;
};

char classify(vector<Record> data, Record rec )//分类函数
{
	double Weight[3] = {};
	char result;
	long int total = data.size();
	long int Y[3] = {};
	long int x[3][4] = {};

	for (int i = 0; i != total; ++i) {
		switch (data[i].key)
		{
		case 'L':
			Y[0]++;
			if (rec.x1 == data[i].x1)
				x[0][0]++;
			if (rec.x2 == data[i].x2)
				x[0][1]++;
			if (rec.x3 == data[i].x3)
				x[0][2]++;
			if (rec.x4 == data[i].x4)
				x[0][3]++;
			break;
		case 'B':
			Y[1]++;
			if (rec.x1 == data[i].x1)
				x[1][0]++;
			if (rec.x2 == data[i].x2)
				x[1][1]++;
			if (rec.x3 == data[i].x3)
				x[1][2]++;
			if (rec.x4 == data[i].x4)
				x[1][3]++;
			break;

		default:
			Y[2]++;
			if (rec.x1 == data[i].x1)
				x[2][0]++;
			if (rec.x2 == data[i].x2)
				x[2][1]++;
			if (rec.x3 == data[i].x3)
				x[2][2]++;
			if (rec.x4 == data[i].x4)
				x[2][3]++;
			break;
		}
	}

	Weight[0] = ((double)x[0][0] / Y[0] )*((double)x[0][1] / Y[0]) * ((double)x[0][2] / Y[0]) *((double)x[0][3] / total);
	Weight[1] = ((double)x[1][0] / Y[1])*((double)x[1][1] / Y[1]) * ((double)x[1][2] / Y[1]) *((double)x[1][3] / total);
	Weight[2] = ((double)x[2][0] / Y[2])*((double)x[2][1] / Y[2]) * ((double)x[2][2] / Y[2]) *((double)x[2][3] / total);

	if ((Weight[0] - Weight[1])>0.00000000000001 && (Weight[0] - Weight[2])>0.00000000000001)
		result = 'L';
	else if ((Weight[2] - Weight[1])>0.00000000000001 && (Weight[2] - Weight[0])>0.00000000000001)
		result = 'R';
	else
		result = 'B';
	return result;
}

int main() {

	char fname[256]="balance-scale.txt";
	ifstream infile;
	infile.open(fname, ios::in);
	if (!infile) {
		cout << "不能打开输入的文件" << fname << endl;
		return 0;
	}
	int count = 0;
	vector<Record> data;
	Record rec;
	//从文件流中读入数据  
	while (!infile.eof()) {
		count++;
		switch (count % 5)
		{
		case 1:infile >> rec.key; break;
		case 2:infile >> rec.x1; break;
		case 3:infile >> rec.x2; break;
		case 4:infile >> rec.x3; break;
		default:
			infile >> rec.x4;
			data.push_back(rec);
			break;
		}
		
	}
	while (true)
	{
		cout << "请输入数据(以空格分隔):";
		cin >> rec.x1 >> rec.x2 >> rec.x3 >> rec.x4;

		cout << "分类结果:" << classify(data, rec) << endl;;
		

	}
	system("pause");
	return 0;
}

训练数据存入balance-scale.txt,数据如下

B 1 1 1 1
R 1 1 1 2
R 1 1 1 3
R 1 1 1 4
R 1 1 1 5
R 1 1 2 1
R 1 1 2 2
R 1 1 2 3
R 1 1 2 4
R 1 1 2 5
R 1 1 3 1
R 1 1 3 2
R 1 1 3 3
R 1 1 3 4
R 1 1 3 5
R 1 1 4 1
R 1 1 4 2
R 1 1 4 3
R 1 1 4 4
R 1 1 4 5
R 1 1 5 1
R 1 1 5 2
R 1 1 5 3
R 1 1 5 4
R 1 1 5 5
L 1 2 1 1
B 1 2 1 2
R 1 2 1 3
R 1 2 1 4
R 1 2 1 5
B 1 2 2 1
R 1 2 2 2
R 1 2 2 3
R 1 2 2 4
R 1 2 2 5
R 1 2 3 1
R 1 2 3 2
R 1 2 3 3
R 1 2 3 4
R 1 2 3 5
R 1 2 4 1
R 1 2 4 2
R 1 2 4 3
R 1 2 4 4
R 1 2 4 5
R 1 2 5 1
R 1 2 5 2
R 1 2 5 3
R 1 2 5 4
R 1 2 5 5
L 1 3 1 1
L 1 3 1 2
B 1 3 1 3
R 1 3 1 4
R 1 3 1 5
L 1 3 2 1
R 1 3 2 2
R 1 3 2 3
R 1 3 2 4
R 1 3 2 5
B 1 3 3 1
R 1 3 3 2
R 1 3 3 3
R 1 3 3 4
R 1 3 3 5
R 1 3 4 1
R 1 3 4 2
R 1 3 4 3
R 1 3 4 4
R 1 3 4 5
R 1 3 5 1
R 1 3 5 2
R 1 3 5 3
R 1 3 5 4
R 1 3 5 5
L 1 4 1 1
L 1 4 1 2
L 1 4 1 3
B 1 4 1 4
R 1 4 1 5
L 1 4 2 1
B 1 4 2 2
R 1 4 2 3
R 1 4 2 4
R 1 4 2 5
L 1 4 3 1
R 1 4 3 2
R 1 4 3 3
R 1 4 3 4
R 1 4 3 5
B 1 4 4 1
R 1 4 4 2
R 1 4 4 3
R 1 4 4 4
R 1 4 4 5
R 1 4 5 1
R 1 4 5 2
R 1 4 5 3
R 1 4 5 4
R 1 4 5 5
L 1 5 1 1
L 1 5 1 2
L 1 5 1 3
L 1 5 1 4
B 1 5 1 5
L 1 5 2 1
L 1 5 2 2
R 1 5 2 3
R 1 5 2 4
R 1 5 2 5
L 1 5 3 1
R 1 5 3 2
R 1 5 3 3
R 1 5 3 4
R 1 5 3 5
L 1 5 4 1
R 1 5 4 2
R 1 5 4 3
R 1 5 4 4
R 1 5 4 5
B 1 5 5 1
R 1 5 5 2
R 1 5 5 3
R 1 5 5 4
R 1 5 5 5
L 2 1 1 1
B 2 1 1 2
R 2 1 1 3
R 2 1 1 4
R 2 1 1 5
B 2 1 2 1
R 2 1 2 2
R 2 1 2 3
R 2 1 2 4
R 2 1 2 5
R 2 1 3 1
R 2 1 3 2
R 2 1 3 3
R 2 1 3 4
R 2 1 3 5
R 2 1 4 1
R 2 1 4 2
R 2 1 4 3
R 2 1 4 4
R 2 1 4 5
R 2 1 5 1
R 2 1 5 2
R 2 1 5 3
R 2 1 5 4
R 2 1 5 5
L 2 2 1 1
L 2 2 1 2
L 2 2 1 3
B 2 2 1 4
R 2 2 1 5
L 2 2 2 1
B 2 2 2 2
R 2 2 2 3
R 2 2 2 4
R 2 2 2 5
L 2 2 3 1
R 2 2 3 2
R 2 2 3 3
R 2 2 3 4
R 2 2 3 5
B 2 2 4 1
R 2 2 4 2
R 2 2 4 3
R 2 2 4 4
R 2 2 4 5
R 2 2 5 1
R 2 2 5 2
R 2 2 5 3
R 2 2 5 4
R 2 2 5 5
L 2 3 1 1
L 2 3 1 2
L 2 3 1 3
L 2 3 1 4
L 2 3 1 5
L 2 3 2 1
L 2 3 2 2
B 2 3 2 3
R 2 3 2 4
R 2 3 2 5
L 2 3 3 1
B 2 3 3 2
R 2 3 3 3
R 2 3 3 4
R 2 3 3 5
L 2 3 4 1
R 2 3 4 2
R 2 3 4 3
R 2 3 4 4
R 2 3 4 5
L 2 3 5 1
R 2 3 5 2
R 2 3 5 3
R 2 3 5 4
R 2 3 5 5
L 2 4 1 1
L 2 4 1 2
L 2 4 1 3
L 2 4 1 4
L 2 4 1 5
L 2 4 2 1
L 2 4 2 2
L 2 4 2 3
B 2 4 2 4
R 2 4 2 5
L 2 4 3 1
L 2 4 3 2
R 2 4 3 3
R 2 4 3 4
R 2 4 3 5
L 2 4 4 1
B 2 4 4 2
R 2 4 4 3
R 2 4 4 4
R 2 4 4 5
L 2 4 5 1
R 2 4 5 2
R 2 4 5 3
R 2 4 5 4
R 2 4 5 5
L 2 5 1 1
L 2 5 1 2
L 2 5 1 3
L 2 5 1 4
L 2 5 1 5
L 2 5 2 1
L 2 5 2 2
L 2 5 2 3
L 2 5 2 4
B 2 5 2 5
L 2 5 3 1
L 2 5 3 2
L 2 5 3 3
R 2 5 3 4
R 2 5 3 5
L 2 5 4 1
L 2 5 4 2
R 2 5 4 3
R 2 5 4 4
R 2 5 4 5
L 2 5 5 1
B 2 5 5 2
R 2 5 5 3
R 2 5 5 4
R 2 5 5 5
L 3 1 1 1
L 3 1 1 2
B 3 1 1 3
R 3 1 1 4
R 3 1 1 5
L 3 1 2 1
R 3 1 2 2
R 3 1 2 3
R 3 1 2 4
R 3 1 2 5
B 3 1 3 1
R 3 1 3 2
R 3 1 3 3
R 3 1 3 4
R 3 1 3 5
R 3 1 4 1
R 3 1 4 2
R 3 1 4 3
R 3 1 4 4
R 3 1 4 5
R 3 1 5 1
R 3 1 5 2
R 3 1 5 3
R 3 1 5 4
R 3 1 5 5
L 3 2 1 1
L 3 2 1 2
L 3 2 1 3
L 3 2 1 4
L 3 2 1 5
L 3 2 2 1
L 3 2 2 2
B 3 2 2 3
R 3 2 2 4
R 3 2 2 5
L 3 2 3 1
B 3 2 3 2
R 3 2 3 3
R 3 2 3 4
R 3 2 3 5
L 3 2 4 1
R 3 2 4 2
R 3 2 4 3
R 3 2 4 4
R 3 2 4 5
L 3 2 5 1
R 3 2 5 2
R 3 2 5 3
R 3 2 5 4
R 3 2 5 5
L 3 3 1 1
L 3 3 1 2
L 3 3 1 3
L 3 3 1 4
L 3 3 1 5
L 3 3 2 1
L 3 3 2 2
L 3 3 2 3
L 3 3 2 4
R 3 3 2 5
L 3 3 3 1
L 3 3 3 2
B 3 3 3 3
R 3 3 3 4
R 3 3 3 5
L 3 3 4 1
L 3 3 4 2
R 3 3 4 3
R 3 3 4 4
R 3 3 4 5
L 3 3 5 1
R 3 3 5 2
R 3 3 5 3
R 3 3 5 4
R 3 3 5 5
L 3 4 1 1
L 3 4 1 2
L 3 4 1 3
L 3 4 1 4
L 3 4 1 5
L 3 4 2 1
L 3 4 2 2
L 3 4 2 3
L 3 4 2 4
L 3 4 2 5
L 3 4 3 1
L 3 4 3 2
L 3 4 3 3
B 3 4 3 4
R 3 4 3 5
L 3 4 4 1
L 3 4 4 2
B 3 4 4 3
R 3 4 4 4
R 3 4 4 5
L 3 4 5 1
L 3 4 5 2
R 3 4 5 3
R 3 4 5 4
R 3 4 5 5
L 3 5 1 1
L 3 5 1 2
L 3 5 1 3
L 3 5 1 4
L 3 5 1 5
L 3 5 2 1
L 3 5 2 2
L 3 5 2 3
L 3 5 2 4
L 3 5 2 5
L 3 5 3 1
L 3 5 3 2
L 3 5 3 3
L 3 5 3 4
B 3 5 3 5
L 3 5 4 1
L 3 5 4 2
L 3 5 4 3
R 3 5 4 4
R 3 5 4 5
L 3 5 5 1
L 3 5 5 2
B 3 5 5 3
R 3 5 5 4
R 3 5 5 5
L 4 1 1 1
L 4 1 1 2
L 4 1 1 3
B 4 1 1 4
R 4 1 1 5
L 4 1 2 1
B 4 1 2 2
R 4 1 2 3
R 4 1 2 4
R 4 1 2 5
L 4 1 3 1
R 4 1 3 2
R 4 1 3 3
R 4 1 3 4
R 4 1 3 5
B 4 1 4 1
R 4 1 4 2
R 4 1 4 3
R 4 1 4 4
R 4 1 4 5
R 4 1 5 1
R 4 1 5 2
R 4 1 5 3
R 4 1 5 4
R 4 1 5 5
L 4 2 1 1
L 4 2 1 2
L 4 2 1 3
L 4 2 1 4
L 4 2 1 5
L 4 2 2 1
L 4 2 2 2
L 4 2 2 3
B 4 2 2 4
R 4 2 2 5
L 4 2 3 1
L 4 2 3 2
R 4 2 3 3
R 4 2 3 4
R 4 2 3 5
L 4 2 4 1
B 4 2 4 2
R 4 2 4 3
R 4 2 4 4
R 4 2 4 5
L 4 2 5 1
R 4 2 5 2
R 4 2 5 3
R 4 2 5 4
R 4 2 5 5
L 4 3 1 1
L 4 3 1 2
L 4 3 1 3
L 4 3 1 4
L 4 3 1 5
L 4 3 2 1
L 4 3 2 2
L 4 3 2 3
L 4 3 2 4
L 4 3 2 5
L 4 3 3 1
L 4 3 3 2
L 4 3 3 3
B 4 3 3 4
R 4 3 3 5
L 4 3 4 1
L 4 3 4 2
B 4 3 4 3
R 4 3 4 4
R 4 3 4 5
L 4 3 5 1
L 4 3 5 2
R 4 3 5 3
R 4 3 5 4
R 4 3 5 5
L 4 4 1 1
L 4 4 1 2
L 4 4 1 3
L 4 4 1 4
L 4 4 1 5
L 4 4 2 1
L 4 4 2 2
L 4 4 2 3
L 4 4 2 4
L 4 4 2 5
L 4 4 3 1
L 4 4 3 2
L 4 4 3 3
L 4 4 3 4
L 4 4 3 5
L 4 4 4 1
L 4 4 4 2
L 4 4 4 3
B 4 4 4 4
R 4 4 4 5
L 4 4 5 1
L 4 4 5 2
L 4 4 5 3
R 4 4 5 4
R 4 4 5 5
L 4 5 1 1
L 4 5 1 2
L 4 5 1 3
L 4 5 1 4
L 4 5 1 5
L 4 5 2 1
L 4 5 2 2
L 4 5 2 3
L 4 5 2 4
L 4 5 2 5
L 4 5 3 1
L 4 5 3 2
L 4 5 3 3
L 4 5 3 4
L 4 5 3 5
L 4 5 4 1
L 4 5 4 2
L 4 5 4 3
L 4 5 4 4
B 4 5 4 5
L 4 5 5 1
L 4 5 5 2
L 4 5 5 3
B 4 5 5 4
R 4 5 5 5
L 5 1 1 1
L 5 1 1 2
L 5 1 1 3
L 5 1 1 4
B 5 1 1 5
L 5 1 2 1
L 5 1 2 2
R 5 1 2 3
R 5 1 2 4
R 5 1 2 5
L 5 1 3 1
R 5 1 3 2
R 5 1 3 3
R 5 1 3 4
R 5 1 3 5
L 5 1 4 1
R 5 1 4 2
R 5 1 4 3
R 5 1 4 4
R 5 1 4 5
B 5 1 5 1
R 5 1 5 2
R 5 1 5 3
R 5 1 5 4
R 5 1 5 5
L 5 2 1 1
L 5 2 1 2
L 5 2 1 3
L 5 2 1 4
L 5 2 1 5
L 5 2 2 1
L 5 2 2 2
L 5 2 2 3
L 5 2 2 4
B 5 2 2 5
L 5 2 3 1
L 5 2 3 2
L 5 2 3 3
R 5 2 3 4
R 5 2 3 5
L 5 2 4 1
L 5 2 4 2
R 5 2 4 3
R 5 2 4 4
R 5 2 4 5
L 5 2 5 1
B 5 2 5 2
R 5 2 5 3
R 5 2 5 4
R 5 2 5 5
L 5 3 1 1
L 5 3 1 2
L 5 3 1 3
L 5 3 1 4
L 5 3 1 5
L 5 3 2 1
L 5 3 2 2
L 5 3 2 3
L 5 3 2 4
L 5 3 2 5
L 5 3 3 1
L 5 3 3 2
L 5 3 3 3
L 5 3 3 4
B 5 3 3 5
L 5 3 4 1
L 5 3 4 2
L 5 3 4 3
R 5 3 4 4
R 5 3 4 5
L 5 3 5 1
L 5 3 5 2
B 5 3 5 3
R 5 3 5 4
R 5 3 5 5
L 5 4 1 1
L 5 4 1 2
L 5 4 1 3
L 5 4 1 4
L 5 4 1 5
L 5 4 2 1
L 5 4 2 2
L 5 4 2 3
L 5 4 2 4
L 5 4 2 5
L 5 4 3 1
L 5 4 3 2
L 5 4 3 3
L 5 4 3 4
L 5 4 3 5
L 5 4 4 1
L 5 4 4 2
L 5 4 4 3
L 5 4 4 4
B 5 4 4 5
L 5 4 5 1
L 5 4 5 2
L 5 4 5 3
B 5 4 5 4
R 5 4 5 5
L 5 5 1 1
L 5 5 1 2
L 5 5 1 3
L 5 5 1 4
L 5 5 1 5
L 5 5 2 1
L 5 5 2 2
L 5 5 2 3
L 5 5 2 4
L 5 5 2 5
L 5 5 3 1
L 5 5 3 2
L 5 5 3 3
L 5 5 3 4
L 5 5 3 5
L 5 5 4 1
L 5 5 4 2
L 5 5 4 3
L 5 5 4 4
L 5 5 4 5
L 5 5 5 1
L 5 5 5 2
L 5 5 5 3
L 5 5 5 4
B 5 5 5 5

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值