- 签证留学 |
- 笔译 |
- 口译
- 求职 |
- 日/韩语 |
- 德语
分类算法除了需要测量信息熵,还需要划分数据集,度量花费数据集的熵,以便判断当前是否正确地划分了数据集。我们将对每个特征划分数据集的结果计算一次信息熵 ,然后判断按照哪个特征划分数据集是最好的划分方式。想象一个分布在二维空间的数据散点图,需要在数据之间划条线,将它们分成两部分,我们应该按照x轴还是y轴划线呢?
要划分数据集,打开文本编辑器,在trees.py文件中输入下列的代码:
程序清单1-1按照给定特征划分数据集
程序清单1-1的代码使用了三个输入参数:待划分的数据集、划分数据集的特征、特征的返回值。需要注意的是,Python语言不用考虑内存分配问题。Python语言在函数中传递的是列表的引用,在函数内部对列表对象的修改,将会影响该列表对象的整个生存周期。为了消除这个不良影响,我们需要在函数的开始声明一个新列表对象。因为该函数代码在同一数据集上被调用多次,为了不修改原始数据集,创建一个新的列表对象。数据集这个列表中的各个元素也是列表,我们要遍历数据集中的每个元素,一旦发现符合要求的值,则将其添加到新创建的列表中。在if 语句中,程序将符合特征的数据抽取出来。后面讲述得更简单,这里我们可以这样理解这段代码:当我们按照某个特征划分数据集时,就需要将所有符合要求的元素抽取出来。代码中使用了Python语言列表类型自带的extend()和append()方法。这两个方法功能类似,但是在处理多个列表时,这两个方法的处理结果是完全不同的。
假定存在两个列表,a和b:
>>> a=[1,2,3]
>>>b=[4,5,6]
>>> a.append (b)
>>>a
[1,2, 3,[4, 5, 6]]
如果执行a.append(b),则列表得到了第四个元素,而且第四个元素也是一个列表。然而如果使用extend方法:
>>> a=[1,2,3]
>>> a.extend(b)
>>>a
[1,2,3,4,5,6]
则得到一个包含a和b所有元素的列表。
我们可以在前面的简单样本数据上测试函数splitDataSet()。首先还是要将程序清单1-1的代码增加到trees.py文件中,然后在Python命令提示符内输入下述命令:
>>> reload(trees)
<module 'trees' from 'trees.pyc'>
>>> myDat,labels=trees.createDataSet()
>>> myDat
[[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]
>>> trees.splitDataSet (myDat,0,1)
[[1, 'yes'], [1, 'yes'], [0, 'no']]
>>> trees.splitDataSet (myDat,0,0)
[[1, 'no'], [1, 'no']]
接下来我们将遍历整个数据集,循环计算香农熵和splitDataset()函数,找到最好的特征划分方式。熵计算将会告诉我们如何划分数据集是最好的数据组织方式。
打开文本编辑器,在trees.py文件中输人下面的程序代码。