zip函数将数据样本按照属性分组为一个个列表,然后可以对每个属性计算均值和标准差。
我们可以应用一些测试数据来测试这个summarize()函数,测试数据对于第一个和第二个数据属性的均值和标准差显示出明显的不合。
- dataset = [[1,20,0], [2,21,1], [3,22,0]]
- summary = summarize(dataset)
- print('Attribute summaries: {0}').format(summary)
运行测试,你会看到如下结不雅:
按类别提取属性特点
归并代码,我们起首将练习数据集按照类别进行划分,然后计算每个属性的┞藩要。
- def summarizeByClass(dataset):
- separated = separateByClass(dataset)
- summaries = {}
- for classValue, instances in separated.iteritems():
- summaries[classValue] = summarize(instances)
- return summaries
运行测试,你会看到如下结不雅:
- Summary by class value:
- {0: [(3.0, 1.4142135623730951), (21.5, 0.7071067811865476)],
- 1: [(2.0, 1.4142135623730951), (21.0, 1.4142135623730951)]}
猜测
朴实贝叶斯分类器,Matt Buck保存部分版权
我们如今可以应用大年夜练习数据中获得的┞藩要来做猜测。做猜测涉及到对于给定的数据样本,寂?驿归属于每个类的概率,然后选择具有最大年夜概率的类作为猜测结不雅。
应用小的测试数据集来测试summarizeByClass()函数。
- Attribute summaries: [(2.0, 1.0), (21.0, 1.0)]
进修资本及深刻浏览
我们可以将这部分划分成以下义务:
- 计算高斯概率密度函数
- 计算对应类的概率
- 单一猜测
- 评估精度
计算高斯概率密度函数
给定来自练习数据中已知属性的均值和标准差,我们可以应用高斯函数来评估一个给定的属性值的概率。
最后,我们须要将代码连贯起来。
已知每个属性和类值的属性特点,在给定类值的前提下,可以获得给定属性值的前提概率。
关于高斯概率密度函数,可以查看参考文献。总之,我们要把已知的细节融入到高斯函数(属性值,均值,标准差),并获得属性值归属于某个类的似然(译者注:即可能性)。
在calculateProbability()函数中,我们起首计算指数部分,然后计算等式的骨干。如许可以将其很好地组织成2行。
- import math
- def calculateProbability(x, mean, stdev):
- exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(stdev,2))))
- return (1 / (math.sqrt(2*math.pi) * stdev)) * exponent
- x = 71.5
- mean = 73
- stdev = 6.2
- probability = calculateProbability(x, mean, stdev)
- print('Probability of belonging to this class: {0}').format(probability)
运行测试,你会看到如下结不雅: