用python实现贝叶斯算法,贝叶斯分类器Python

  用python实现贝叶斯算法,贝叶斯分类器Python

  1.朴素贝叶斯分类器的原理

  朴素贝叶斯方法是一种基于贝叶斯公式和特征条件独立假设的分类方法。对于给定的训练数据集,基于特征条件的独立假设,通过学习输入和输出的联合概率分布生成模型。基于这个模型,给定的测试样本

  通过使用贝叶斯公式获得具有最大输出概率(或概率密度)的输出。具体情况如下

  在训练中,给予的是什么

  标记为标记数据

  在…之中

  是

  维度(特征向量)(即实例点)通常是

  点击

  该实例点的标签指示该点的类别,该点位于离散集中。

  价值(假设共享

  类别)。贝叶斯分类器中联合分布的假设

  培训用数据

  与这个分布无关。其次,我想根据训练中的数据来猜测这个联合分布。因为

  所以我们先做对了。

  投机分销。因为

  只取有限数量的值。在训练数据集中,根据频率估计概率。这也是概率的最大似然估计。

  这样,随机变量就计算出来了。

  的分布规律。

  接下来,在每个类别中

  分配,也就是故意的。因为

  在

  空间价值。我们就是这样。

  在两种简单的情况下讨论了的分布:

  1、分类:

  的每个维度

  价值是有限的,也就是说

  它是一个离散的随机变量。在这种情况下,训练数据集用于估计。

  分布如下。

  第二种估计比较难,但是有条件独立的假设。也就是在同一个范畴内。

  每个组件的理想值是独立的。这种假设大大简化了处理问题的难度,但却损害了准确性。这就是朴素贝叶斯名字“朴素”的由来。这样,上面的公式

  这样,这部分计算就变得简单了。用频率代替概率。

  考虑随机变量

  因为的某个维度的可能值不会出现在训练样本中,所以获得该维度所有样本的概率为0,这样的估计被认为是不准确的。没有出现在训练样本中,说明出现的概率很低。为了防止出现概率为零,平滑上述假设引入霸气仙人掌,即引入一个正数。

  ,将上述估算公式改为

  很容易验证上面的公式也是一个概率分布。时光流逝

  时间是最大似然估计。

  因此,联合分布是假定的。

  ,测试集中的数据

  在中选择所需的族。根据上面获得的分布函数,计算属于每个类别的概率,即

  该样本被预测为具有最高条件概率的类别。对于同一个样本,以上类型的分母都是一样的,比较一下就好了。

  样本的大小被预测为具有最高条件概率的类。

  2.各种各样

  是连续分布的。

  我们必须估计各种类型的分布。根据资料,分布比较复杂。为了简单起见,假设各级分布都是多元正态分布,那么各级的分布估计问题就是多元正态分布的参数估计问题。对于每一类,用样本均值代替总体均值,用样本协方差代替总体协方差,得到每一类的密度函数。关于;在…各处;大约

  报价与案例1相同。这样就得到类概率密度的估计值。用于测试的集中数据

  计算下一个概率

  密度:

  并将样本归入最大化上述公式的类别。类似地,因为对于相同的样本,上述

  每个公式的分母都是一样的,我们只需要计算和比较。

  个人

  大小,并将数据预测为最大化上述公式的类。

  其次,采用主成分分析贝叶斯分类器对手写数字进行分类。

  这里还在用。

  数据集,这个数据集的格式和导入在上面《KNN与手写数字分类的实现》中有详细描述。

  因为这里每个数据(每张照片,对应训练数据矩阵和测试数据矩阵的每一列)的维数是

  ,维数高,直接应用贝叶斯分类器计算复杂度高,而且这些数据有很强的相关性。首先,我们使用主成分分析来降低维度:降低维度到

  然后假设每一类的分布是多元正态分布,估计该类的条件概率密度。最后,对测试集中的数据进行分类。源代码如下所示。(这段代码很垃圾,很多地方可以用矩阵之类的代替,可以降低时间复杂度。但是今天我不想想,所以重复了很多代码片段,用了很多循环,导致运行非常慢。以后有空再来更新hhh)

  用于读取训练数据和测试数据的代码

  函数images=loadMNISTImages(文件名)

  fp=fopen(文件名, Rb );

  assert(fp ~=-1,[无法打开,文件名, ]);

  magic=fread(fp,1, int32 ,0, IEEE-be );

  assert(magic==2051,[Bad magic number in ,filename, ]);

  numImages=fread(fp,1, int32 ,0, IEEE-be );

  numRows=fread(fp,1, int32 ,0, IEEE-be );

  numCols=fread(fp,1, int32 ,0, IEEE-be );

  images=fread(fp,inf, unsigned char );

  images=reshape(images,numCols,numRows,num images);

  images=permute(images,[2 1 3]);

  fclose(FP);

  %整形为#像素x #示例

  images=shape(images,size(images,1) * size(images,2),size(images,3));

  %转换为双精度并重新调整为[0,1]

  images=double(图像)/255;

  目标

  阅读标签的代码。

  函数标签=loadMNISTLabels(文件名)

  fp=fopen(文件名, Rb );

  assert(fp ~=-1,[无法打开,文件名, ]);

  magic=fread(fp,1, int32 ,0, IEEE-be );

  assert(magic==2049,[Bad magic number in ,filename, ]);

  numLabels=fread(fp,1, int32 ,0, IEEE-be );

  labels=fread(fp,inf,无符号字符);

  assert(size(labels,1)==numLabels,“标签计数不匹配”);

  fclose(FP);

  目标

  机密源代码

  %调用自定义函数,读取60000张照片,记录为Train。

  train=loadMNISTImages( train-images . idx 3-ubyte );

  %看标签,分类6万张时尚吐司图片。

  train labels=loadMNISTLabels( train-labels . idx 1-ubyte );

  %调用自定义函数,读取10000张测试照片,并记录为Test。

  test=loadMNISTImages( t10k-images . idx 3-ubyte );

  %读取测试集标签

  test label=loadMNISTLabels( t10k-labels . idx 1-ubyte );

  [m1,n1]=大小(火车);

  [m2,N2]=大小(测试);

  %求人口协方差矩阵COV(X,Y)=E{(X-u)(X-u)}

  u=sum(Train,2)/n1;

  COV=(Train-u*ones(1,n1))*(Train-u*ones(1,n1))/n1;

  %找出前50个主成分的方向

  [特征值向量,特征值]=EIG(COV);

  P=(eigenvactor(:m1-50 1:m1));

  %投影,以获得每张照片的50个新功能。

  newfeature=P * Train

  %将PCA降维后的数据按标签分为10类,即m {1,1}.m {1,10}。

  count=ones(1,10);

  因为i=1:60000

  M{1,Trainlabels(i,1) 1}(:count(1,Trainlabels(i,1) 1))=newfeature(:I);

  count(1,train label(I,1) 1)=count(1,Trainlabels(i,1)1)1;

  目标

  %来计算每一类的均值向量,第一类的均值向量就是矩阵u1的第I列。

  因为i=1:10

  [SIZE(i,1),SIZE(i,2)]=size(M{1,I });

  u1(:i)=(sum(M{1,i},2))/SIZE(i,2);

  目标

  %计算每个类的协方差矩阵,记为COV1{1,1}.COV1{1,10}

  因为i=1:10

  COV1{1,i}=(M{1,i}-u1(:I)*个一(1,SIZE(i,2)))*(M{1,i}-u1(:I)*个一(1,SIZE(i,2))/SIZE(I,2);

  目标

  %计算每个类别的先验概率,以及pr的第I个行为的类别I的先验概率。

  pr=SIZE(:2)/n1;

  %测试集被投影到50个主要方向。

  X=P *检验;

  %计算测试集中每张照片属于每个类别的后验概率,按最大值分类。

  对于I=1:10000;

  对于j=1:10;

  Q(1,j)=-(X(:i)-u1(:j))*(inv(COV1{1,j })*(X(:i)-u1(:j))-2*log(det(COV1{1,j })2 * log(pr(j,1));

  目标

  [m,n]=max(Q);

  k=n-1;

  NL(i,1)=k;

  目标

  T=NL(:1);

  %统计正确分类的照片数量,并标记为s。

  s=0;

  因为i=1:10000

  if Testlabel(i,1)==T(i,1)

  s=S1;

  目标

  目标

  %输出精度

  精度=s/N2;

  分类的准确性是

  ,在我的电脑上运行了大约10秒钟。

  在上面,我用主成分分析来

  维度数据减少到

  魏。降低的维度将在下面讨论。

  以及与精度的关系,可以得到如图所示的数据。

  将

  与精度的关系拟合如下。

  从实验结果可以看出,随着

  增加,准确的说是率先增加,然后几乎保持不变。起初,精确度如下

  但是增加,因为m太小,包含不了原始数据的大部分信息,所以随着m的增加,原始数据中保留的有用信息越来越多,所以准确率越来越高。当.的时候

  当它足够大时,原始数据的有用信息几乎被充分利用,然后增加。

  反而会引入很多冗余信息,准确率也不会继续提高。因为在实验原理上做了大量理想化的假设,而且实验方法是基于数理统计的,所以即使不压缩也不可能达到100%的准确率,这是由统计学习方法本身决定的。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: