在对特定的属性归属于每个类的概率做计算、预测时,将用到这些特征。
我们将数据特征的获取划分为以下的子任务:
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)]}
相关推荐: