贝叶斯分类器、算法部分源代码

上传人:小** 文档编号:89155047 上传时间:2019-05-19 格式:DOC 页数:11 大小:33KB
返回 下载 相关 举报
贝叶斯分类器、算法部分源代码_第1页
第1页 / 共11页
贝叶斯分类器、算法部分源代码_第2页
第2页 / 共11页
贝叶斯分类器、算法部分源代码_第3页
第3页 / 共11页
贝叶斯分类器、算法部分源代码_第4页
第4页 / 共11页
贝叶斯分类器、算法部分源代码_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《贝叶斯分类器、算法部分源代码》由会员分享,可在线阅读,更多相关《贝叶斯分类器、算法部分源代码(11页珍藏版)》请在金锄头文库上搜索。

1、贝叶斯分类器、算法部分源代码贝叶斯分类器、算法部分源代码2011年06月15日转自星海流浪者&博客 在具有模式的完整统计知识条件下,按照贝叶斯决策理论进行设计的一种最优分类器。分类器是对每一个输入模式赋予一个类别名称的软件或硬件装置,而贝叶斯分类器是各种分类器中分类错误概率最小或者在预先给定代价的情况下平均风险最小的分类器。它的设计方法是一种最基本的统计分类方法。 最小错误概率贝叶斯分类器 。把代表模式的特征向量x分到c个类别(1,2,.,c)中某一类的最基本方法是计算在 x的条件下,该模式属于各类的概率,用符号P(1|x),P(2|x),.,P(c|x)表示。比较这些条件概率,最大数值所对应

2、的类别i就是该模式所属的类。例如表示某个待查细胞的特征向量 x属于正常细胞类的概率是0.2,属于癌变细胞类的概率是0.8,就把它归类为癌变细胞。上述定义的条件概率也称为后验概率,在特征向量为一维的情况下,一般有图中的变化关系。当 x=x*时,P(1|x)=P(2|x)对于 xx*的区域,由于P(2|x)P(1|x)因此x属2类,对于xP(2|x),x属1类,x*就相当于区域的分界点。图中的阴影面积就反映了这种方法的错误分类概率,对于以任何其他的 x值作为区域分界点的分类方法都对应一个更大的阴影面积,因此贝叶斯分类器是一种最小错误概率的分类器 一般情况下,不能直接得到后验概率而是要通过贝叶斯公式

3、 进行计算。式中的P(xi)为在模式属于i类的条件下出现x的概率密度,称为x的类条件概率密度;P(i)为在所研究的识别问题中出现i类的概率,又称先验概率;P(x)是特征向量x的概率密度。分类器在比较后验概率时,对于确定的输入x,P(x)是常数,因此在实际应用中,通常不是直接用后验概率作为分类器的判决函数gi(x)(见线性判别函数)而采用下面两种形式: 对所有的c个类计算gi(x)(i=1,2,.,c)。与gi(x)中最大值相对应的类别就是x的所属类别。 最小风险贝叶斯分类器 由于客观事物的复杂性,分类器作出各种判决时的风险是不一样的。例如将癌细胞误判为正常细胞的风险就比将正常细胞误判为癌细胞的

4、风险大。因此,在贝叶斯分类器中引入了风险的概念。在实际应用中根据具体情况决定各种风险的大小,通常用一组系数Cij来表示。Cij表示分类器将被识别样本分类为i,而该样本的真正类别为j时的风险。设计最小风险分类器的基本思想是用后验概率计算将 x分类为i的条件风险 比较各Ri(x)的大小,与最小值对应的类别是分类的结果。评价这种分类器的标准是平均风险,它的平均风险最小。在实际应用时,后验概率是难以获得的,根据模式类别的多少和Cij的取值方式,可设计出各种分类器,例如模式为两类时,判别函数为 如果选择C11和C22为零,C12和C21为1,它就是两类最小错误概率分类器。实际上,最小错误概率分类器是最小

5、风险分类器的一种特殊情况。 设计贝叶斯分类器的关键是要知道样本特征 x的各种概率密度函数。条件概率密度函数为多元正态分布是研究得最多的分布。这是由于它的数学表达式易于分析,在实际应用中也是一种常见的分布形式。经常使用参数方法来设计正态分布的判别函数。 参考书目 福永圭之介著,陶笃纯译:统计图形识别导论,科学出版社,北京,1978。 /贝叶斯分类器所需函数的声明:2006/11/13 #ifndef _BAYES_H #define _BAYES_H #includematrix.h /正态分布的监督参数估计:最大似然估计 /此函数用于求样本的均值向量U /参数 X 代表一类样本集,X 是一个

6、n x d 的矩阵 /代表 n 个 特征空间维数为 d 的样本 /每行代表一个样本 Matrix getU(const Matrix &X); /正态分布的监督参数估计:最大似然估计 /此函数用于求样本的协方差矩阵E /参数 X 代表一类样本集,X 是一个 n x d 的矩阵 /代表 n 个 特征空间维数为 d 的样本 /每行代表一个样本 /参数 U 是该样本的均值向量,可用上面的 getU() 函数求得 Matrix getE(const Matrix &X, const Matrix &U); /多元正态概率型下的最小错误率贝叶斯判别函数 /Ui 为每个类的均值向量 /Ei 为每个类的协方

7、差矩阵 /Pwi 为某类样本的先验概率 /X 为要判别的样本 /其返回值为样本类别的代号,范围是 1, 2, ., c,c为类别数 int bayesFun(const Matrix U, const Matrix E, const double Pw,const Matrix &X, int c); /贝叶斯分类器 /Xc 为总体样本集,每个数组元素为一个类的样本集 /X 为要判别的样本 /c:类别数 void bayesDepart(const Matrix X, const double Pw, const Matrix &x, int c, char* name); /下面是此贝叶斯分

8、类器需要给定的参数 /这里只作声明,相应的定义在bayesapp.cpp中 extern int c; /类别数 extern char* name; /类别名称 extern double Pw; /每类样本的先验概率 extern Matrix X; /总体样本集,数组中的每个矩阵代表一类样本集, /矩阵中的每一行代表此类样本集的一个样本 #endif /贝叶斯分类器中相应函数的实现:2006/11/13 #include #include #includebayes.h #includematrix.h #include /计算均值向量U Matrix getU(const Matrix

9、 &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; kn; k+) /k 代表第 k 个样本 for(int j=0; jd; j+) /j 代表样本的第 j 个特征值U.set(j, 0, U.get(j,0)+X.get(k,j); /这里要注意对矩阵元素的访问下标是从 0 开始的 return 1.0/n * U; /U 是所有样本的均值,故加和后除以样本总数 /计算协方差矩阵E Matrix getE(const Matrix

10、 &X, const Matrix &U) int d = X.getCol(); /X 的列数代表特征空间维数 int n = X.getRow(); /X 的每一行代表一个样本 Matrix E(d, d); /E 是 d x d 维矩阵,d 为每个样本特征空间数 /故此处可以用 X 列数来初始化它 double *ar = new doubled; /此数组用于从矩阵中提取行,创建新矩阵 /从而可以进行下面的矩阵运算 for(int k=0; kn; k+) /k 代表第 k 个样本 for(int j=0; jd; j+) arj = X.get(k, j); /将 X 的一行元素值放

11、入数组 ar 中 Matrix Xk(d, 1, ar); /利用 ar 创建矩阵 E = E + (Xk - U) * trv(Xk - U); /(X-U) * (X-U)T delete ar; /释放动态分配的数组空间 /E 是 n 个矩阵( (Xk - U)与其转置的乘积 )的算术平均 return 1.0/n * E; /贝叶斯判别函数 int bayesFun(const Matrix U, const Matrix E, const double Pw,const Matrix &X, int c) double testPw = 0; for(int w=0; wc; w+)

12、 if(Pww = 0) cout Wrong Pwin; exit(0); testPw += Pww; if(det(Ew) = 0) cout Check input, E w =0!n; exit(0); if(testPw != 1) cout Wrong Pwin; exit(0); /对于贝叶斯判别函数中的 -d/2 * ln(2*PI)项因与 i 无关故可去掉 /另外(X-U)(E-1)(X-U)T 的计算结果虽然是一个数,但在这里 /其表示为一个一行一列的矩阵,因此需要对其求行列式值后才能 /赋给左边的 double maxg double maxg = -1.0/2 * d

13、et( trv(X-U0) * inv(E0) * (X-U0) ) -1.0/2 * log(det(E0) + log(Pw0); int code = 0; /用来返回类别代号 /求使得贝叶斯判别函数取得最大值类 for(int i=1; i 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 Matrixc; Matrix* E = new Matrixc; /先求出每个类的均值向量和协方差矩阵 for(int i=0; ic; i+) Ui = getU(Xi); Ei = getE(Xi, Ui); /调用贝叶斯判别函数,判断X所属类别,输出

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号