您的位置:首页 > 编程语言

集体智慧编程 Programming Collective Intelligence 书中代码程序研究

2013-06-26 11:11 756 查看

集体智慧编程 Programming Collective Intelligence 书中代码程序研究

本人最近在学习《集体智慧编程》,英文名称为《Programming Collective Intelligence》。机器学习入门强烈推荐!

本书以机器学习和计算统计为主题背景,专门讲述如何挖掘和分析Web上的数据和资源,如何分析用户体验、市场营销,个人品味等诸多信息,并得出有用的结论。主要内容包括,协作过滤技术(实现关联产品推荐功能)、集群数据分析(在大规模数据集中挖掘相似的数据子集)、搜索引擎核心技术(爬虫、索引、查询引擎、PageRank算法等)、搜索海量信息并进行分析统计得出结论的优化算法、贝叶斯过滤技术(垃圾邮件过滤、文本过滤)、用决策树技术实现预测和决策建模功能,社交网络的信息匹配技术、机器学习和人工智能应用等。与《数据挖掘-实用机器学习技术》相比更偏重应用和例子,结合例子学习这些机器学习的理论会更容易些。

书中的例子都用代码。本人在看的过程中运行了其中的大部分代码,发现有些问题,运行结果有问题,花了些时间去改了下,贴些可能的问题供大家参考。免得遇到同样的问题。

其中的程序,使用的是Python编写,建议使用Python 2.X,不然像print,reload等要改很多。我使用的是Python2.7,IDE用的UliPad,编码为UTF-8。书我看的是中文版

另外从书中提供的网址下载的数据集,不知什么编码。我直接读取的时候,有问题,主要是第五章schedule.txt、第七章decision_tree_example.txt。我的方法是,打开这些文件,复制内容到一个新的文件中,并改成程序需要的名称即可。

今天看到第七章,决策树建模了,就先分享第七章前面的程序遇到的问题吧。

第五章,优化

1、执行优化函数(学生宿舍问题)

使用遗传算法进行优化时,s=optimization.geneticoptimize(dorm.domain,dorm.dormcost)

报错,提示optimization中geneticoptimization的主循环中



箭头指向的红框中有错误,这是因为geneticoptimize中的变异操作函数mutate有疏漏导致的。其中判断语句if和elif并不能覆盖所有的条件,可能会返回None。例如random.random()>=0.5并且vec[i]>=domain[i][1]时,就会返回空。

要彻底解决它,需要修改变异操作函数。为了省事,我的解决办法是在调用的时候判断下,如果是None,则不添加到胜出者数组中。即上图中下面红框所示,添加个判断条件,如果非空,才添加到胜出者中。

2、绘制网络 一节,图像不能显示问题

drawnetwork函数中,最后调用img.show()显示图片,但是我的不知道什么问题,不能正常显示,所以我将这句替换成img.save('socialnetwork.jpg','JPEG')

这样,就会在程序当前目录下生成图片socialnetwork.jpg,进行查看

而且运行函数时,需调用socialnetwork.drawnetwork(sol),不能直接运行drawnetwork(sol)

3、计算交叉线 一节,数值类型问题。crosscount函数中,计算den=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)

利用例子中的代码,socialnetwork.crosscount(sol)的结果始终是0,但是画出图像来,有些明显有交叉的线。

原因是调用optimization中的优化函数,返回的可行解,其中值是整型的。

计算den时,默认den也是整型的,如果值在0~1直接时,得到的den就变成0了。接着运行下面的代码,

if den==0: continue ,则一直continue,计算的total值就不对了,所有画出的图形是有问题的。

解决办法,将den的计算结果乘以1.0,使之变成小数类型。

den=((y4-y3)*(x2-x1)-(x4-x3)*(y2-y1))*1.0 # 判断斜率是否相等

第七章,决策树建模

1、decision_tree_example.txt数据问题。书中的表7-1和程序,都是写有15条数据,而从作者提供的网址中http://kiwitobes.com/tree/decision_tree_example.txt中下载的数据则有16条,多的是第14条“slashdot UK no 21 None”。大家运行时注意。而且中文版表7-1中,第一列来源网站中“(直接)”,不应该翻译成中文啊,直接就是“(direct)”,程序中是没问题的。

2、其中my_data如果从文件中加载,那么第四列的整数,会读成字符串,如果不单独处理的话,运行时会有问题。我是在读取my_data文件后,加了下面的代码,将第四列字符串转换成整数

# 将第四列字符串转换成整数

for row in my_data:

row[3]=int(row[3])

如果读取的数据最后一列中,包含换行符'\n',那么再加一句变成

# 将第四列字符串转换成整数

for row in my_data:

row[3]=int(row[3])

row[4]=row[4].replace('\n','')

3、Zillow API 一节

Zillow是一个免费的Web服务,利用其提供的API获取房屋的详细信息及其评价值。例子中的开发者密钥是可以继续使用,呵呵,不用再申请了。但利用地址列表addresslist.txt中的数据,获取观测数据时,有些返回值是None,构建决策树时会出错。

解决方法有两个,第一是运行时,剔除掉housedata中的空数据。循环遍历housedata,如果是None则移掉。

第二是修改getpricelist函数,在其中li.append(data)前加一判断条件,即

def getpricelist():

l1=[]

for line in file(os.getcwd()+'/data/addresslist.txt'):

data=getaddressdata(line.strip(),'Cambridge,MA')

if data!=None:

l1.append(data)

return l1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: