用python3.0实现《机器学习实战》一书的总结

因为自己开始学习Python就是使用的3.0版本,但是在学习中发现很多给出的python代码都是2.0版本,因此一直会有程序报错。这里给出自己整理的代码报错及如何改动。
这里的错误代码主要来自《机器学习实战一书》

1. print报错,在python3.0中,print成为了一个函数,因此print 'a',要变成print('a')

2.D=map(set,dataSet); numItems=float(len(D))
报错:object of type 'map' has no len()
原因:在python2.0中,map(func,*iterables)函数操作之后不改变对象的类型,因此在本例中输出D还是list类型。可是在python3.0之后map()函数返回的对象类型是一个Iterator,它表示的是一个数据流,我们不能事先知道这个数据流的长度,只能使用功能next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的。对Iterator不能使用len()函数,必须先使用list()函数将map对象转换为list之后再操作。因此要改为 numItems=float(len(list(D)))
同类型改动还有:filter()函数
另外,map返回的对象,当作为参数传递时,用for ..in..时,调用一个数据之后就会在该对象中拿走这样一个数据,因此在二层循环中会出现内层循环只能循环一次的情况。因此必须先将map对象转换为实际的set对象或是其他。这里采用:

d=[]
for i in D:
    d.append(i)
c1=[]
for c in C1:
    c1.append(c)

将map对象D,C1改成list对象d,c1,但其组成元素为set。

3.贝叶斯算法,邮件分类这一章中:
报错“TypeError: 'range' object doesn't support item deletion”
错误出现在del trainingSet[randIndex]。因为trainingSet = range(50),range构造的对象不再是list类型,而是range类型,不支持del操作。因此,这里将trainingSet = range(50)改为trainingSet = list(range(50))就行了;
报错“UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 199: illegal multibyte sequence”。
一直以为是程序的错误,debug之后发现代码wordList = textParse(f.read())并不是一直报错,而是在读取某一封邮件时报错,点进去发现,邮件中编码有点问题,删除问题字符�就行了。当然这不是2.0与3.0的改动问题,但一起放在代码部分讲了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值