zoukankan      html  css  js  c++  java
  • 朴素贝叶斯算法-非模型

    #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;
    }

    参考:https://blog.csdn.net/IDMer/article/details/48809677




    长风破浪会有时,直挂云帆济沧海!
    可通过下方链接找到博主
    https://www.cnblogs.com/judes/p/10875138.html
  • 相关阅读:
    死锁
    Hibernate—01
    POI
    线程 Thread
    SSH页面整合_01
    cnblogs安家了
    漫画:天堂里没有程序员!
    我又愿中国青年都只是向上走,不必理会这冷笑和暗箭!!!!!!!!
    一位信息系统项目管理培训老师写的《论婚姻项目管理》值得看一下!
    程序员保持健康的方法和经验
  • 原文地址:https://www.cnblogs.com/judes/p/14476157.html
Copyright © 2011-2022 走看看