朴素贝叶斯分类的正式定义如下:
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