• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
             1 #ifndef _GMM_H
             2 #define _GMM_H
             3 #include <vector>
             4 #include <cmath>
             5 using namespace std;
             6 class GMM
             7 {
             8 public:
             9     void Init(const vector<double> &inputData,const int clustNum=5,double eps=0.01,double max_steps=20);
            10     void train();
            11     int predicate(double x);//預測輸入的數據屬于哪一類
            12     void print();
            13 protected:
            14     int clusterNum;
            15     vector<double> means;
            16     vector<double> means_bkp;
            17     vector<double> sigmas;
            18     vector<double> sigmas_bkp;
            19     vector<double> probilities;
            20     vector<double> probilities_bkp;
            21     vector<vector<double>> memberships;
            22     vector<vector<double>> memberships_bkp;
            23     vector<double> data;
            24     int dataNum;
            25     double epslon;
            26     double max_steps;
            27 private:
            28     double gauss(const double x,const double m,const double sigma);
            29 };
            30 #endif
              1 #include "GMM.h"
              2 #include <iostream>
              3 #include <fstream>
              4 #include <stdlib.h>
              5 #include <Windows.h>
              6 using namespace std;
              7 
              8 void GMM::Init( const vector<double> &inputData,const int clustNum,double eps,double max_steps )
              9 {
             10     this->data=inputData;
             11     this->dataNum=data.size();
             12     this->clusterNum=clustNum;
             13     this->epslon=eps;
             14     this->max_steps=max_steps;
             15     this->means.resize(clusterNum);
             16     this->means_bkp.resize(clusterNum);
             17     this->sigmas.resize(clusterNum);
             18     this->sigmas_bkp.resize(clusterNum);
             19     this->memberships.resize(clusterNum);
             20     this->memberships_bkp.resize(clusterNum);
             21     for (int i=0;i<clusterNum;i++)
             22     {
             23         memberships[i].resize(data.size());
             24         memberships_bkp[i].resize(data.size());
             25     }
             26     this->probilities.resize(clusterNum);
             27     this->probilities_bkp.resize(clusterNum);
             28     //initialize mixture probabilities
             29     for (int i=0;i<clusterNum;i++)
             30     {
             31         probilities[i]=probilities_bkp[i]=1.0/(double)clusterNum;
             32         //init means
             33         means[i]=means_bkp[i]=255.0*i/(clusterNum);
             34         //init sigma
             35         sigmas[i]=sigmas_bkp[i]=50;
             36     }
             37 }
             38 void GMM::train()
             39 {
             40     //compute membership probabilities
             41     int i,j,k,m;
             42     double sum=0,sum2;
             43     int steps=0;
             44     bool go_on;
             45     do 
             46     {
             47     for (k=0;k<clusterNum;k++)
             48     {
             49         //compute membership probabilities
             50         for (j=0;j<data.size();j++)
             51         {
             52             //計算p(k|n)
             53             sum=0;
             54             for (m=0;m<clusterNum;m++)
             55             {
             56                 sum+=probilities[m]*gauss(data[j],means[m],sigmas[m]);
             57             }
             58             //求分子
             59             memberships[k][j]=probilities[k]*gauss(data[j],means[k],sigmas[k])/sum;
             60         }
             61         //求均值
             62             //求條件概率的和
             63         sum=0;
             64         for (i=0;i<dataNum;i++)
             65         {
             66             sum+=memberships[k][i];
             67         }
             68         sum2=0;
             69         for (j=0;j<dataNum;j++)
             70         {
             71             sum2+=memberships[k][j]*data[j];
             72         }
             73         means[k]=sum2/sum;
             74         //求方差
             75         sum2=0;
             76         for (j=0;j<dataNum;j++)
             77         {
             78             sum2+=memberships[k][j]*(data[j]-means[k])*(data[j]-means[k]);
             79         }
             80         sigmas[k]=sqrt(sum2/sum);
             81         //求概率
             82         probilities[k]=sum/dataNum;
             83     }//end for k
             84     //check improvement
             85     go_on=false;
             86     for (k=0;k<clusterNum;k++)
             87     {
             88         if (means[k]-means_bkp[k]>epslon)
             89         {
             90             go_on=true;
             91             break;
             92         }
             93     }
             94     //back up
             95     this->means_bkp=means;
             96     this->sigmas_bkp=sigmas;
             97     this->probilities_bkp=probilities;
             98     } while (go_on&&steps++<max_steps);//end do while
             99 }
            100 
            101 double GMM::gauss( const double x,const double m,const double sigma )
            102 {
            103     return 1.0/(sqrt(2*3.1415926)*sigma)*exp(-0.5*(x-m)*(x-m)/(sigma*sigma));
            104 }
            105 int GMM::predicate(double x)
            106 {
            107     double max_p=-100;
            108     int i;
            109     double current_p;
            110     int bestIdx=0;
            111     for (i=0;i<clusterNum;i++)
            112     {
            113         current_p=gauss(x,means[i],sigmas[i]);
            114         if (current_p>max_p)
            115         {
            116             max_p=current_p;
            117             bestIdx=i;
            118         }
            119     }
            120     return bestIdx;
            121 }
            122 void GMM::print()
            123 {
            124     int i;
            125     for (i=0;i<clusterNum;i++)
            126     {
            127         cout<<"Mean: "<<means[i]<<" Sigma: "<<sigmas[i]<<" Mixture Probability: "<<probilities[i]<<endl;
            128     }
            129 }
            130 //void mainxx()
            131 //{
            132 //    GMM gmm;
            133 //    gmm.test();
            134 //}
            135 //void GMM::test()
            136 //{
            137 //    //test guass
            138 //    for (int j=0;j<10;j++)
            139 //    {
            140 //        cout<<gauss(j,0,1)<<endl;
            141 //    }
            142 //    srand(GetTickCount());
            143 //    vector<double> datas;
            144 //    int i;
            145 //    double d;
            146 //    for (i=0;i<20;i++)
            147 //    {
            148 //        d=(rand()/(double)RAND_MAX)*255;
            149 //        cout<<d<<endl;
            150 //        datas.push_back(d);
            151 //    }
            152 //    this->Init(datas,2);
            153 //    this->train();
            154 //    this->predicate(100);
            155 //}
            Posted on 2010-07-10 23:45 鄒敏 閱讀(6837) 評論(3)  編輯 收藏 引用

            Feedback

            # re: 高斯混合模型 C++實現  回復  更多評論   

            2011-01-19 16:56 by 小肖
            代碼寫的不錯

            # re: 高斯混合模型 C++實現  回復  更多評論   

            2012-06-25 20:11 by laolu
            博主好:

            16 vector<double> means_bkp;
            18 vector<double> sigmas_bkp;
            20 vector<double> probilities_bkp;
            22 vector<vector<double>> memberships_bkp;
            這幾個bkp什么意思啊?

            25 double epslon;
            26 double max_steps;
            這兩個是定義的什么?
            国产精品久久久久a影院| 久久精品成人免费网站| 色偷偷88欧美精品久久久| 久久亚洲国产成人精品无码区| 亚洲精品无码久久毛片| 潮喷大喷水系列无码久久精品 | 久久天天躁狠狠躁夜夜不卡| 久久只有这精品99| 久久99中文字幕久久| 一级a性色生活片久久无少妇一级婬片免费放 | 国内精品综合久久久40p| 久久综合丁香激情久久| 天堂无码久久综合东京热| 99麻豆久久久国产精品免费| 国产激情久久久久影院| 97久久国产综合精品女不卡 | 久久露脸国产精品| 精品久久久久久亚洲| 大香伊人久久精品一区二区| 99久久人人爽亚洲精品美女| 一本一本久久aa综合精品| 久久久国产精品| 国产69精品久久久久99尤物| 欧美牲交A欧牲交aⅴ久久| 久久大香萑太香蕉av| 久久强奷乱码老熟女| 99久久精品免费观看国产| 久久中文骚妇内射| 亚洲午夜久久久久久久久久| 久久这里的只有是精品23| 日韩十八禁一区二区久久| 久久久久久毛片免费看| 国产成人精品久久亚洲高清不卡 | 久久99热狠狠色精品一区| 国产一区二区精品久久| 日韩欧美亚洲综合久久影院d3| 97久久天天综合色天天综合色hd| 久久夜色精品国产噜噜噜亚洲AV| 久久精品亚洲精品国产色婷| 久久精品毛片免费观看| 精品一区二区久久久久久久网站|