首页 > 试题广场 >

实现朴素贝叶斯分类器

[编程题]实现朴素贝叶斯分类器
  • 热度指数:99 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

朴素贝叶斯分类器假设在给定样本label的情况下,样本的不同特征之间相互独立。现用朴素贝叶斯分类器进行垃圾邮件识别,数据包含4个特征。现有的训练数据如下表:

现在将所有的特征进行转换后,得到下表(请在程序以硬编码方式读入):
转换规则如下:(注:[m,n]表示m,n之间的闭区间,[m,+]表示大于m的开区间)
标题长度(feature 1):1: [0,3], 2: [3,6], 3: [6,+]

正文长度(feature 2):1: [0,10], 2:[10,20], 3: [20,+]

附件含有可执行程序(feature 3):1: 是, 0:

正文含特殊字符(feature 4):1:是,0:

请在程序中读入上述训练数据,实现朴素贝叶斯分类器,语言不限,但不能使用第三方库,不需要考虑平滑方法,然后对给定的测试数据(特征已转换)进行预测,输出结果;



输入描述:
输入数据如下,第一行一个数字M,表示共有M行训练数据,
第2~M+1行,每行5个数字,分别以空格隔开,前四个数字分别代表四个特征,第5个数字代表这一个样本label值。
第M+2行是一个数字N,表示共有N行测试样本,随后的N行每行4个数字,分别代表四个特征的值。

14
1 1 1 0 1
1 1 1 1 1
2 1 1 0 0
3 2 1 0 0
3 3 0 0 0
3 3 0 1 1
2 3 0 1 0
1 2 1 0 1
1 3 0 0 0
3 2 0 0 0
1 2 0 0 0
2 2 1 1 0
2 1 0 0 0
3 2 1 1 1
5
3 1 0 0
1 1 0 0
2 2 1 1
2 3 1 1
3 3 0 0


输出描述:
使用贝叶斯模型对测试样本进行预测,所有结果按顺序输出到一行,以空格分隔;

0 0 0 0 0
示例1

输入

14
1 1 1 0 1
1 1 1 1 1
2 1 1 0 0
3 2 1 0 0
3 3 0 0 0
3 3 0 1 1
2 3 0 1 0
1 2 1 0 1
1 3 0 0 0
3 2 0 0 0
1 2 0 0 0
2 2 1 1 0
2 1 0 0 0
3 2 1 1 1
5
1 1 0 0
1 1 1 0
1 2 1 0
2 1 0 1
2 2 1 1

输出

0 1 1 0 0
该题一个麻烦的是输入与输出的格式的转换 由于不能用第三方库 只能转成list形式 
发表于 2019-12-31 12:27:16 回复(0)
# 看到题的时候没想到什么好的解决办法,只能算出每个概率,然后计算后验概率,如果有大佬有好的解决办法就教教孩子吧
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int main(){
    float A[3] = {0}, B[3] = {0}, C[2] = {0}, D[2] = {0}, Y[2] = {0}, AY[3][2] = {0}, BY[3][2] = {0}, CY[2][2] = {0}, DY[2][2] = {0};
    int M; cin >> M;
    int train[M][5];
    for(int i=0; i<M; i++){
        for(int j=0; j<5; j++){
            cin >> train[i][j];
            if(j==0){
                A[train[i][j]-1]++;
            }
            if(j==1){
                B[train[i][j]-1]++;
            }
            if(j==2){
                C[train[i][j]]++;
            }
            if(j==3){
                D[train[i][j]]++;
            }
            if(j==4){
                Y[train[i][j]]++;
                AY[train[i][0]-1][train[i][j]]++;
                BY[train[i][1]-1][train[i][j]]++;
                CY[train[i][2]][train[i][j]]++;
                DY[train[i][3]][train[i][j]]++;
            }
        }
    }
    A[0] = A[0]/double(M); A[1] = A[1]/double(M); A[2] = A[2]/double(M); 
    B[0] = B[0]/double(M); B[1] = B[1]/double(M); B[2] = B[2]/double(M); 
    C[0] = C[0]/double(M); C[1] = C[1]/double(M); 
    D[0] = D[0]/double(M); D[1] = D[1]/double(M); 
    
    //AY,BY,CY,DY
    AY[0][0] = AY[0][0]/double(Y[0]); AY[1][0] = AY[1][0]/double(Y[0]); AY[2][0] = AY[2][0]/double(Y[0]); 
    AY[0][1] = AY[0][1]/double(Y[1]); AY[1][1] = AY[1][1]/double(Y[1]); AY[2][1] = AY[2][1]/double(Y[1]);
    BY[0][0] = BY[0][0]/double(Y[0]); BY[1][0] = BY[1][0]/double(Y[0]); BY[2][0] = BY[2][0]/double(Y[0]); 
    BY[0][1] = BY[0][1]/double(Y[1]); BY[1][1] = BY[1][1]/double(Y[1]); BY[2][1] = BY[2][1]/double(Y[1]);
    CY[0][0] = CY[0][0]/double(Y[0]); CY[1][0] = CY[1][0]/double(Y[0]); 
    CY[0][1] = CY[0][1]/double(Y[1]); CY[1][1] = CY[1][1]/double(Y[1]); 
    DY[0][0] = DY[0][0]/double(Y[0]); DY[1][0] = DY[1][0]/double(Y[0]); 
    DY[0][1] = DY[0][1]/double(Y[1]); DY[1][1] = DY[1][1]/double(Y[1]); 
    Y[0] = Y[0]/double(M); Y[1] = Y[1]/double(M); 
    //cout << Y[0] <<' ' << Y[1] << endl;
    int N; cin >> N;
    int a, b, c, d;
    float Y0 = 0, Y1 = 0;
    for(int i=0;i<N;i++){
        cin >> a >> b >> c >> d;
        Y0 = Y[0]*(AY[a-1][0]*BY[b-1][0]*CY[c][0]*DY[d][0])/(A[a-1]*B[b-1]*C[c]*D[d]);
        Y1 = Y[1]*(AY[a-1][1]*BY[b-1][1]*CY[c][1]*DY[d][1])/(A[a-1]*B[b-1]*C[c]*D[d]);
        if(Y0>=Y1){
            cout << 0 << ' ';
        }else{
            cout << 1 << ' ';
        }
    }
    
    return 0;
}

发表于 2022-07-07 17:04:40 回复(0)