本文要讲述一个古老的机器学习算法,叫作朴素贝叶斯。这个算法比较简单明了,没有使用很是复杂的数学定理。用到的核心的数学理论就是几率中的一个定理,叫作贝叶斯定理(Bayes' Theorem)。python
如今咱们看一个例子,假设有一个生产扳手的工厂,有两台机器。这两台机器分别生产了不少扳手,并且每一个扳手都能看出是哪一个机器生产的。如今有了不少不少生产出的扳手,而且这些扳手里面有达标的正品和不达标的次品。如今要解决的问题是:咱们想知道,2号机器它生产的产品是次品的几率是多少。解决这个问题要用到的定理就是贝叶斯定理。算法
$$ P(A|B) = \frac{P(B|A)*P(A)}{P(B)} $$机器学习
学过几率论的朋友应该对它有点了解,这里也稍微解释下。咱们给上面的问题提供一些条件:函数
问题是:机器2生产的产品是次品的几率是多少?学习
如今一步步往下计算,首先计算最后生产的产品是机器1生产的几率P(Mach1)=30/50=0.6,最后生产的产品是机器1生产的几率P(Mach2)=20/50=0.4。而后全部产品中有1%的次品表示P(Defect) = 1%。接下来的条件表示要用到条件几率P(Mach1 | Defect) = 50%。这句话的意思就是若是一个产品是次品,那么它是机器1生产的几率是50%。同理P(Mach2 | Defect) = 50%。咱们要求的是P(Defect | Mach2)= ?。带入贝叶斯定理公式:spa
$$ P(Defect|Mach2) = \frac{P(Mach2|Defect)*P(Defect)}{P(Mach2)} $$code
结果为0.5*0.01/0.4=1.25%。显然,使用贝叶斯定理能够经过一些很容易得到的几率来得出不容易得到的几率结果,能够节省咱们不少的精力。这就是贝叶斯定理的应用。rem
接下来来说朴素贝叶斯分类器,咱们要用到的就是上述的贝叶斯定理。其中P(A|B)被称做后验几率,P(B|A)和P(B)这两个几率并不彻底是几率,由于朴素贝叶斯分类器中,B表明特征,因此说这两个几率咱们称做似然。数学
来看看下面的例子,有两组数据绿组和蓝组,x1表明人群的年龄,x2表明他们的收入。全部的红组表明全部步行上班的人,绿组表明开车上班的人。如今若是出现一个新的点,咱们要对它进行分类,肯定是分到红色组中仍是绿色组中。产品
咱们要使用朴素贝叶斯来解决这个分类问题,首先来看看咱们须要通过的三个步骤。
第一步,看看这个贝叶斯公式:
$$ P(Walks|X) = \frac{P(X|Walks)*P(Walks)}{P(X)} $$
这里的X就是它的特征。对于新的点,它有对应的年纪和收入就是这个新用户的特征,咱们要求的就是已知这些特征,要获得它分到红组或者绿组的几率。这里的P(Walks)就是随机抽一我的,它是走路上班的几率,这个也被称做先验几率,对应的就是后验。P(X)指的是随机抽一我的,他所显示的特征和新用户的特征的似然或者可能性。这里的似然也是个几率,它是对数据特征的几率,所以咱们把它叫作似然。再而后,这里的P(X|)指的是对这个数据特征的几率,所以叫作似然。接下来第三部要求的也是个似然P(X|Walks),或者叫作边际的似然,边际的可能性。这样咱们就能求出后验几率P(Walks|X)。
求解完步行部分的再求开车部分的:
$$ P(Drives|X) = \frac{P(X|Drives)*P(Drives)}{P(X)} $$
而后咱们就能够比较P(Walks|X)和P(Drives|X),也就是已知用户的特征,其步行或者开车的几率。这两个几率哪一个比较大,那么就能够将这个用户分类到那个分组中。
那么开始按照上面说的流程进行计算,首先比较简单,P(Walks)=Number of Walkers/Total Observations=10/30。接下来,计算P(X),也就是似然。这个是朴素贝叶斯中核心的一步。这里的X指的是新用户他所表明的特征,即年纪和收入。咱们能够围绕这个新用户画一个圈,那么这个圈就表明着在这个二维数据空间中的全部用户,他们的特征和新用户很是类似。要求的P(X)就是咱们原先数据空间中的全部数据,它的特征坐落在这个圈中的几率。那么咱们要计算的就是原先数据中与新用户拥有类似特征的个数除以总的人数。P(X)=Number of Similar Observations/Total Observations=4/30.
再而后求P(X}Walks),也就是边际似然,那么就是若是一我的是步行上班,那么它坐落在这个圈中的几率。那么这里的计算公式很简单,就是P(X|Walks) = Among those who Walk/Total number of Walkers=3/10。这样,咱们就能够求得后验几率P(Walks|X) = 0.75。一样的方法能够获得P(Drives|X)=0.25。
因为0.75>0.25,所以这个用户分配到步行上班组的几率大于分配到开车上班组的几率。
接下来咱们来看看几个问题,首先第一个,为何把它作朴素贝叶斯?或者为何朴素?当咱们使用朴素贝叶斯方法的时候已经作过一个假设,这个假设就是数据的全部特征都是独立的。在上述的例子里的两个特征,年龄和薪水,实际上这二者是可能有关系的,通常来讲年龄越大可能薪水就越大。但这里假设年龄和薪水二者没有相关性。所以在一个机器学习的问题中,咱们常常会作一些假设,这些假设并不必定都是对的,但这些假设能够帮助咱们更高效快捷的解决问题。咱们容许有一点偏差,由于咱们的终极问题是解决问题。
接下来第二个问题,似然函数P(X),上面计算这个函数的方法是先在新数据周围画了个圈,表示在这个圈里的数据点,都表示和这个新数据点有类似的特征,那么接下来这个似然就是指若是有一个新的点,那么它坐落在这个圈中的几率。那么这个P(X)你会发现,它跟咱们想要计算的后验几率是和红组相关仍是绿组相关是没有关系的。咱们最后要计算的两个后验几率的公式中的分母都是P(X),那么咱们比较这二者实际上能够把这个P(X)个消掉,也就是说能够直接比较二者的分子P(X|Walks)P(Walks)和P(X|Drives)P(Drives)。
最后一个问题,若咱们已知的组超过两组怎么办?目前已经有两组的状况下,比较二者的后验几率,那么咱们将新数据分配到更大的几率的分组中。那么同理若是有三组的话,就是比较三者的后验几率,哪一个更大就分配到其分组中。
这里的代码实现实际上也只是讲以前的文章中将分类器改为朴素贝叶斯便可:
from sklearn.naive_bayes import GaussianNB classifier = GaussianNB() classifier.fit(X_train, y_train)
以上,就是朴素贝叶斯算法的相关知识。