• 数值型数据
    • 方法一:区分类别
    • 方法二:高斯分布
    • 总体标准差和样本标准差
    • 代码实现提示

    数值型数据

    你可能已经注意到,在讨论近邻算法时,我们使用的都是数值型的数据,而在学习朴素贝叶斯算法时,用的是分类型的数据。

    比如,人们对法案的投票有赞成和否决两类;音乐家可以用他们演奏的乐器来分类等等。这些分类之间是没有距离的,萨克斯手和钢琴家的距离并不会比鼓手近。而数值型数据则有这种远近之分。

    在贝叶斯方法中,我们会对事物进行计数,这种计数则是可以度量的。对于数值型的数据要如何计数呢?通常有两种做法:

    方法一:区分类别

    我们可以划定几个范围作为分类,如:

    • 年龄
      • < 18
      • 18 - 22
      • 23 - 30
      • 31 - 40
      • 40

    • 年薪
      • $200,000

      • 150,000 - 200,000
      • 100,000 - 150,000
      • 60,000 - 100,000
      • 40,000 - 60,000

    划分类别后,进行可以应用朴素贝叶斯方法了。

    方法二:高斯分布

    数值型数据 - 图1

    我想将收入数据进行分类,然后应用朴素贝叶斯算法。

    你的做法已经过时了,我会使用高斯分布和概率密度函数来做。

    高斯分布和概率密度函数这两个词听起来很酷,他们的作用也非常大。下面我们将学习如何在朴素贝叶斯算法中使用高斯分布。

    首先,我们为健康手环的例子增加一列收入属性:

    数值型数据 - 图2

    我们来看购买i500的用户的收入情况,比如取平均值:

    数值型数据 - 图3

    还可以求出标准差:

    数值型数据 - 图4

    标准差是用来衡量数据的离散程度的,如果所有数据都接近于平均值,那标准差也会比较小。通过公式我们可以计算得到i500用户的收入标准差是20.108。

    总体标准差和样本标准差

    上面的标准差公式是总体标准差,我们需要对所有的数据进行统计才能得出,比如统计500名学生的成绩,就能计算出总体标准差。

    但通常我们无法获取总体的数据,比如要统计新墨西哥北部鹿鼠的重量,我们不可能对所有的鹿鼠进行称重,只能选取一部分样本,这时计算得到的就是样本标准差。

    数值型数据 - 图5

    样本标准差的公式是:

    数值型数据 - 图6

    所以计算得到i500用户收入的样本标准差是21.327。下面的内容都会使用样本标准差。

    你可能听说过正态分布、钟型曲线、高斯分布等术语,他们指的是同一件事:68%的数据会落在标准差为1的范围内,95%的数据会落在标准差为2的范围内:

    数值型数据 - 图7

    在我们的示例中,平均值是106.111,样本标准差是21.327,因此购买i500的用户中有95%的人收入在42,660美元至149,770美元之间。如果我问你P(100k|i500)的概率有多大,你可以回答非常大;如果问你P(20k|i500)的概率有多大,你可以回答基本不可能。

    用公式来表示是:

    数值型数据 - 图8

    数值型数据 - 图9

    每次出现这些公式时我都想提醒读者千万不要紧张,其实他们只是看起来比较复杂,只需一步一步拆解开就能理解了。数据挖掘学到后面会遇到各种复杂的公式,千万不要被他们的外表吓到。

    让我们逐步拆解这个公式。假设我们要计算P(100k|i500)的概率,即购买i500的用户中收入是100,000美元的概率。之前我们计算过购买i500的用户平均收入以及样本标准差,我们用希腊字母μ(读“谬”)来表示平均值,σ(读“西格玛”)来表示标准差。

    数值型数据 - 图10

    数值型数据 - 图11

    数值型数据 - 图12

    数值型数据 - 图13

    e是自然常数,约等于2.718。

    数值型数据 - 图14

    练习

    下表中列出了加仑公里数为35的车型的马力(HP),现在我想知道同样是35加仑公里的Datsun 280z马力为132的概率。

    数值型数据 - 图15

    数值型数据 - 图16

    结果表明这个概率非常低,而事实上这辆车就是132马力。

    代码实现提示

    在训练朴素贝叶斯分类器时,可以讲所有属性的平均值和样本标准差计算出来,而分类阶段使用下面这段代码就能实现了:

    1. import math
    2. def pdf(mean, ssd, x):
    3. """概率密度函数,计算P(x|y)"""
    4. ePart = math.pow(math.e, -(x - mean) ** 2 / (2 * ssd ** 2))
    5. return (1.0 / (math.sqrt(2 * math.pi) * ssd)) * ePart

    测试一下:

    1. >>> pdf(106.111, 21.327, 100)
    2. 0.017953602706962717
    3. >>> pdf(72.875, 9.804, 132)
    4. 5.152283971078022e-10

    数值型数据 - 图17

    休息一下吧