久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

貝葉斯分類器,、算法部分源代碼

 昵稱12110172 2014-06-19

[轉(zhuǎn)]貝葉斯分類器,、算法部分源代碼

轉(zhuǎn)自星海流浪者&博客

在具有模式的完整統(tǒng)計(jì)知識條件下,按照貝葉斯決策理論進(jìn)行設(shè)計(jì)的一種最優(yōu)分類器,。分類器是對每一個(gè)輸入模式賦予一個(gè)類別名稱的軟件或硬件裝置,,而貝葉斯分類器是各種分類器中分類錯(cuò)誤概率最小或者在預(yù)先給定代價(jià)的情況下平均風(fēng)險(xiǎn)最小的分類器,。它的設(shè)計(jì)方法是一種最基本的統(tǒng)計(jì)分類方法。 
  最小錯(cuò)誤概率貝葉斯分類器  ,。把代表模式的特征向量x分到c個(gè)類別(ω1,,ω2,...,ωc)中某一類的最基本方法是計(jì)算在 x的條件下,該模式屬于各類的概率,,用符號P(ω1|x),P(ω2|x),...,P(ωc|x)表示,。比較這些條件概率,最大數(shù)值所對應(yīng)的類別ωi就是該模式所屬的類,。例如表示某個(gè)待查細(xì)胞的特征向量 x屬于正常細(xì)胞類的概率是0.2,,屬于癌變細(xì)胞類的概率是0.8,就把它歸類為癌變細(xì)胞,。上述定義的條件概率也稱為后驗(yàn)概率,,在特征向量為一維的情況下,一般有圖中的變化關(guān)系。當(dāng) x=x*時(shí),,P(ω1|x)=P(ω2|x)對于 xx*的區(qū)域,,由于P(ω2|x)>P(ω1|x)因此xω2類,對于x<x*的區(qū)域,由于P(ω1|x)>P(ω2|x),xω1類,x*就相當(dāng)于區(qū)域的分界點(diǎn),。圖中的陰影面積就反映了這種方法的錯(cuò)誤分類概率,,對于以任何其他的 x值作為區(qū)域分界點(diǎn)的分類方法都對應(yīng)一個(gè)更大的陰影面積,因此貝葉斯分類器是一種最小錯(cuò)誤概率的分類器

圖

  一般情況下,,不能直接得到后驗(yàn)概率而是要通過貝葉斯公式

進(jìn)行計(jì)算,。式中的P(xωi)為在模式屬于ωi類的條件下出現(xiàn)x的概率密度,稱為x的類條件概率密度,;P(ωi)為在所研究的識別問題中出現(xiàn)ωi類的概率,又稱先驗(yàn)概率,;P(x)是特征向量x的概率密度。分類器在比較后驗(yàn)概率時(shí),對于確定的輸入x,,P(x)是常數(shù),,因此在實(shí)際應(yīng)用中,通常不是直接用后驗(yàn)概率作為分類器的判決函數(shù)gi(x)(見線性判別函數(shù))而采用下面兩種形式:

對所有的c個(gè)類計(jì)算gi(x)(i=1,2,...,c),。與gi(x)中最大值相對應(yīng)的類別就是x的所屬類別,。 
  最小風(fēng)險(xiǎn)貝葉斯分類器  由于客觀事物的復(fù)雜性,分類器作出各種判決時(shí)的風(fēng)險(xiǎn)是不一樣的,。例如將癌細(xì)胞誤判為正常細(xì)胞的風(fēng)險(xiǎn)就比將正常細(xì)胞誤判為癌細(xì)胞的風(fēng)險(xiǎn)大,。因此,,在貝葉斯分類器中引入了風(fēng)險(xiǎn)的概念,。在實(shí)際應(yīng)用中根據(jù)具體情況決定各種風(fēng)險(xiǎn)的大小,通常用一組系數(shù)Cij來表示,。Cij表示分類器將被識別樣本分類為ωi,,而該樣本的真正類別為ωj時(shí)的風(fēng)險(xiǎn),。設(shè)計(jì)最小風(fēng)險(xiǎn)分類器的基本思想是用后驗(yàn)概率計(jì)算將 x分類為ωi的條件風(fēng)險(xiǎn)

比較各Ri(x)的大小,與最小值對應(yīng)的類別是分類的結(jié)果。評價(jià)這種分類器的標(biāo)準(zhǔn)是平均風(fēng)險(xiǎn),,它的平均風(fēng)險(xiǎn)最小,。在實(shí)際應(yīng)用時(shí),后驗(yàn)概率是難以獲得的,,根據(jù)模式類別的多少和Cij的取值方式,可設(shè)計(jì)出各種分類器,,例如模式為兩類時(shí),判別函數(shù)為

如果選擇C11C22為零,,C12C21為1,,它就是兩類最小錯(cuò)誤概率分類器。實(shí)際上,,最小錯(cuò)誤概率分類器是最小風(fēng)險(xiǎn)分類器的一種特殊情況,。 
  設(shè)計(jì)貝葉斯分類器的關(guān)鍵是要知道樣本特征 x的各種概率密度函數(shù)。條件概率密度函數(shù)為多元正態(tài)分布是研究得最多的分布,。這是由于它的數(shù)學(xué)表達(dá)式易于分析,,在實(shí)際應(yīng)用中也是一種常見的分布形式。經(jīng)常使用參數(shù)方法來設(shè)計(jì)正態(tài)分布的判別函數(shù),。 
  參考書目 
 福永圭之介著,陶篤純譯:《統(tǒng)計(jì)圖形識別導(dǎo)論》,科學(xué)出版社,,北京,1978,。

/********************************源代碼*******************************/

//貝葉斯分類器所需函數(shù)的聲明:2006/11/13
#ifndef _BAYES_H
#define _BAYES_H
#include"matrix.h"
//正態(tài)分布的監(jiān)督參數(shù)估計(jì):最大似然估計(jì)
//此函數(shù)用于求樣本的均值向量U
//參數(shù) X 代表一類樣本集,,X 是一個(gè) n x d 的矩陣
//代表 n 個(gè) 特征空間維數(shù)為 d 的樣本
//每行代表一個(gè)樣本
Matrix getU(const Matrix &X);

//正態(tài)分布的監(jiān)督參數(shù)估計(jì):最大似然估計(jì)
//此函數(shù)用于求樣本的協(xié)方差矩陣E
//參數(shù) X 代表一類樣本集,X 是一個(gè) n x d 的矩陣
//代表 n 個(gè) 特征空間維數(shù)為 d 的樣本
//每行代表一個(gè)樣本
//參數(shù) U 是該樣本的均值向量,,可用上面的 getU() 函數(shù)求得
Matrix getE(const Matrix &X, const Matrix &U);

//多元正態(tài)概率型下的最小錯(cuò)誤率貝葉斯判別函數(shù)
//U[i]   為每個(gè)類的均值向量
//E[i]   為每個(gè)類的協(xié)方差矩陣
//Pw[i] 為某類樣本的先驗(yàn)概率
//X    為要判別的樣本
//其返回值為樣本類別的代號,,范圍是 1, 2, ..., c,c為類別數(shù)
int bayesFun(const Matrix U[], const Matrix E[], 
        const double Pw[],const Matrix &X, int c);

//貝葉斯分類器
//X[c] 為總體樣本集,每個(gè)數(shù)組元素為一個(gè)類的樣本集
//X 為要判別的樣本
//c:類別數(shù)
void bayesDepart(const Matrix X[], const double Pw[], 
         const Matrix &x, int c, char* name[]);
   
//下面是此貝葉斯分類器需要給定的參數(shù)       
//這里只作聲明,,相應(yīng)的定義在bayesapp.cpp中
extern int c;      //類別數(shù)
extern char* name[];   //類別名稱
extern double Pw[];    //每類樣本的先驗(yàn)概率
extern Matrix X[];   //總體樣本集,,數(shù)組中的每個(gè)矩陣代表一類樣本集,
            //矩陣中的每一行代表此類樣本集的一個(gè)樣本
#endif

//貝葉斯分類器中相應(yīng)函數(shù)的實(shí)現(xiàn):2006/11/13
#include<iostream.h>
#include<math.h>
#include"bayes.h"
#include"matrix.h"
#include<stdlib.h>

//計(jì)算均值向量U
Matrix getU(const Matrix &X)
{
int d = X.getCol();
int n = X.getRow();
Matrix U(d, 1);        //U=(u1,u2,...,ud)^T,,
                //用 d x 1 的矩陣表示
for(int k=0; k<n; k++)    //k 代表第 k 個(gè)樣本
   for(int j=0; j<d; j++)   //j 代表樣本的第 j 個(gè)特征值
    U.set(j, 0, U.get(j,0)+X.get(k,j));
    //這里要注意對矩陣元素的訪問下標(biāo)是從 0 開始的
return 1.0/n * U; //U 是所有樣本的均值,,故加和后除以樣本總數(shù)
}

//計(jì)算協(xié)方差矩陣E
Matrix getE(const Matrix &X, const Matrix &U)
{
int d = X.getCol(); //X 的列數(shù)代表特征空間維數(shù)
int n = X.getRow(); //X 的每一行代表一個(gè)樣本
Matrix E(d, d);         //E 是 d x d 維矩陣,d 為每個(gè)樣本特征空間數(shù)
                 //故此處可以用 X 列數(shù)來初始化它
double *ar = new double[d];   //此數(shù)組用于從矩陣中提取行,,創(chuàng)建新矩陣
                 //從而可以進(jìn)行下面的矩陣運(yùn)算
for(int k=0; k<n; k++){     //k 代表第 k 個(gè)樣本
   for(int j=0; j<d; j++)
    ar[j] = X.get(k, j);    //將 X 的一行元素值放入數(shù)組 ar 中

   Matrix Xk(d, 1, ar);     //利用 ar 創(chuàng)建矩陣
   E = E + (Xk - U) * trv(Xk - U); //(X-U) * (X-U)^T
}
delete[] ar; //釋放動(dòng)態(tài)分配的數(shù)組空間
//E 是 n 個(gè)矩陣( (Xk - U)與其轉(zhuǎn)置的乘積 )的算術(shù)平均
return 1.0/n * E;
}

//貝葉斯判別函數(shù)
int bayesFun(const Matrix U[], const Matrix E[],
        const double Pw[],const Matrix &X, int c)
{
double testPw = 0;
for(int w=0; w<c; w++){
   if(Pw[w] <= 0){
    cout << "Wrong Pw[i]\n"; exit(0); }
   testPw += Pw[w];
   if(det(E[w]) == 0){
    cout << "Check input, E[" << w << "]=0!\n";
    exit(0); }
}
if(testPw != 1){
   cout << "Wrong Pw[i]\n"; exit(0); }

//對于貝葉斯判別函數(shù)中的 -d/2 * ln(2*PI)項(xiàng)因與 i 無關(guān)故可去掉
//另外(X-U)(E^-1)(X-U)^T 的計(jì)算結(jié)果雖然是一個(gè)數(shù),,但在這里
//其表示為一個(gè)一行一列的矩陣,因此需要對其求行列式值后才能
//賦給左邊的 double maxg
double maxg = -1.0/2 * det( trv(X-U[0]) * inv(E[0]) * (X-U[0]) )
         -1.0/2 * log(det(E[0])) + log(Pw[0]);
int code = 0; //用來返回類別代號

//求使得貝葉斯判別函數(shù)取得最大值類
for(int i=1; i<c; i++){
   double g =   -1.0/2 * det( trv(X-U[i]) * inv(E[i]) * (X-U[i]) )
         -1.0/2 * log(det(E[i])) + log(Pw[i]);
   if(g > maxg){
    maxg = g;
    code = i;
   }
}//for i

return code;
}//bayesFun()

//貝葉斯分類器
void bayesDepart(const Matrix X[], const double Pw[],
         const Matrix &x, int c, char* name[])
{
Matrix* U = new Matrix[c];
Matrix* E = new Matrix[c];

//先求出每個(gè)類的均值向量和協(xié)方差矩陣
for(int i=0; i<c; i++){
   U[i] = getU(X[i]);
   E[i] = getE(X[i], U[i]);
}
//調(diào)用貝葉斯判別函數(shù),,判斷X所屬類別,,輸出類別名稱
cout << name[bayesFun(U,E,Pw,x,c)];
}

//貝葉斯分類器:2006/11/13
#include<iostream.h>
#include<conio.h>
#include"bayes.h"

//這個(gè)宏僅為了少寫些代碼
#define test(arx)                     \
{                                     \
for(int i=0; i<25; i++){            \
   Matrix x(d,1,arx[i]);             \
   bayesDepart(X, Pw, x, c, name);   \
   cout << ' ';                      \
   if((i+1)%5 == 0) cout << endl;    \
}                                   \
   cout << "--------------\n";       \
}                                     \

void main()
{
cout << "\n==============\n";
//樣本集分為 2 個(gè)類別,特征空間維數(shù)為 2,每個(gè)類別 25 個(gè)樣本
const int c = 2, d = 2, n = 25;
//類別名稱分別為 w1 和 w2
char* name[c] = {"w1", "w2"};
//兩個(gè)類別的先驗(yàn)概率,,可以給予不同的值,,觀察結(jié)果變化
double   Pw[c] = { 0.5, 0.5 };
//數(shù)組 X[i]為 i 類別的樣本集,X 為總樣本集
Matrix* X = new Matrix[c];

//類別 w1 的樣本數(shù)據(jù),,
//特征值 1 集中在 4|5附近,,特征值 2 集中在 13 附近
double ar0[] = {
    1,11.45, 2,12.46, 3,13.78, 3,13.62, 4,13.84,
    4,11.26, 4,15.28, 4,17.29, 4,21.36, 5,15.46,
    5,13.63, 5,13.78, 5,12.29, 5,14.55, 5,21.73,
    5,14.12, 5,15.34, 6,13.66, 6,13.21, 6,14.02,
    7,12.16, 7,19.88, 7,10.21, 8,12.29, 9,15.52 };
//類別 w2 的樣本數(shù)據(jù)
//特征值 1 集中在 7|8附近,特征值 2 集中在 19 附近  
double ar1[] = {
    1,19.76, 2,21.43, 3,18.79, 4,19.84, 5,18.75,
    5,21.45, 5,18.78, 6,19.72, 7,19.04, 7,21.27,
    7,20.01, 7,18.99, 7,19.67, 8,17.98, 8,14.26,
    8,18.99, 8,15.67, 8,22.01, 8,21.91, 8,19.03,
    9,18.97, 9,18.92, 9,19.34, 9,19.28, 9,17.63 };
//將兩個(gè)類別的樣本數(shù)組構(gòu)造為矩陣  
Matrix X0(n,d,ar0);
Matrix X1(n,d,ar1);
//放入總樣本集中便于下面的參數(shù)傳遞
X[0] = X0; 
X[1] = X1;

   //測試樣本數(shù)據(jù),,其中前兩個(gè)與原樣本相同,,第三個(gè)為隨機(jī)輸入
   //可以改變第三個(gè)樣本中的數(shù)據(jù)值,觀察結(jié)果變化
  
   double arx0[25][2] = {
    1,11.45, 2,12.46, 3,13.78, 3,13.62, 4,13.84,
    4,11.26, 4,15.28, 4,17.29, 4,21.36, 5,15.46,
    5,13.63, 5,13.78, 5,12.29, 5,14.55, 5,21.73,
    5,14.12, 5,15.34, 6,17.66, 6,13.21, 6,14.02,
    7,12.16, 7,19.88, 8,10.21, 9,12.29, 10,15.52 };
double arx1[25][2] = {
    1,19.76, 2,21.43, 3,18.79, 4,19.84, 5,18.75,
    5,21.45, 5,18.78, 6,19.72, 7,19.04, 7,21.27,
    7,20.01, 7,18.99, 7,19.67, 8,17.98, 8,14.26,
    8,18.99, 8,15.67, 8,22.01, 8,21.91, 8,19.03,
    9,18.97, 9,18.92, 10,19.34,10,19.28,11,17.63 };
double arx2[25][2] = {
    3,14.56, 5,12.35, 7,19.89, 8,25.37, 11,26.10,
    3,14.29, 6,29.28, 5,16.19, 5,21.19, 8,27.19,
    8,18.28, 7,17.15, 6,14.12, 6,14.13, 1,25.10,
    5,16.29, 6,19.80, 10,19.34, 8,15.09,6,17.20,
    6,12.20, 8,19.21, 2,19.29, 5,16.10, 7,18.23 };
test(arx0);
test(arx1);
test(arx2);

//試著輸入與(4|5,,13)接近的樣本,,看結(jié)果是否為 w1
//試著輸入與(7|8,19)接近的樣本,,看結(jié)果是否為 w2
//改變先驗(yàn)概率,,看結(jié)果是否發(fā)生改變
double testAr[2];
char ch = ' ';
while(ch != 'q'){
   if(ch == 'p'){
    cout << "Please enter Pw[1] and Pw[2]:\n";
    cin   >> Pw[0] >> Pw[1];
   }
   cout << "Please enter what you want test :\n";
   cin   >> testAr[0] >> testAr[1];

   Matrix x(d,1,testAr);
   bayesDepart(X, Pw, x, c, name);

   cout << "\nPress any key to continue\n";
   cout << "q to exit\n";
   cout << "p to change Pw[i]\n";
   ch = getch();
}
}

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多