根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是
在这里,x是一个特征向量,将设x维度为M。因为朴素的假设,即特征条件独立,根据全概率公式展开,上述公式可以表达为
这里,只要分别估计出,特征xi在每一类的条件概率就可以了。类别y的先验概率可以通过训练集算出,同样通过训练集上的统计,可以得出对应每一类上的,条件独立的特征对应的条件概率向量。
以下结合代码谈谈具体的实现
struct questionnaire{
char x[4];
int y[24];
char x3;
char x5;
int y6[6];
char x7;
};
首先定义一个questionnaire的结构体
x[0]~x[3]分别表示基本信息中的性别、年龄、学业背景和职业
需要说明的是,我们把多选题看做n道单选题,这每道单选题的答案集合只有yes和no
y[0]~y[4]位主题问卷第一题的abcde
y[5]~y[10]位主题问卷第二题的abcdef
y[11]为第四题
y[12]~y[17]为第八题的abcdef
y[18]~y[23]为第八题的abcdeg
x3为第三题
x5为第五题
y6[0]~y6[5]为第六题的abcdef
x7为第七题
关于我们类的设置,先来看看我们的总体思路:
第一步先是学习的过程,也就是结合问卷统计相关的数量来计算我们所需要的概率为后面一步利用贝叶斯公式来计算(分类)打下基础。
如果说我们的训练集是TrainingSet={(x1,y1),(x2,y2),...,(xN,yN)} 包含N条训练数据,其中 xi=(x(1)i,x(2)i,...,x(M)i)T是M维向量,yi∈{c1,c2,...cK}属于K类中的一类。
学习 1.首先,我们来计算上面公式中的p(y=ck)
其中I(x)为指示函数,若括号内成立,则计1,否则为0。
学习 2.接下来计算分子中的条件概率,设M维特征的第j维有L个取值,则某维特征的某个取值ajl,在给定某分类ck下的条件概率为: