第一范文网 - 专业文章范例文档资料分享平台

机器学习之用Python从零实现贝叶斯分类器

来源:用户分享 时间:2025/9/15 18:50:44 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

在对特定的属性归属于每个类的概率做计算、预测时,将用到这些特征。

我们将数据特征的获取划分为以下的子任务:

1. 按类别划分数据 2. 计算均值 3. 计算标准差 4. 提取数据集特征 5. 按类别提取属性特征 按类别划分数据

首先将训练数据集中的样本按照类别进行划分,然后计算出每个类的统计数据。我们可以创建一个类别到属于此类别的样本列表的的映射,并将整个数据集中的样本分类到相应的列表。

下面的SeparateByClass()函数可以完成这个任务:

Python

1 defseparateByClass(dataset): 2 3 4 5 6 7 8

separated = {}

fori in range(len(dataset)):

vector = dataset[i]

if (vector[-1] not in separated):

separated[vector[-1]] = [] separated[vector[-1]].append(vector)

return separated

可以看出,函数假设样本中最后一个属性(-1)为类别值,返回一个类别值到数据样本列表的映射。

我们可以用一些样本数据测试如下:

Python

1 dataset = [[1,20,1], [2,21,0], [3,22,1]] 2 separated = separateByClass(dataset)

3 print('Separated instances: {0}').format(separated)

运行测试,你会看到如下结果:

Python

1 Separated instances: {0: [[2, 21, 0]], 1: [[1, 20, 1], [3, 22, 1]]}

计算均值

我们需要计算在每个类中每个属性的均值。均值是数据的中点或者集中趋势,在计算概率时,我们用它作为高斯分布的中值。

我们也需要计算每个类中每个属性的标准差。标准差描述了数据散布的偏差,在计算概率时,我们用它来刻画高斯分布中,每个属性所期望的散布。

标准差是方差的平方根。方差是每个属性值与均值的离差平方的平均数。注意我们使用N-1的方法(译者注:参见无偏估计),也就是在在计算方差时,属性值的个数减1。

Python

1 import math 2 def mean(numbers): 3 4

5 defstdev(numbers): 6

avg = mean(numbers)

return sum(numbers)/float(len(numbers))

7 8

variance = sum([pow(x-avg,2) for x in numbers])/float(len(numbers)-1) returnmath.sqrt(variance)

通过计算从1到5这5个数的均值来测试函数。

Python

1 numbers = [1,2,3,4,5]

2 print('Summary of {0}: mean={1}, stdev={2}').format(numbers, mean(numbers), stdev(numbers))

运行测试,你会看到如下结果:

Python

1 Summary of [1, 2, 3, 4, 5]: mean=3.0, stdev=1.58113883008

提取数据集的特征

现在我们可以提取数据集特征。对于一个给定的样本列表(对应于某个类),我们可以计算每个属性的均值和标准差。

zip函数将数据样本按照属性分组为一个个列表,然后可以对每个属性计算均值和标准差。

Python

1 def summarize(dataset): 2 3 4

summaries = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)] del summaries[-1] return summaries

我们可以使用一些测试数据来测试这个summarize()函数,测试数据对于第一个和第二个数据属性的均值和标准差显示出显著的不同。

Python

1 dataset = [[1,20,0], [2,21,1], [3,22,0]] 2 summary = summarize(dataset)

3 print('Attribute summaries: {0}').format(summary)

运行测试,你会看到如下结果:

Python

1 Attribute summaries: [(2.0, 1.0), (21.0, 1.0)]

按类别提取属性特征

合并代码,我们首先将训练数据集按照类别进行划分,然后计算每个属性的摘要。

Python

1 defsummarizeByClass(dataset): 2 3 4 5 6

separated = separateByClass(dataset) summaries = {}

forclassValue, instances in separated.iteritems():

summaries[classValue] = summarize(instances) return summaries

使用小的测试数据集来测试summarizeByClass()函数。

Python

1 dataset = [[1,20,1], [2,21,0], [3,22,1], [4,22,0]] 2 summary = summarizeByClass(dataset)

3 print('Summary by class value: {0}').format(summary)

运行测试,你会看到如下结果:

Python

1 Summary by class value:

2 {0: [(3.0, 1.4142135623730951), (21.5, 0.7071067811865476)], 3 1: [(2.0, 1.4142135623730951), (21.0, 1.4142135623730951)]}

机器学习之用Python从零实现贝叶斯分类器.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4ujxy5p2kn207lr1badb_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top