3.1.1

>>>a="qwe"

>>> a[-1]

'e'

列表的最后一位是-1.

>>>import trees

之后在Python的console中就可以使用trees.py中的函数了。

>>> lc={}

>>>lc["no"]=0

>>>lc['yes']=3

>>> lc

{'yes': 3, 'no':0}

>>>lc.keys()

['yes', 'no']

>>>lc.values()

[3, 0]

一个简单的例子,字典lc由key和value组成。这里,key是'no'和'yes',value分别是0和3。

>>> 'yes'in lc.keys()

True

>>> 'mo'in lc.keys()

False

可以用keys()函数检测字典中有什么样的key。

>>>float(lc['no'])

0.0

>>>float(lc['yes'])

3.0

根据 key得到相应的value,并且将value转化成float形式。

>>>mydata

[[1, 1, 'yes'],[1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]

>>>trees.calcShannonEnt(mydata)

0.9709505944546686

在这个函数中会新建一个字典labelCounts = {},输入mydata经过计算后,该字典中的key是’'yes'和'no',相应的value是2和3.求出每种key发生的频率,求对数后,可以得到相应的熵。

3.1.2

>>>a=[0,1,2,3,4,5]

>>>b=a[:2]

>>> b

[0, 1]

b包含的列表的前面两个数。

>>>c=a[3:]

>>> c

[3, 4, 5]

c包含了列表的从第3个数开始到最后一个数(开头的是第0个数)。

>>>b.extend(c)

>>> b

[0, 1, 3, 4, 5]

把c中的元素加到b中,b比a少了第2个数。

>>>d=b.extend(c)

>>> d

错误用法,d显示为空。

>>>b.append(c)

>>> b

[0, 1, 3, 4, 5,[3, 4, 5]]

跟上面对比可以看出,extend是把列表中的元素一个个加进去,append是将列表整个加进去。

>>>mydata

[[1, 1, 'yes'],[1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]

>>>d=[a[0] for a in mydata]

>>> d

[1, 1, 1, 0, 0]

>>>set(d)

set([0, 1])

>>>e=set(d)

>>> e

set([0, 1])

>>> y=[ vfor v in e]

>>> y

[0, 1]

可以用这些函数将mydata中5条数据中的第0个元素提取出来,然后看第0个元素有多少种类,组成一个集合。

>>>trees.chooseBestFeatureToSplit(mydata)

0

这个函数先将mydata根据每条数据中的第0个元素的分类(第0个元素是1)形成一个新的子集[[1, 'yes'], [1, 'yes'], [ 0, 'no']],根据'yes'和'no'计算该子集的熵,乘以3/5的比例后加到newEntropy中,然后再根据第0个元素的分类(第0个元素是0)形成一个新的子集[ [1, 'no'], [1, 'no']], 根据'yes'和'no'计算该子集的熵,乘以2/5的比例后加到newEntropy中。同样原理可以将mydata根据每条数据中的第1个元素的分类得到相应的newEntropy。该函数等效于比较newEntropy的大小,根据第i个元素得到的newEntropy小,就把bestFeature改成i。

3.13

>>>mytree=trees.createTree(mydata,label)

>>>mytree

{'no surfacing':{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

这个函数的输入是mydata和label,返回的是包含了很多代表树结构信息的嵌套字典。当进入函数,但还没有进入 for value in uniqueVals:循环前,mytree={'no surfacing': {}}。 uniqueVals是一个有0和1的set,由数据集中的第0个元素得到。

>>>mytree['no surfacing']

{}

mytree['nosurfacing']是一个空的字典

mytree['nosurfacing'][0]

这相当于在空字典中新建一个名称为0的key,而创建与该key对应的value则需要再一次进入 createTree()函数。这次输入的数据集是:[[1, 'no'], [1, 'no']]

>>>trees.splitDataSet(mydata,0,0)

[[1, 'no'], [1,'no']]

由于输入数据集的两个数据最后一个元素类别完全相同,都是'no',所以,直接返回'no'。这时mytree={'no surfacing': {0: 'no'}}。

然后运行mytree['no surfacing'][1],相当于在嵌套的字典中再新建一个名称为1的key,与前面那个名称为0的key并列。而创建与该key对应的value则需要再一次进入 createTree()函数。这次输入的数据集是:[[1, 'yes'], [1, 'yes'], [0, 'no']]

>>>trees.splitDataSet(mydata,0,1)

[[1, 'yes'], [1,'yes'], [0, 'no']]

接下来又会新建一个字典,假设是 mytree2={'flippers': {}}。

然后进入for value in uniqueVals:循环, uniqueVals是一个有0和1的set,由数据集中的第1个元素得到。在空字典中新建一个名称为0的key,而创建与该key对应的value则需要再一次进入 createTree()函数。这次输入的数据集是:[['no']]

>>>b=trees.splitDataSet(mydata,0,1)

>>> b

[[1, 'yes'], [1,'yes'], [0, 'no']]

>>>trees.splitDataSet(b,0,0)

[['no']]

所以返回的是'no'。这时mytree2={'flippers': {0:'no'}}

接下去在字典中新建一个名称为1的key,而创建与该key对应的value则需要再一次进入 createTree()函数。这次输入的数据集是:[['yes'], ['yes']]

>>>trees.splitDataSet(b,0,1)

[['yes'], ['yes']]

所以返回的是'yes'。这时mytree2={'flippers': {0: 'no', 1: 'yes'}}.

跳出for value in uniqueVals:循环,返还mytree2。这时mytree={'no surfacing': {0: 'no', 1: {'flippers':{0: 'no', 1: 'yes'}}}}

最后跳出前面一个for value in uniqueVals:循环,返还mytree。

3.2.1

Linux系统中没有自己安装matplotlib。所以要在linux命令行中输入:

sudo apt-getinstall python-matplotlib

>>>dict(p='pig',d='dog')

{'p': 'pig', 'd':'dog'}

>>>dict(p="pig",d="dog")

{'p': 'pig', 'd': 'dog'}

dict函数用于构造字典,双引号和单引号效果一样。

在官方给的例程中有两个createPlot(),但是把3.2.1中的createPlot()函数用#号屏蔽掉了,把多个#号删除,并且把那个createPlot()改成createPlot2()。输入下面命令:

>>>reload(treePlotter)

<module'treePlotter' from 'treePlotter.py'>

>>>treePlotter.createPlot2()

可以得到书中图3-5的图像。

plotNode()函数中nodeTxt指的是要在图中打印的文字,xy是箭头起始的坐标,xytext是文字的位置。axes fraction指的是坐标的值是从0到1的。arrowstyle="<-"指的是箭头是指向文字的,bbox是包装文字的盒子,有圆润的和锯齿形两种。

createPlot()函数中的createPlot.ax1是全局变量,所以该函数中调用的plotNode函数也可以对createPlot.ax1进行修改。

getNumLeafs()函数中myTree.keys()[0]指的是myTree字典中第0个key,也就是'no surfacing'。secondDict是{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}。然后进入循环for key in secondDict.keys():。secondDict里面有两个key,当key等于0时,所对应的secondDict[key]不是字典,所以进入else语句,此时numLeafs==1。当key==1时,所对应的secondDict[key]不是字典,所以又进入getNumLeafs函数中(为了与前面的区分,假设为getNumLeafs2),输入的字典为{'flippers': {0: 'no', 1: 'yes'}},输入字典的value中没有字典了,返还numLeafs(为了与前面的区分,假设为NumLeafs2),numLeafs2=2。跳出getNumLeafs2函数,此时numLeafs==3,返还numLeafs,跳出getNumLeafs函数。

getTreeDepth()函数与前面一个函数大致一样,不一样的是在if type(secondDict[key]).__name__=='dict':语句后thisDepth至少是1,如果不是字典,那么thisDepth就是1。

plotTree()函数的输入是myTree,parentPt,nodeText。当createPlot函数调用该函数时,myTree=={'no surfacing': {0: 'no', 1: {'flippers': {0:'no', 1: 'yes'}}}},parentPt==(0.5,1.0),nodeText==‘ ’。进入函数后firstStr='no surfacing',plotTree()函数中的cntrPt是用来计算当前决策节点的位置。假设现在的 plotTree.xOff记为x(也就是上一个叶节点的x轴位置),总的叶节点plotTree.totalW为N,输入myTree的叶节点numLeafs为n。那么当前决策节点下面的叶节点x轴就是(x+1/N, x+2/N.............x+n/N),那么决策节点的x轴位置应该是 x+1/N和 x+n/N的中间,也就是[2x+(1+n)/N]/2,y轴位置不变。cntrPt==(0.5,1.0),接下来的两个函数plotNode()和plotMidText()就画了一个位于(0.5,1)的决策节点。接下来plotTree.yOff=0.5。secondDict=={0: 'no', 1: {'flippers': {0: 'no', 1:'yes'}}}。接下去的for循环。首先key==0,进入else语句,plotTree.xOff变成了0.5/3,于是plotNode()在(plotTree.xOff,plotTree.yOff)即(0.5/3,0.5)画了一个no的叶节点,plotMidText()在cntrPt和(plotTree.xOff,plotTree.yOff)中间写上key的名称0。接着key==1,进入if语句,进入循环(假设是plotTree2()),输入是myTree== {'flippers': {0: 'no', 1: 'yes'}},parentPt==(0.5,1.0),nodeText==‘ 1’。接下来,cntrPt变成了(2/3,0.5),然后从 parentPt到cntrPt画了一个箭头到决策节点,中间标上 nodeText,secondDict 变成{0: 'no', 1: 'yes'},plotTree.yOff变成0。接下来进入for循环,由于 secondDict中没有字典,所以循环的两次都有进入else语句。当key==0时,从cntrPt到(plotTree.xOff,plotTree.yOff)==(1.5/3,0)处画箭头到叶节点,中间表上str(key)。当key==1时,从cntrPt到(plotTree.xOff,plotTree.yOff)==(2.5/3,0)处画箭头到叶节点,中间表上str(key)。跳出plotTree2(),接着再跳出plotTree()。

3.4

>>>ar=open('lenses.txt')

>>>a=ar.readlines()

>>> a

['young\tmyope\tno\treduced\tnolenses\r\n', 'young\tmyope\tno\tnormal\tsoft\r\n','young\tmyope\tyes\treduced\tno lenses\r\n', 'young\tmyope\tyes\tnormal\thard\r\n','young\thyper\tno\treduced\tno lenses\r\n','young\thyper\tno\tnormal\tsoft\r\n', 'young\thyper\tyes\treduced\tnolenses\r\n', 'young\thyper\tyes\tnormal\thard\r\n','pre\tmyope\tno\treduced\tno lenses\r\n', 'pre\tmyope\tno\tnormal\tsoft\r\n','pre\tmyope\tyes\treduced\tno lenses\r\n', 'pre\tmyope\tyes\tnormal\thard\r\n','pre\thyper\tno\treduced\tno lenses\r\n', 'pre\thyper\tno\tnormal\tsoft\r\n','pre\thyper\tyes\treduced\tno lenses\r\n', 'pre\thyper\tyes\tnormal\tnolenses\r\n', 'presbyopic\tmyope\tno\treduced\tno lenses\r\n','presbyopic\tmyope\tno\tnormal\tno lenses\r\n','presbyopic\tmyope\tyes\treduced\tno lenses\r\n','presbyopic\tmyope\tyes\tnormal\thard\r\n', 'presbyopic\thyper\tno\treduced\tnolenses\r\n', 'presbyopic\thyper\tno\tnormal\tsoft\r\n','presbyopic\thyper\tyes\treduced\tno lenses\r\n','presbyopic\thyper\tyes\tnormal\tno lenses\r\n']

>>> a[0]

'young\tmyope\tno\treduced\tnolenses\r\n'

>>>a[0].strip()

'young\tmyope\tno\treduced\tnolenses'

>>>a[0].strip().split('\t')

['young', 'myope','no', 'reduced', 'no lenses']

>>>fr=open('lenses.txt')

>>> fr

<open file'lenses.txt', mode 'r' at 0x7f5600bf6660>

>>>lenses=[inst.strip().split('\t') for inst in fr.readlines()]

>>>lenses

[['young','myope', 'no', 'reduced', 'no lenses'], ['young', 'myope', 'no', 'normal','soft'], ['young', 'myope', 'yes', 'reduced', 'no lenses'], ['young', 'myope','yes', 'normal', 'hard'], ['young', 'hyper', 'no', 'reduced', 'no lenses'],['young', 'hyper', 'no', 'normal', 'soft'], ['young', 'hyper', 'yes','reduced', 'no lenses'], ['young', 'hyper', 'yes', 'normal', 'hard'], ['pre','myope', 'no', 'reduced', 'no lenses'], ['pre', 'myope', 'no', 'normal','soft'], ['pre', 'myope', 'yes', 'reduced', 'no lenses'], ['pre', 'myope','yes', 'normal', 'hard'], ['pre', 'hyper', 'no', 'reduced', 'no lenses'],['pre', 'hyper', 'no', 'normal', 'soft'], ['pre', 'hyper', 'yes', 'reduced','no lenses'], ['pre', 'hyper', 'yes', 'normal', 'no lenses'], ['presbyopic','myope', 'no', 'reduced', 'no lenses'], ['presbyopic', 'myope', 'no', 'normal','no lenses'], ['presbyopic', 'myope', 'yes', 'reduced', 'no lenses'],['presbyopic', 'myope', 'yes', 'normal', 'hard'], ['presbyopic', 'hyper', 'no','reduced', 'no lenses'], ['presbyopic', 'hyper', 'no', 'normal', 'soft'],['presbyopic', 'hyper', 'yes', 'reduced', 'no lenses'], ['presbyopic', 'hyper','yes', 'normal', 'no lenses']]

>>>lensesTree=trees.createTree(lenses,lensesLabels)

>>>treePlotter.createPlot(lensesTree)

机器学习实战ch03相关推荐

  1. 机器学习实战ch03: 使用决策树预测隐形眼镜类型

    决策树的一般流程 1.收集数据 2.准备数据:树构造算法只适用标称型数据,因此数据值型数据必须离散化 3.分析数据 4.训练算法 5.测试数据 6.使用算法 决策树的优点 1.数据形式非常容易理解 2 ...

  2. 机器学习实战——决策树(代码)

    最近在学习Peter Harrington的<机器学习实战>,代码与书中的略有不同,但可以顺利运行. from math import log import operator# 计算熵 d ...

  3. 机器学习实战3.4决策树项目案例03:使用Sklearn预测隐形眼镜类型

    搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...

  4. Python3:《机器学习实战》之决策树算法(3)预测隐形眼镜类型

    Python3:<机器学习实战>之决策树算法(3)预测隐形眼镜类型 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://gith ...

  5. Python3:《机器学习实战》之决策算法(3)预测隐形眼镜类型

    Python3:<机器学习实战>之决策树算法(3)预测隐形眼镜类型 转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://gith ...

  6. 机器学习实战笔记(Python实现)-03-朴素贝叶斯

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  7. matlab 职坐标,机器学习入门之机器学习实战ByMatlab(四)二分K-means算法

    本文主要向大家介绍了机器学习入门之机器学习实战ByMatlab(四)二分K-means算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助.前面我们在是实现K-means算法的时候,提到 ...

  8. 刻意练习:机器学习实战 -- Task01. K邻近算法

    背景 这是我们为拥有 Python 基础的同学推出的精进技能的"机器学习实战" 刻意练习活动,这也是我们本学期推出的第三次活动了. 我们准备利用8周时间,夯实机器学习常用算法,完成 ...

  9. 资料分享:送你一本《机器学习实战》电子书!

    这两天,各985高校发布了考研初试分数线.从中发现这两年大数据相关专业的分数线暴涨啊.没有400分估计心里都没底啊.可见大数据这个领域有多火爆!而机器学习是我们团队的一个主要方向,新加入的同学通常都是 ...

最新文章

  1. Python 运行时常见错误汇总
  2. asp.net等项目编译失败的原因之不能写入
  3. mybatis如何根据mapper接口生成其实现类
  4. 什么时候出python4_什么?Python4要来了?快来看看Python之父怎么说
  5. bzoj3083 遥远的国度
  6. 适合初学者的安卓开源项目_开源周初学者
  7. opencv学习笔记01
  8. android audio arch
  9. Luyten反编译工具
  10. Pandas安装与对象使用
  11. Android service进程保护
  12. 【转】实用API大全
  13. 小程序中自定义图片预览功能
  14. 港科夜闻|「广州粤港澳大湾区研究院」成立,香港科技大学校长史维教授获聘担任研究院顾问...
  15. 联邦学习中的安全聚合SMPC
  16. 快速工业相机镜头的选型:焦距、工作距离、视野等的计算
  17. 安装ie9提示未能完成安装_win7系统安装Ie提示“Internet explorer未能完成安装”的解决方法...
  18. DENO 1.10发行说明
  19. 18个配色(色彩搭配)资源网站——设计师福利
  20. 【矩阵论笔记】零化多项式

热门文章

  1. 求字符串中的回文数或者是回文单词
  2. C++实现Win11万年历
  3. java的生活状态,生活状态 - Dorian's Blog - BlogJava
  4. android画面传输到电视,想把手机画面投屏到电视上,这个方法最简单!(收藏)...
  5. 紫光云:打造数字化转型的基座
  6. 开源2周年,openGauss Developer Day 2022全程亮点回顾!
  7. strapi终于装好了,网速太慢了,处理了一下代理,新建了一个.zshrc文件,加入了pon和poff两个函数
  8. STM32F103ZET6如何驱动DS18B20温度传感器
  9. HttpClient 调用耗时长服务问题记录和处理方案
  10. linux apache 配置文件位置,Apache主配置文件httpd.conf 详解