《统计学习方法》+朴素贝叶斯算法+C++代码(简单)实现

来源:互联网 发布:明略数据 待遇怎么样 编辑:程序博客网 时间:2024/06/06 18:17

        首先,学习朴素贝叶斯算法得了解一些基本知识,比如全概率公式和贝叶斯公式,这些知识随便找一本书或者在网上都能够获得。在此,这里仅关注贝叶斯算法本身,以及其具体的实现(以例4.1的例子为参考)。

    贝叶斯算法:




    编程实现以上算法,代码如下:

#include <iostream>#include <set>#include <vector>using namespace std;//定义训练数据#define M 3#define N 15//为了计算简单,对A2={S, M, L},令S=1, M=2, L=3;//Y={1, -1},令为Y={1, 2}int A[M][N]= {{1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3},{1 , 2 , 2 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 2 , 2 , 3 , 3},{2 , 2 , 1 , 1 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2}};struct Px1{int x1;int y;double p_x1y;};struct Px2{int x2;int y;double p_x2y;};double p[2];Px1 px1[6];Px2 px2[6];//计算先验概率和条件概率void calP(){//计算先验//double p[2];int i, j, k;multiset<int> m_x1, m_x2, m_y;//多重集容器multiset<int>::iterator pos1;set<int> x1, x2, y;//集合容器set<int>::iterator pos2, pos3;//运用多重集容器和集合容器for(i = 0; i < N; i++){m_x1.insert(A[0][i]);m_x2.insert(A[1][i]);m_y.insert(A[2][i]);x1.insert(A[0][i]);x2.insert(A[1][i]);y.insert(A[2][i]);}p[0] = m_y.count(1) / (double)N;//p(Y = 1)p[1] = m_y.count(2) / (double)N;//p(Y = 2)cout << endl << "************先验***********" << endl;cout << "p(Y = 1) = " << p[0] << endl;cout << "p(Y = 2) = " << p[1] << endl;//计算条件概率cout << endl;cout << "*********条件概率********" << endl;//int px1_num = 3 * 2;//int px2_num = 3 * 2;j=0;for(pos2 = y.begin(); pos2 != y.end(); pos2++){for(pos3 = x1.begin(); pos3 != x1.end(); pos3++){px1[j].y = *pos2;px1[j].x1 = *pos3;int count_x1y = 0;for(k = 0; k < N; k++){if(A[0][k] == px1[j].x1 && A[2][k] == px1[j].y)count_x1y++;}px1[j].p_x1y = count_x1y / (double)m_y.count(px1[j].y);//计算p(x1 | y)的概率j++;}}cout << "p(x1 | y):" << endl;for(j = 0; j < 6; j++){cout << px1[j].x1 << " " <<  px1[j].y << " " << px1[j].p_x1y << endl;}j=0;for(pos2 = y.begin(); pos2 != y.end(); pos2++){for(pos3 = x2.begin(); pos3 != x2.end(); pos3++){px2[j].y = *pos2;px2[j].x2 = *pos3;int count_x2y = 0;for(k = 0; k < N; k++){if(A[1][k] == px2[j].x2 && A[2][k] == px2[j].y)count_x2y++;}px2[j].p_x2y = count_x2y / (double)m_y.count(px2[j].y);//计算p(x2 | y)的概率j++;}}cout << "p(x2 | y):" << endl;for(j = 0; j < 6; j++){cout << px2[j].x2 << " " <<  px2[j].y << " " << px2[j].p_x2y << endl;}}int main(){int i = 0, j = 0;//输出训练数据cout << "***********训练数据************" << endl;for(i = 0; i < M; i++){if(i == 0) cout << "X1: ";else if(i == 1) cout << "X2: ";else if(i == 2) cout << " Y: ";for(int j = 0; j < N; j++){cout << " "<< A[i][j];}cout << endl;}calP();//计算先验和条件概率int s_x1, s_x2;double result[2];int class_y = 1;cout << "*************预测***************" << endl;cout << endl << endl << "Input:";cin >> s_x1 >> s_x2;for(i = 0; i < 2; i++){double s_px_1, s_px_2;for(j = 0; j < 6; j++){if(s_x1 == px1[j].x1 && px1[j].y == class_y)s_px_1 = px1[j].p_x1y;if(s_x2 == px2[j].x2 && px2[j].y == class_y)s_px_2 = px2[j].p_x2y;}result[i] = p[i] * s_px_1 * s_px_2;class_y++;}cout << endl << "all results:";cout << result[0] << " " << result[1] << endl;for(i = 0; i <2; i++){class_y = i;if(result[i] < result[i+1]){ class_y = i+1;}}cout << "("<< s_x1 << "," << s_x2 << ")所属的类是:" << class_y + 1 << endl;return 0;}
    实现的效果如下图所示:


0 0
原创粉丝点击