朴素贝叶斯定理请参考:http://www.ruanyifeng.com/blo...https://www.cnblogs.com/TimVe...即Posteriorprobability=priorprobability*adjustmentfactor在分类中,先验概率是指该类别在样本中占据所有类别的概率,而调整因子是例如每个样本特征的概率的乘积。帅,不帅,上进,不值得交朋友,帅,不上进,不帅,不好,不值得,帅,上进,帅,上进值得交朋友(1/2)调整系数指的是特征你要预测的样本的概率,如果有样本不帅|好|不上进(样本特征不散,因为只有两个值,我们先忽略这个)那么worthsubmit的后验概率=1/2调整因子=0,调整因子=不帅占(1/2)值得交的数据,幸运值得占(1)*不上进占(0)不值得交的后验概率in=1/21/21/2*1=1/8那么这个人值得交吗?按照数据来看,1/8>0,不值得交of0.Smoothingparameter所以我们需要引入一个smoothing参数让这个值不为0,那么我们在计算概率的时候不直接使用:满足要求的样本/总样本,而是满足要求的样本+alpha/(样本总数+标签类别数或特征类别数*alpha),alpha一般取1.0,即先验概率:值得交友(2+1/(4+2·1))=1/3,不值得交朋友(2+1/(4+21))=1/3而特征概率的计算需要这样计算:先不看其他的,我们只看概率不进步的(即之前为0的概率)=0+1/(2+2*1)=1/4,注意numbe这里的rofcategories指的是len(有动机,没有动机)值得提交的后验概率:1/31/23/4*1/4=1/32不值得提交测试概率:1/31/21/2*3/4=1/16虽然还是不值得交,但是至少值得交的概率不为0,如果还是不明白,就看验证的标识代码,然后回过头来阅读这篇文章。apisklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)sklearn中的参数alpha:上面提到的平滑参数fit_prior:是否考虑先验概率,即各类别的比例class_prior:给定的先验probability数组属性class_log_prior_:数组,维度(n_classes,),每个类的对数概率。n_classes是类别个数,比如有10个类别,每个类别有100个样本,那么数组就是(In1/10,In1/10,...)intercept_:同class_log_prior_feature_log_prob_:数组,维度(n_classes,n_features)给定一类特征的经验对数概率P(x_i|y)。没看懂coef_:samefeature_log_prob_class_count_:array,dimension(n_classes,)每个类别的样本数(class,feature)遇到的样本数。没看懂方法fit(x,y[,sample_weight]):usesamplexandlabelyfortrainingget_params(deep=True):获取模型所有参数,deep不知道用什么x,y[,classes,sample_weight]):一批训练样本(当样本足够大时)predict(test_x):根据样本test_x,返回预测ypredict_proba(test_x):返回样本test_x的概率属于每个类别,也就是说,返回的是一个维度为(样本数,k)的二维数组,一维数组每一行所有元素之和为1,长度为数组是k。score(test_x,y,sample_weight=None):根据样本test_x预测test_y,然后比较实际y返回的正确分数,sample_weight为权重set_params(**args):重新设置模型参数,当然有与其他朴素贝叶斯分类或回归器,区别如下:当特征为离散变量时,使用多项式模型(MultinomialNB)当特征为连续变量时,使用高斯模型(GaussianNB)和伯努利模型(BernoulliNB)和多项式模型是一致的,但是要求特征是二值化的(1,0)生成模型从上面的描述可以看出,这样一个简单的验证码可以使用多项式模型或者伯努利模型,因为图片已经二值化。已知图片是一个18x10的二维数组,数组的每个元素都是0到1之间的数字,我们可以组成180个特征,验证码都是0-9的数字,所以分类是这样计算的。假设这180个特征是x1,x2,...,x180,标签是0-9。每个标签样本数为120,某个样本属于0的概率:P(0)=P0(x1)P0(x2)....P0(x180)Ptotal(0),P0(x1)表示即x1在0类样本中的比例(概率),Ptotal(0)表示0占总样本的比例(概率)为1/10,这些值可以从训练样本中得到。代码和KNN的基础一样,如下:fromsklearnimportnaive_bayesimportosfromPILimportImageimportnumpyasnpdeffunc():x=[]y=[]forlabelinos.listdir('train'):forfileinos.listdir(f'train/{label}'):im=Image.open(f'train/{label}/{file}')pix=np.array(im)pix=(pix>180)*1pix=pix.ravel()x.append(list(pix))y.append(int(label))train_x=np.array(x)train_y=np.array(y)model=naive_bayes.MultinomialNB(alpha=1)模型。fit(train_x,train_y)x=[]y=[]forlabelinos.listdir('test'):forfileinos.listdir(f'test/{label}'):im=Image.open(f'test/{label}/{file}')pix=np.array(im)pix=(pix>180)*1pix=pix.ravel()x.append(list(pix))y.append(int(label))test_x=np.array(x)test_y=np.array(y)score=model.score(test_x,test_y)返回scoreif__name__=="__main__":score=func()print(score)在这个简单的验证码识别中,朴素贝叶斯也可以达到100%的正确率。如果把样本特征改成16个,就会发现朴素贝叶斯和KNN的误差是一样的,相同的验证码被识别为相同的错误。最后,我正在学习一些机器学习算法,我会把一些需要记录的内容分享到博客和微信上公众号,欢迎关注。平时,我一般会分享一些爬虫或者Python的内容。另外,如果博客中有错误,请指出。这是标注的数据:https://www.lanzous.com/i8epywd最后在学习一些机器学习算法,会把一些需要记录的内容分享到博客和微信上公众号(python成长之路),欢迎关注。平时,我一般会分享一些爬虫或者Python的内容。
