艾伯特机器学习web应用(全)[aibbt.com]


机 器 学 习 Web 应 用 分类建议:计算机/机器学习 人民邮电出版社网址:www.ptpress.com.cn 机器学习 Web 应用 [意] Andrea Isoni 著 杜春晓 译 Python 是一门通用型编程语言,也是一门相对容易学习的语言。因此,数据科学家在为中小规模的数 据集制作原型、实现可视化和分析数据时,经常选择使用 Python。 本书填补了机器学习和 Web 开发之间的鸿沟。本书重点讲解在 Web 应用中实现预测分析功能的难点, 重点介绍 Python 语言及相关框架、工具和库,展示了如何搭建机器学习系统。你将从本书学到机器学习的 核心概念,学习如何将数据部署到用 Django 框架开发的 Web 应用;还将学到如何挖掘 Web、文档和服务 器端数据以及如何搭建推荐引擎。 随后,你将进一步探索功能强大的 Django 框架,学习搭建一个简单、具备现代感的影评情感分析应用, 它可是用机器学习算法驱动的! 本书是写给正努力成为数据科学家的读者以及新晋的数据科学家的。读者应该具备一些机器学习经验。 如果你对开发智能(具备预测功能的)Web 应用感兴趣,或正在从事相关开发工作,本书非常适合你。掌握 一定的 Django 知识,学习本书将会更加轻松。我们还希望读者具备一定的 Python 编程背景和扎实的统计 学知识。 本书的目标读者 ● 熟悉机器学习基本概念和机器学习社区使用的一些术语。 ● 用多种工具和技术从网站挖掘数据。 ● 掌握 Django 框架的核心概念。 ● 了解最常用的聚类和分类技术,并用 Python 实现它们。 ● 掌握用 Django 搭建 Web 应用所需的所有必备知识。 ● 用Python语言的Django库成功搭建和部署电影推荐系统。 通过阅读本书,你将能够 用Python探索Web机器学习系统开发 让系统做出更加聪明的预测 eBay公司EU Analytics部门负责人Davide Cervellin作序 Machine Learning for the Web 机器学习Web应用.indd 1,3 17/6/26 下午1:56 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权 www.aibbt.com 让未来触手可及机器学习 Web 应用 Machine Learning for the Web [意] Andrea Isoni 著 杜春晓 译 机器学习Web应用.indd 4 17/6/26 下午1:56 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 版权声明 Copyright ©2016 Packt Publishing. First published in the English language under the title Machine Learning for the Web. All rights reserved. 本书由英国 Packt Publishing 公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不 得以任何方式或任何手段复制和传播。 版权所有,侵权必究。 著 [意] Andrea Isoni 译 杜春晓 责任编辑 陈冀康 责任印制 焦志炜 人民邮电出版社出版发行 北京市丰台区成寿寺路 11 号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京鑫正大印刷有限公司印刷 开本:8001000 1/16 印张:14.5 字数:280 千字 2017 年 8 月第 1 版 印数:1 – 2 400 册 2017年 8 月北京第 1 次印刷 著作权合同登记号 图字:01-2016-8595 号 定价:59.00 元 读者服务热线:(010)81055410 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广登字 20170147 号 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 内容提要 机器学习可用来处理由用户产生的、数量不断增长的 Web 数据。 本书讲解如何用 Python 语言、Django 框架开发一款 Web 商业应用,以及如何用一些 现成的库和工具(sklearn、scipy、nltk 和 Django 等)处理和分析应用所生成或使用的数据。 本书不仅涉及机器学习的核心概念,还介绍了如何将数据部署到用 Django 框架开发的 Web 应用,包括 Web、文档和服务器端数据的挖掘和推荐引擎的搭建方法。 本书适合有志于成为或刚刚成为数据科学家的读者学习,也适合对机器学习、Web 数 据挖掘等技术实践感兴趣的读者参考阅读。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 机器学习2016 ,参、,还, 机器学习。对机器学习,有。理解一可为生 来的以及对有何,。 为学的学科,机器学习不生。科学来一 于法,实现工的。参数的法法,可 的,量的数。还有一,法的参数的,法的 部(的一法的)的数,法法,不 仅仅量的数。法机器学习的生成的数据,学习到 一,以的。 科学家、开发和工和使用、和的机器学习技 术有,到,机器学习应用开实,、和 业,学科来,本来讲,的可以于 机器学习。 机器学习的理解,将的来。于一 5 到 10 ,机器学习将来,到的方不工业发 生了。机发,的工。为了不 的工,生或以为。工业现,以发, 机器了生产的,来了产量的增,产的可和 。应的,产量的和工的现,机器兴的工了 。将的由和发的工具,可一。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 2 机器学习将以的方,数据的方,工的,将的工 机器和法。数据处理将不数据,法数据。 ,的将,的将的数据,将 ,的和可。对生产生的一, 和的有。者机器学习为生来者,机器学 习方法有,量的,量数据。来讲,法的 数据可的。 实,机器学习为一工具以发,应用于和 的。为服务,使不,或兴不 ,对有的理解。 如,言,如开考、、、 的、等(仅)来一。 或法的的成为的。如, 和了商等一,和,合 理分,以分用的。所有的服务, 使用合理,可以感到的不一学分的一部分。 机器学习引,一的家,将些理解 数据,于些数据以可的方的或了机器学习, 还有到方实现的业。 Andrea Isoni 的本书了一读的, 到用机器学习技术实现的应用,者将机器学习技术合到 Web 应用。 用机器学习技术建的服务,到为的的 服务。 如为的业生,书读的一数据 的何成的,些技术。 Davide Cervellin,@ingdave eBay EU Analytics 部 言,到。——者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 20 ,IBM 的机,的 方。刚刚的一,的 AlphaGo 机了 ,的 Master 了,,长,法, 。由可,来,工技术、数据、机器学习技术的 发,了长的。 机器学习技术为工的一,和应用不,、学习和 业不学者 AAAI Fellow的书一、 、机器、服、机和家、、机器等应用不断推 。以现来,处工的和。为的业 者,不于,应的核心技术机器学习,技术, 可的实现工的方法,的推一。 的,数据产业发到家,实现数据数据的 ,一了数据挖掘、机器学习等技术的。 本书讲解的商业数据分析和挖掘所用到的机器学习理和技术。者介绍了 机器学习的本概念、Python 机器学习工具(NumPy、pandas 和 matplotlib 等),分 讲解了和有机器学习理,方法,用到了量概 、数等数学,如、、概和分解等。 者的学一到了的现。部分数学有志于 学习的读者的,的读者可以感机器学习的数学。介绍 机器学习理,者 Web 和方讲解了 Web 挖掘技术介绍了 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 2 、 LDA。讲解机器学习理和技术,者引了为 Web 开发 者的 Django 框架,的数据分析有机到, 用的法一款 Web 产。者用讲解的法和挖掘技术,用 Django 框架搭建推荐和分析。学到,不由感 Python 工 的。数据分析用 Python 到一款 Web 产,可 Python 的应用。,Facebook 开了 PyTorch 学习框架,一了 Python 机器学习的。 ,开发的产还,用户的产用户还有 ,可为一可产(MVP),用户 ,的。,于,者也有讲将部署到生产服务器。 感兴趣的读者可以 Heroku、SAE 等应用,也可以用 Apache、mod_wsgi 的机搭服务器。可还一。,可以推荐 开发的产了,具了用户 Web 产的,,来, 刚刚的 Web 推荐用机器学习法的 感的等为本书、的。读者 了 1 的,了书及者的处。阅读了 2 文,本也一本 Python 书的者。读者阅读了 6 文,学 习数据科学,学有所成。,学、学、 学等了的学、机等,了解 了学概念,参考了现有的本,包括的书,了 CSDN 等的文,一心的感。感工业学的刚、 学学等读者对工的。,感的家,书的用 的来的,也。 本学有,,书、不和处所,读者 。 2017 2 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 数据科学,机器学习,成为科技商业的。技术可用 来处理用户产生的、数量不断增长的数据。本书将讲解如何用 Python 语言、Django 框架 开发一款 Web 商业应用,还将讲解如何用一些现成的库(sklearn、scipy、NLTK 和 Django 等)处理和分析(机器学习技术)应用生成或使用的数据。 本要 1 ,Python 机器学习实践,机器学习的概念以及数据科学业 用 Python 处理数据所使用的库。 2 ,机器学习,讲解为数据分和数据所用到的法。 3 ,有机器学习,讲解数据用的有机器学习法。 4 ,Web 挖掘技术, Web 数据的、分析和的技术。 5 ,推荐,介绍商业所使用的的推荐。 6 ,开 Django ,介绍开发 Web 应用所用到的 Django 的和。 7 ,推荐 Web 应用,将介绍的机器学习概念实践,实现为 Web 用户推荐的应用。 8 ,感分析应用,一实,使用讲的,分析的感 和。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2 本的 读者应一机, Python 2.7,(和)书讲解的。 本的 何有一(Python)和学,对机器学习感兴趣和/或数据 科学业的读者可本书。 本书使用不的文本来分不的。以用及用。 文的、数据库、文、文、文、、URL 、 用户的和 Twitter 用户方如 端以, Django 库sudo pip install django。 如 INSTALLED_APPS = ( 'rest_framework', 'rest_framework_swagger', 'nameapp', ) 所有的或使用 python manage.py migrate 的和重要的使用。现的语,如或对框,如 如所,有框,和,,将到数据库。 要。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 3 。 读者,对于本书的所所—— 或不些。家的对来,将到些 读者的。 如有一建的,发 feedback@packtpub.com, 书的。 如一方的家,对感兴趣,有或合一 本书,到 www.packtpub.com/authors 阅为者的文档。 为有一本 Packt 的书为了的书有所,还为 了以。 如 www.packtpub.com 的书,用的,可以所有 书的。如方的, http://www.packtpub.com/support ,用文发。也可以 www.epubit.com.cn 来。 文如。 1用和或的。 2到部的 SUPPORT 。 3 Code Downloads & Errata。 4框 Search 书。 5文的书。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4 6何处书。 7 Code Download 文。 还可以 Packt Publishing 书, Code Files 文。 Search 框书可到书的书。。 来,用以解工具的本解或文 • Windows用户WinRAR / 7-Zip • Mac 用户Zipeg / iZip / UnRarX • Linux 用户7-Zip / PeaZip。 本书的包 GitHub 也了一https://github.com/PacktPublishing/Machine- Learning-for-the-Web。书和的包也到了 GitHub https://github.com/PacktPublishing/。将到本。 配 PD 还为了一 PDF 文,文包书的所有。些 书的不,有于理解本书。文的为 http://www.packtpub.com/ sites/default/files/downloads/MachineLearningfortheWeb_ColorImages.pdf。 使所来书的,也所。如的何 一本书发现——可文本或——,将感。 的以读者阅读的和不,本。如 发现何, http://www.packtpub.com/submit-errata,应书,Errata Submission Form,处的具。的到, 的建,处将到或到有的应。 https://www.packtpub.com/books/content/support,框书,可 书有的。部分 Errata 部分。 所有的一。对 Packt 来, 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 5 的和可。如发现对的何的产, 或,以。 将书的发到 copyright@packtpub.com。 如,的者,,有,以 心的读者。 对本书有何方的,可以 questions@packtpub.com , 也将来解。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 Andrea Isoni 一数据科学家、理学家,开发有的, 机器学习法和技术方,有的。,还有语言的使用,如 Python、C/C++、Java、JavaScript、C#、SQL、HTML。还用 Hadoop 框架。 ,语语言文学学,工。有Python 数据挖掘实 践Python 数据分析实和——的一本 Raspberry Pi 等。 @_生。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 Chetan Khatri 一数据科学,有 4 的和开发。 Nazara Technologies Pvt. Ltd 数据和机器学习方的工,和阅 业务数据科学实践。一家的数据和一家工,理 数据科学实践和者的。,于 R & D Lab 和 Eccella Corporation。有学(KSKV Kachchh University)的机科学学, 数据科学,学的。 以方为,包括为学生讲,学术以及 介绍数据科学,还一数据。学术和业实践 方有的业。参数据科学。参发了 Python ——PyKutch。和增学习,学习使用和分 理数据。 感学机科学 Devji Chhanga ,感引数据科学 的,的。感的家。 Pavan Kumar Kolluru 一学科工,数据、数和处理、感 (数据和)方的家, Python、R 和 MATLAB 。的于 如何用机器学习技术、法处理数据。 如何到不学科的,以数据处理和 方的。 为一数据(和)处理方的业和,一处理 数据,工使数据处理、和分方了业。用到的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2 处理技术有 OOA、机和可机。 为一和,于 Python 和 R 语言,于业和业的 。学,使用 Python 和包(、和数据分析等)。 为一机器学习,分(有和)、建和数据理解、 以及数据方的家。开发一数据(或)方的机器学习 法,为理科的成,法将数据和分一框架,为 了的分数。家的工,用 Hadoop 和 MapReduce 分析 数据。的数据分析业包括 HDFS、Pig、Hive 和 Spark。 Dipanjan Sarkar Intel 的一数据科学家。Intel 的, 的使和具。分析、商业、应用开发和建 的方的工。的技术学(IIIT)技术 学。的业包括工、数据科学、机器学习和文本分析。 Dipanjan 的兴趣包括学习技术、数据科学和的学习以及了解具有的 业。业,阅读、、和。一本于机 器学习的书 R Machine Learning by Example,书由 Packt Publishing 。还为 Packt Publishing 的本机器学习和数据科学书技术。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 1 Python ........1 1.1 机器学习用概念 ....................1 1.2 数据的、处理和可 —NumPy、pandas 和 matplotlib ............................................6 1.2.1 NumPy 的用................6 1.2.2 pandas 模块..........23 1.2.3 matplotlib ..............32 1.3 本书使用的科学库 ..........35 1.4 机器学习的应用 ..............36 1.5 ..........................................36 2 .......................37 2.1 法..................................37 2.1.1 .......................38 2.1.2 ...................40 2.1.3 .......................41 2.1.4 .......................44 2.2 ..........................................52 2.3 分解(SVD) ..............57 2.4 ..........................................58 3 .......................59 3.1 ..........................59 3.2 ..........................60 3.2.1模的 ...............................63 3.2.2 k ............................63 3.3 ..............................64 3.3.1 .......65 3.3.2 ...........66 3.4 ......................................67 3.5 量机 ..............................70 3.6 有学习方法的对 ..........75 3.6.1 .......................75 3.6.2 .......................80 3.7 可 ......................84 3.8 ..........................................93 4 Web ..........................94 4.1 Web 挖掘..........................95 4.1.1 Web .......................95 4.1.2 ...........................95 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 Web 应用 2 4.1.3—PageRank ...............................96 4.2 Web 挖掘..........................97 句...................................97 4.3 语言处理..........................98 4.4 的处理........................108 4.4.1 .....108 4.4.2( ).........................113 4.5 ........................................117 5 .................................118 5.1 用................................118 5.2 量方法....................120 5.3 方法........................120 5.3.1的 .............................121 5.3.2模的 .............................126 5.4 CBF 方法 ...............................130 5.4.1 .............................131 5.4.2 .............................132 5.5 用学习,建推荐 ........................................133 5.6 对数推荐方法 ............135 5.7 合推荐........................137 5.8 推荐........................139 5.8.1(RMSE) .............................140 5.8.2的...143 5.9 ........................................144 6 Django ...................145 6.1 HTTP—GET 和 POST 方法的 ........................................145 6.1.1 Django 的 的 .............146 6.1.2 置.............................147 6.2 应用—Django 的 ........................150 6.2.1 model ...........................150 6.2.2 HTML 的 URL view................151 6.2.3 URL view .......154 6.3 理 ................................157 6.3.1 shell .....................158 6.3.2 .............................159 6.3.3 RESTful 用 (API)...............160 6.4 ........................................162 7 Web 应用 .......163 7.1 应用来 ........................163 7.2 model ......................................165 7.3 ........................................166 7.4 实现用户的、和 ................................172 7.5()...175 7.6 分 ................................178 7.7 推荐 ................................180 7.8 理和 API.....................182 7.9 ........................................184 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3 8 应用.................185 8.1 感分析应用用法 介........................................185 8.2 引擎的和应用的 ........................................187 8.3 Scrapy 的和感分析 应用................................189 8.3.1 Scrapy 的置.............190 8.3.2 Scraper.........................190 8.3.3 Pipeline........................193 8.3.4 .............................194 8.4 Django model .........................196 8.5合Django 和 Scrapy ..........197 8.5.1(模 ) .........198 8.5.2模...198 8.5.3的...201 8.5.4— Django view HTML .............................202 8.6 PageRankDjango view 和 法实现 ................................206 8.7 理和 API.....................210 8.8 ........................................212 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 技术业,分析和挖掘商业数据的技来。有业务,可 开发用产生的数据,以业务,或将数据。或分析些 可具有商业的量,有业的数据科学(或数据挖掘)业 到。数据科学用机器学习技术将数据为,以业务的 实的为。些法和技术以技术为的业务不可的。本书讲 解些法和技术,介绍如何将部署到实的商业。将学到用的机器学习 技术,有机一商业的习和应用使用。本书学到的技, 可用于实工。为了分书所的, Python 语 言、数和方法。 • 有于些的和,建阅读 Python 方文档 (https://docs.python.org/),阅读 A. Bluman 的 Elementary Statistics 以及由 G. Casella 和 R. L. Berger 合的 Statistical Inference,理解的概念和方法。学习 数,可阅读 G. Strang 所的 Linear Algebra and Its Applications。 本为,的 Python 机器学习的业所使用的为的 库和工具,如 NumPy、pandas 和 matplotlib,技术,以实现 的技术。讲解本书所用库,来机器学习的概念,一 实,实机器学习法如何有用的。 1.1 用 本书用的机器学习法,习以用,使。为了解 些法,理解本书,用概念,介绍。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2 第1 章 Python ,为机器学习,一为的,机器学习机科学的 一分,、工和学习理发来。也可以将机器学习 数据挖掘工具,于用数据分析方法理解的数据。学科的的,开发 的数据,可的参数(为由数成的数)学习 的,为了,将参数为可的。机用方可 为,概括(generalize)数据的,不的数据库对数 (或)。,机器学习,也据数据 为。机器学习方法的业应用有器、引擎、学 (OCR)和机。学科的,来介绍机器学习 所用术语。 何学习于一包 n 本的数据,数据的(properties) 据数据来。包一以的数,一量。量的成 (feature)。如,据的、和等 。数据, i 成一量 x(i),对应 i 的、等 。 i 还有一对应的(或)量 y(i),的。一 (training example)由一对(x(i), y(i))成。由 N 数据成、用于学习的 合{(x(i), y(i)); i=1,,N}。 x (),y 为() 。为解用的机器学习法用数学来,包一些参数, 。成,的用数据来和。 用来的,用来所用的 实(precision)。,数据的 50%,和使用 25% 的数据。 学习可分为(本书对有量介绍)。 的有为的量 x,何对应的。 学习的为,用法数据的,或将数据 (project)到数的(分法,如成分分析 PCA)。为 有,所以法用数据的使用方法, 的以及的。和有学习的一不 。 文为computational statics,statics应为 statistics。者 分量者 者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.1 用 3 • 的一对为的量和。学 习的务推断参数,数据的。些可一分为 数据的于或以,分的学习如何 的数据的。分一(对应的)有学习方 法,所的有。数分的实应用, 将量到一数量有的的。 为量。如,据的和一 。 本书 2 介绍学习方法, 3 用的有学习法。 4 讲解 Web 挖掘技术,也可将有和方法。 5 讲解推荐,于 有学习。 6 介绍 Django Web 框架。 7 介绍推荐(用到 Django 框架和 5 )的实现。以一 Django Web 挖掘应用实本书,实现 应用使用 4 学到的一些技术。学本书,应理解不的机器学习方法, 有将部署到用 Django 实现的实 Web 应用。 本来将一实,机器学习如何用于实业务,还将 Python 库(NumPy、pandas 和 matplotlib)。有些库的用法,实现 学到的法。 器 为了一解机器学习可以实数据,一来(的 可者的 GitHub 书的文到,为 https://github.com/ai2010/machine_ learning_for_the_web/tree/master/chapter_1/。 UCI 机器学习数据库(http://archive.ics.uci.edu/) 数据(Internet Advertisements Data Set,http://archive.ics.uci.edu/ml/ datasets/Internet+Advertisements)。些 Web 的来, 为一量,为数。 ad.names 文,可以到 的,的 URL 或文本现了些语( 有 1558 )。据有,的为 ad 或 nonad。,一 ad.data 文的 125, 125, , 1. 0, 1, 0, ad. 还有一学习,学习器本学习。志的机器学习。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4 第1 章 Python 据些数据,一的机器学习务到一,些, 些不(分)。来一包部量和的 ad.data 文,发现 包一些用?的。可以用 Python 的 pandas 库将?为-1(pandas 库 ) import pandas as pd df = pd.readcsv('ad-dataset/ad.data',header=None) df=df.replace({'?': np.nan}) df=df.replace({' ?': np.nan}) df=df.replace({' ?': np.nan}) df=df.replace({' ?': np.nan}) df=df.replace({' ?': np.nan}) df=df.fillna(-1) 读 ad.data 文的数据,建一 DataFrame 对,?为一的 (replace 数),为-1(fillna 数)。为数 (数据的) adindices = df[df.columns[-1]]== 'ad.' df.loc[adindices,df.columns[-1]]=1 nonadindices = df[df.columns[-1]]=='nonad.' df.loc[nonadindices,df.columns[-1]]=0 df[df.columns[-1]]=df[df.columns[-1]].astype(float) df.apply(lambda x: pd.tonumeric(x)) ad.为 1, nonad.为 0。所有的()的数 (用 astype 数将为, lambda 数用 to_numeric 数将 df 为 数)。 使用 scikit-learn 库( 3 )的(Support Vector Machine,SVM) 法数据 20%数据的。,将数据分为部分(80%)和 (20%) import numpy as np dataset = df.values[:,:] np.random.shuffle(dataset) data = dataset[:,:-1] labels = dataset[:,-1].astype(float) ntrainrows = int(len(data)*.8) train = data[:ntrainrows,:] 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.1 用 5 trainlabels = labels[:ntrainrows] test = data[ntrainrows:,:] testlabels = labels[ntrainrows:] ,分数据,用 NumPy 库(一)的数,数 据的(random.shuffle 数),数据的数据机的。 的-1,数的一不考。 现,用数据 SVM from sklearn.svm import SVC clf = SVC(gamma=0.001, C=100.) clf.fit(train, trainlabels) 一 SVM ,参数,将 clf 量。用 fit 数,用数 据合(fit)( 3 )。 20%数据的(mean accuracy), 用 score 数来,如 score=clf.score(test,testlabels) print 'score:',score (者 GitHub chapter_1 文),到 92%的, 也的,92%的实。机器学习的 所据以数据,推断一包。为了实现, 了的工,用 NumPy 和 pandas 库和处理数据,用 scikit-learn 库 的 SVM 法处理的数据。于本书将量使用 NumPy 和 pandas(有也用 到 matplotlib)库,将分介绍些库的方法以及用处理(建)数 据的方法。 和 些库,讲 Python 。用的方法, 端使用 pip >>> sudo pip install modulename① ,使用语 端不 Python shell pip 。处应的 Python shell 。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6 第1 章 Python import numpy as np ,numpy 包,np numpy,了一,库的所有数 X 可以用 np.X 不用 numpy.X 。本书所有的库(scipy、scikit-learn、pandas、 scrapy 和 nltk 等)用方来和。 1.2 的理和——Pana 和 ao 数数据到,不实用,法用机器学习法处理。如 一所(一),数据有些可,或些不数,法 用机器学习技术处理。,机器学习家量和数据, 数据的,以一分析或可处理。本用 NumPy 和 pandas 库,用 Python 语言建、和处理数据。matplotlib ,将介绍 Python 。NumPy 合 Python shell 讲解,的 IPython notebook 和 Python 本, 到者 GitHub chapter_1 文。pandas 和 matplotlib 库的讲解用 IPython notebook。 1.2.1 umP 的用 Numerical Python 或 NumPy Python 的一开包,数据分析和科学 的。库,用 Python 处理、数和不。对于 用数,的数。一来讲,一的数学数库来 数。 库以 • 用于量术的、数 • 对数据所有数的数学数 • 数 • 、(unique)和合 • 和合数据。 Python 的,NumPy 的于数。如,用的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 7 和方法, 10000000 的和 >>> def sumtrad(): >>> start = time.time() >>> X = range(10000000) >>> Y = range(10000000) >>> Z = [] >>> for i in range(len(X)): >>> Z.append(X[i] + Y[i]) >>> return time.time() - start NumPy 数对 >>> def sumnumpy(): >>> start = time.time() >>> X = np.arange(10000000) >>> Y = np.arange(10000000) >>> Z=X+Y >>> return time.time() - start >>> print 'time sum:',sumtrad(),' time sum numpy:',sumnumpy() time sum: 2.1142539978 time sum numpy: 0.0807049274445 方法所用分为 2.1142539978 和 0.0807049274445。 1 数对 NumPy 库的。数于 Python 的(list),数 所有的数(为或)。 array 数,可用一 数对,为 array 数参数将为数的、生成的数的 >>> arr = np.array([2, 6, 5, 9], float) >>> arr array([ 2., 6., 5., 9.]) >>> type(arr) ,可用如将数为 >>> arr = np.array([1, 2, 3], float) >>> arr.tolist() [1.0, 2.0, 3.0] — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8 第1 章 Python >>> list(arr) [1.0, 2.0, 3.0] ,, 的,它的 。 用现有数,建一的数对,用 copy 数 >>> arr = np.array([1, 2, 3], float) >>> arr1 = arr >>> arr2 = arr.copy() >>> arr[0] = 0 >>> arr array([0., 2., 3.]) >>> arr1 array([0., 2., 3.]) >>> arr2 array([1., 2., 3.]) ,还可以用一数,的,到一部的数, 如 >>> arr = np.array([10, 20, 33], float) >>> arr array([ 10., 20., 33.]) >>> arr.fill(1) >>> arr array([ 1., 1., 1.]) 还可以用 np 的 random 机建数。如,将建的数的长 为 permutation 数的参数,数一由数成的机 >>> np.random.permutation(3) array([0, 1, 2]) 一数建方法用 normal 数一分一数 >>> np.random.normal(0,1,5) 数的为于等于 0,于的参数。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 9 array([-0.66494912, 0.7198794 , -0.29025382, 0.24577752, 0.23736908]) 参数 0 为分的,1 为,5 5 数建数。使用分 ,random 数将 0 到 1 (不包 0 和 1)的数 >>> np.random.random(5) array([ 0.48241564, 0.24382627, 0.25457204, 0.9775729 , 0.61793725]) NumPy 还建数()的数。如,identity 数建, 用参数来 >>> np.identity(5, dtype=float) array([[ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 0., 0., 1., 0.], [ 0., 0., 0., 0., 1.]]) eye 数 k 对为 1 的。 >>> np.eye(3, k=1, dtype=float) array([[ 0., 1., 0.], [ 0., 0., 1.], [ 0., 0., 0.]]) 建数(1 或 2 )用的数 zeros 和 ones,的建数, 分用 0 或 1 。如 >>> np.ones((2,3), dtype=float) array([[ 1., 1., 1.], [ 1., 1., 1.]]) >>> np.zeros(6, dtype=int) array([0, 0, 0, 0, 0, 0]) zeros_like 和 ones_like 数,建的现有数的和的数 >>> arr = np.array([[13, 32, 31], [64, 25, 76]], float) >>> np.zeroslike(arr) array([[ 0., 0., 0.], 数的数。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及10 第1 章 Python [ 0., 0., 0.]]) >>> np.oneslike(arr) array([[ 1., 1., 1.], [ 1., 1., 1.]]) 一建数的方法,用 vstack 数(方合)合一数 >>> arr1 = np.array([1,3,2]) >>> arr2 = np.array([3,4,6]) >>> np.vstack([arr1,arr2]) array([[1, 3, 2], [3, 4, 6]]) 数也可以用 random 分建。如,机 0 到 1 的 分数为数,建一 23 数,方法如 >>> np.random.rand(2,3) array([[ 0.36152029, 0.10663414, 0.64622729], [ 0.49498724, 0.59443518, 0.31257493]]) 一用来建数的分分 >>> np.random.multivariatenormal([10, 0], [[3, 1], [1, 4]], size=[5,]) array([[ 11.8696466 , -0.99505689], [ 10.50905208, 1.47187705], [ 9.55350138, 0.48654548], [ 10.35759256, -3.72591054], [ 11.31376171, 2.15576512]]) [10,0]量,[[3, 1], [1, 4]]方,5 的数量。 1.1 方法 用 tolist 将 NumPy 数为 Python 的数 copy NumPy 数的数 ones, zeros 建用 1 或 0 的数的数 zeros_like, ones_like 数用来建为参数的的数 fill 将数为一的数 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 数据的准备、处理和可视化——NumPy、pandas 和 matplotlib 教程 11 方法 用途 identity eye k 0 vstack random random、permutation、 normal、rand、multivariate_normal random , 2.数组操作 、 Python , >>> arr = np.array([2., 6., 5., 5.]) >>> arr[:3] array([ 2., 6., 5.]) >>> arr[3] 5.0 >>> arr[0] = 5. >>> arr array([ 5., 6., 5., 5.]) , unique >>> np.unique(arr) array([ 5., 6.]) sort 。 argsort >>> arr = np.array([2., 6., 5., 5.]) >>> np.sort(arr) array([ 2., 5., 5., 6.]) >>> np.argsort(arr) array([0, 2, 3, 1]) shuffle , >>> np.random.shuffle(arr) >>> arr — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及12 第1 章 Python array([ 2., 5., 6., 5.]) NumPy 数,也有一数 array_equal,用来数等 >>> np.arrayequal(arr,np.array([1,3,2])) False ,数不。实,用分的 (用方括)。如,()方法如 >>> matrix = np.array([[ 4., 5., 6.], [2, 3, 6]], float) >>> matrix array([[ 4., 5., 6.], [ 2., 3., 6.]]) >>> matrix[0,0] 4.0 >>> matrix[0,2] 6.0 对数的使用文:,为于和的 的引 >>> arr = np.array([[ 4., 5., 6.], [ 2., 3., 6.]], float) >>> arr[1:2,2:3] array([[ 6.]]) 仅用:,不用数,所的所有 >>> arr[1,:] array([2, 3, 6]) >>> arr[:,2] array([ 6., 6.]) >>> arr[-1:,-2:] array([[ 3., 6.]]) flatten 数可将数为一数 等,和等。,用 cmp 数。者 >>>multilist = [[4, 5, 6], [2, 3, 6]] >>>multilist[0][0] 4 者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 13 >>> arr = np.array([[10, 29, 23], [24, 25, 46]], float) >>> arr array([[ 10., 29., 23.], [ 24., 25., 46.]]) >>> arr.flatten() array([ 10., 29., 23., 24., 25., 46.]) 还可以数对,。用 shape ,可到数的 >>> arr.shape (2, 3) ,arr 一 2 3 的。dtype 数的 >>> arr.dtype dtype('float64') 数 float64 用来(8 )实数(于 Python 的 float )。 数据有 int64、int32 和。数的数据可以。如 >>> intarr = matrix.astype(np.int32) >>> intarr.dtype dtype('int32') len 数数一的长 >>> arr = np.array([[ 4., 5., 6.], [ 2., 3., 6.]], float) >>> len(arr) 2 in,于 Python for 的用法,可用来断数包 >>> arr = np.array([[ 4., 5., 6.], [ 2., 3., 6.]], float) >>> 2 in arr True >>> 0 in arr False reshape 数可数的。如,8 1 的可为 4 2 的 reshape 数可所的。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及14 第1 章 Python >>> arr = np.array(range(8), float) >>> arr array([ 0., 1., 2., 3., 4., 5., 6., 7.]) >>> arr = arr.reshape((4,2)) >>> arr array([[ 0., 1.], [ 2., 3.], [ 4., 5.], [ 6., 7.]]) >>> arr.shape (4, 2) ,还的也,用 transpose 数可,建一 数 >>> arr = np.array(range(6), float).reshape((2, 3)) >>> arr array([[ 0., 1., 2.], [ 3., 4., 5.]]) >>> arr.transpose() array([[ 0., 3.], [ 1., 4.], [ 2., 5.]]) 数还可以用 T 实现 >>> matrix = np.arange(15).reshape((3, 5)) >>> matrix array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>>matrix .T array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]]) 一数的方法,用 newaxis 数增 >>> arr = np.array([14, 32, 13], float) >>> arr 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 15 array([ 14., 32., 13.]) >> arr[:,np.newaxis] array([[ 14.], [ 32.], [ 13.]]) >>> arr[:,np.newaxis].shape (3,1) >>> arr[np.newaxis,:] array([[ 14., 32., 13.]]) >>> arr[np.newaxis,:].shape (1,3) ,数的。由 newaxis 生成的数长为 1。 NumPy 数的用 concatenate 数,法于数的。一数 可,将的数于为参数可 >>> arr1 = np.array([10,22], float) >>> arr2 = np.array([31,43,54,61], float) >>> arr3 = np.array([71,82,29], float) >>> np.concatenate((arr1, arr2, arr3)) array([ 10., 22., 31., 43., 54., 61., 71., 82., 29.]) 数。,NumPy 一 >>> arr1 = np.array([[11, 12], [32, 42]], float) >>> arr2 = np.array([[54, 26], [27,28]], float) >>> np.concatenate((arr1,arr2)) array([[ 11., 12.], [ 32., 42.], [ 54., 26.], [ 27., 28.]]) >>> np.concatenate((arr1,arr2), axis=0) array([[ 11., 12.], [ 32., 42.], [ 54., 26.], [ 27., 28.]]) >>> np.concatenate((arr1,arr2), axis=1) array([[ 11., 12., 54., 26.], [ 32., 42., 27., 28.]]) 将量数据为文不用,的。NumPy 的 tostring 数可将数为。,可的,fromstring 数可将 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及16 第1 章 Python 还为数。如 >>> arr = np.array([10, 20, 30], float) >>> str = arr.tostring() >>> str '\x00\x00\x00\x00\x00\x00$@\x00\x00\x00\x00\x00\x004@\x00\x00\x00\x00\ x00\x00>@' >>> np.fromstring(str) array([ 10., 20., 30.]) 1.2 方法 用 unique 数所有不的数 random、shuffle 数,使机的数 sort、argsort sort 数 argsort 数的引 array_equal 数,如, True( False) flatten 将数为一数 transpose 数的 reshape 数的,数的 concatenate 现有的,数 fromstring 、tostring 和数的 3 NumPy 数的数学。如 >>> arr1 = np.array([1,2,3], float) >>> arr2 = np.array([1,2,3], float) >>> arr1 + arr2 array([2.,4., 6.]) >>> arr1-arr2 的为 NumPy 数。者 文为Concatenate two -dimensional arrays into one matrix,数,成一,不。, 处文据 SciPy.org 文档对 concatenate 数的的。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 数据的准备、处理和可视化——NumPy、pandas 和 matplotlib 教程 17 array([0., 0., 0.]) >>> arr1 * arr2 array([1, 4., 9.]) >>> arr2 / arr1 array([1., 1., 1.]) >>> arr1 % arr2 array([0., 0., 0.]) >>> arr2**arr1 array([1., 4., 27.]) ,。 , >>> arr1 = np.array([1,2,3], float) >>> arr2 = np.array([1,2], float) >>> arr1 + arr2 Traceback (most recent call last): File "", line 1, in ValueError: shape mismatch: objects cannot be broadcast to a single shape broadcast, 。,, 。 >>> arr1 = np.array([[1, 2], [3, 4], [5, 6]], float) >>> arr2 = np.array([1, 2], float) >>> arr1 array([[ 1., 2.], [ 3., 4.], [ 5., 6.]]) >>> arr2 array([1., 2.]) >>> arr1 + arr2 array([[ 2., 4.], [ 4., 6.], [ 6., 8.]]) arr2 arr1 。, arr1 ,arr2 , arr2 array([[1., 2.],[1., 2.],[1., 2.]]) — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及18 第1 章 Python 如数的方,可用 newaxis 量 >>> arr1 = np.zeros((2,2), float) >>> arr2 = np.array([1., 2.], float) >>> arr1 array([[ 0., 0.],[ 0., 0.]]) >>> arr2 array([1., 2.]) >>> arr1 + arr2 array([[-1., 3.],[-1., 3.]]) >>> arr1 + arr2[np.newaxis,:] array([[1., 2.],[1., 2.]]) >>> arr1 + arr2[:,np.newaxis] array([[1.,1.],[ 2., 2.]]) Python 不的,数,用数一 的 >>> arr = np.array([[1, 2], [5, 9]], float) >>> arr >= 7 array([[ False, False], [False, True]], dtype=bool) >>> arr[arr >= 7] array([ 9.]) 可以用数的 >>> arr[np.logicaland(arr > 5, arr < 11)] >>> arr array([ 9.]) 可以据引,用的引一数据为的数, ,将引数到数的,用方括括来。如 >>> arr1 = np.array([1, 4, 5, 9], float) >>> arr2 = np.array([0, 1, 1, 3, 1, 1, 1], int) arr1+arr2 有。应为 者 实现 Python ,可使用数 filter。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 19 >>> arr1[arr2] array([ 1., 4., 4., 9., 4., 4., 4.]) 3 , arr2 的引,数 arr1 应的,也 arr1 的 0、 1、 1、 3、 1、 1 和 1 。用 的引,可以到的 >>> arr = np.array([1, 4, 5, 9], float) >>> arr[[0, 1, 1, 3, 1]] array([ 1., 4., 4., 9., 4.]) 数的,使用一的引数,对应一引数。 引数到 Python ,将 Python 于数的方括。 1 数(selection array)的, 2 数。 如 >>> arr1 = np.array([[1, 2], [5, 13]], float) >>> arr2 = np.array([1, 0, 0, 1], int) >>> arr3 = np.array([1, 1, 0, 1], int) >>> arr1[arr2,arr3] array([ 13., 2., 1., 13.]) arr2 的为 arr1 的, arr3 的为 arr1 的, arr1 的 1 为于 1 、 1 的 13。 take 数以引数为参数,用的数,等于的方括 法 >>> arr1 = np.array([7, 6, 6, 9], float) >>> arr2 = np.array([1, 0, 1, 3, 3, 1], int) >>> arr1.take(arr2) array([ 6., 7., 6., 9., 9., 6.]) 用 axis 参数,take 数可用的数、一部分 >>> arr1 = np.array([[10, 21], [62, 33]], float) >>> arr2 = np.array([0, 0, 1], int) >>> arr1.take(arr2, axis=0) 4 的arr2, arr3。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及20 第1 章 Python array([[ 10., 21.], [ 10., 21.], [ 62., 33.]]) >>> arr1.take(arr2, axis=1) array([[ 10., 10., 21.], [ 62., 62., 33.]]) put 数为 take 数的,有参数将到(引)、 的来数。put 数将一数的到用数的一数的 >>> arr1 = np.array([2, 1, 6, 2, 1, 9], float) >>> arr2 = np.array([3, 10, 2], float) >>> arr1.put([1, 4], arr2) >>> arr1 array([ 2., 3., 6., 2., 10., 9.]) 本,,数的法也的(法 不) >>> arr1 = np.array([[11,22], [23,14]], float) >>> arr2 = np.array([[25,30], [13,33]], float) >>> arr1 * arr2 array([[ 275., 660.], [ 299., 462.]]) 1.3 方法 用 take 以一数数参数引,一数应的 put 将一数的为一数的 4 用的,的 XTX。,用 np.dot 数 np.dot(X.T, X)的有,应为 —者 np.dot X .T, X array([[125, 140, 155, 170, 185], [140, 158, 176, 194, 212], [155, 176, 197, 218, 239], [170, 194, 218, 242, 266], [185, 212, 239, 266, 293]]) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 21 >>> X = np.arange(15).reshape((3, 5)) >>> X array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) >>> X.T array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 6, 12], [ 3, 8, 13], [ 4, 9, 14]]) >>>np.dot(X .T, X)#X^T X array([[ 2.584 , 1.8753, 0.8888], [ 1.8753, 6.6636, 0.3884], [ 0.8888, 0.3884, 3.9781]]) 有数可数(或量)不的(、、量)。 一数(量)的 >>> arr1 = np.array([12, 43, 10], float) >>> arr2 = np.array([21, 42, 14], float) >>> np.outer(arr1, arr2) array([[ 252., 504., 168.], [ 903., 1806., 602.], [ 210., 420., 140.]]) >>> np.inner(arr1, arr2) 2198.0 >>> np.cross(arr1, arr2) array([ 182., 42., -399.]) NumPy 的 linalg ,实现了的数。如,的 的 >>> matrix = np.array([[74, 22, 10], [92, 31, 17], [21, 22, 12]], float) >>> matrix array([[ 74., 22., 10.], [ 92., 31., 17.], [ 21., 22., 12.]]) >>> np.linalg.det(matrix) -2852.0000000000032 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及22 第1 章 Python inv 数生成的 >>> invmatrix = np.linalg.inv(matrix) >>> invmatrix array([[ 0.00070126, 0.01542777, -0.02244039], [ 0.26192146, -0.23772791, 0.11851332], [-0.48141655, 0.4088359 , -0.09467041]]) >>> np.dot(invmatrix,matrix) array([[ 1.00000000e+00, 2.22044605e-16, 4.77048956e-17], [ -2.22044605e-15, 1.00000000e+00, 0.00000000e+00], [ -3.33066907e-15, -4.44089210e-16, 1.00000000e+00]]) 的(eigenvalues)和量(eigenvectors)方法 >>> vals, vecs = np.linalg.eig(matrix) >>> vals array([ 107.99587441, 11.33411853, -2.32999294]) >>> vecs array([[-0.57891525, -0.21517959, 0.06319955], [-0.75804695, 0.17632618, -0.58635713], [-0.30036971, 0.96052424, 0.80758352]]) 1.4 方法 用 dot 数的 inner 数的 linalg 的 linalg.det 、 linalg.inv 和 linalg.eig 等数 linalg 包括数方法,有的的 (det)、的(inv)以及的和量(eig) 5和 NumPy 一数的数。合,如和、、 数和,可数的应到。如,机(服分), 建一数,可以用以方法数的 np.dot(inv_matrix, matrix)的有,应为 者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 23 >>> arr = np.random.rand(8, 4) >>> arr.mean() 0.45808075801881332 >>> np.mean(arr) 0.45808075801881332 >>> arr.sum() 14.658584256602026 所有一数 1.5。 1.5 方法 用 mean 的。数,为 NaN std、var 数的(std)和方(var)。可由参数(为数的长) min、max 数(min)和(max) argmin、argmax (argmin)和(argmax)的引 1.2.2 andas Python 的 pandas ,包量用于分析数据的数。于 NumPy 库。pandas 的数据分析的,。 Python 的数,pandas 数,长文读、数据库pandas 数据 处理的。数据所包的,方法有些以及如何用 pandas ,将。讲解数据 pandas 的和数据的 方法。 ,用语句导入 pandas import pandas as pd ,文,要 pd, pandas。 1 介绍 pandas 有一的数对 Series,以引 pandas 的数据库 DataFrame。Series 可以 NumPy 所有的数据,还数据的引。 来一的 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及24 第1 章 Python obj 对由成,为,为对应的引。数的长为 N,引 0 到 N-1。Series 的数和引对,可分用 values 和 index NumPy 数,引以(如量法、用数或用数学数处 理数) Python 可为 Series 对,的为引 也可以用的为引 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 25 ,一引 g, 有 对 应 的 , pandas NaN(Not a Number, 数)。 用或 NAN 来的数据。用 pandas 的 isnull 和 notnull 数,可 现,可以一 CSV 文数据到 DataFrame 。DataFrame 数据 ,有一的,一可以不的数据(数、、等)。 DataFrame 有引(、引)。也可以将 DataFrame 成一由 Series 对 成的, Series ,所有的引(的)。合 ad.data 文 的数据讲解,数据可 http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements 。机器学习的介绍。 端以数据(,数据文的为 data_example/ad-dataset/ ad.data) 文有(将 header 参数为 none),使用数为的。 书处为ad-data,文实为ad.data。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及26 第1 章 Python data 对用 describe 数,可到 DataFrame 的 了量。由可,数据有 1554 数的(为 有,的用数)、3279 (对一用 count 数)。一有一 (、、、和分数),些数据有于对 DataFrame 数据的量。 用 columns 可到所有的 所有的为 int64 ,所有的实数据 4 和( 1 )为 object ,为 int64 。的方法有。 1 ,的,的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 27 用,,可到 一的方法法,有也 Python 量(有), 有的 DataFrame 或数(如 count 或 sum),还 ,使用方法(,为 int64 ,不用方法)。 对 DataFrame 的有一的了解,可使用 head()数。一 的 5 (或 DataFrame 的 5 ) 也可以用 tail()数, 5 或 5 。 head()或 tail()数 数 n,将所的、 n 用 Python 的法,也可以 DataFrame 到一数量的 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及28 第1 章 Python 仅到 DataFrame 的(还有)。 2 的方法有,如引或 或者,数据 的数据为 1 于 0 包的。 ix 方法引来应的 ,也可以使用 iloc 数 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 29 ix 和 iloc 的不于,ix 的引的, iloc 的引的 (数)。,,ix 一到 3 现为( 4 ), iloc 数 DataFrame 的 3 。 DataFrame 部数据,还有一数 loc, 引的,应的。如 数 Python 的方法不,为包括和的( ,包引为 3 的)。 来。DataFrame 对的一可为一 也可以将的为的 或将为一(使用机数 0 或 1 和 ad.)。 数为 Series 对,可为的一到 DataFrame 的 用 loc 数可 DataFrame 增一 loc方法,如,和所对应的的到。如 loc[label],到 为 label 的。label 可以数也可以。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及30 第1 章 Python ,将 DataFrame 的可 ,增的所有的为 test value。,可用 drop 数 于,数据也包数据。pandas 的 duplicated 方法可断一 对的 drop_duplicates 数 duplicated 数,的 DataFrame 仅包 的所有。如,使用数,可以一不的 还可以方将为 可以为数,机器学习一讲方法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 31 为 object ,可以将为 4 包不的数据(、?和数)。的 ,将为数。可以用 replace 数将所有的?实() 为 NaN 现,可以用方法处理包的。方法一,用 dropna 方法包 的 方法,包数据的,了将(可),也可为 数据。用 fillna 方法,些的一量,可数 以处理,所有的为数,可用 astype 数将为 float 。 ,还可以用 lambda 数,将 DataFrame 的一为数 , x 实一,to_numeric 数将一的为的数 据(为 float)。 DataFrame 数,。pandas 0.17 及以本,可使用 df1 = df.apply(pd.to_numeric, errors='coerce') 语,或处理数。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及32 第1 章 Python pandas 的,如何 DataFrame 对,为实应用 ,可用到。机,建一的 DataFrame 生成一包括数据的。可以用 concat 数,将合到 DataFrame ,将 data1 的到 data 的 ,发现 datatot data 增了( data 的数刚开的 不,为来了有 NaN 的)。 1.2.3 maloli 程 matplotlib.pyplot 库,于 MATLAB,将数据成的方法。由于 的一些数据分析用实现可,有用一的,解 将用到的所有 matplotlib 库(为 plt), figure 对(fig), axis 对(ax)。 ax.plot()到 ax 对,为(handle)。, matplotlib.pyplot 所有,将到 figure 对。,用 plt.show()端,用 fig.savefig()数将为 figure.png 文。 1.1。 来讲解如何用一不的,用到了 NumPy 数 , 1.2。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.2 的理和——NumPypandas 和 matplotlib 33 1.1 1.2 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及34 第1 章 Python 的 get_legend_handles_labels() 数, ax 对的 和,将 legend 数成。r--bs和g^ 的数据的和(分、方和)。linewidth 参数 用来的,markersize 用来的。 数据分析,一用的可方法,用来一数据量 的不(用 NumPy 的 random 生成的一数据)。 ,s 数据的,colors 为数据的。将 (p1,p2,p3) legend 数, 1.3。 1.3 由机分的数据成的 于 matplotlib 库的,建家读一读的和,如 方的http://matplotlib.org/users/pyplot_tutorial.html。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及1.3 用的 35 1.3 本用的 实现本书讲解的机器学习技术,有一些库的。介绍用的库。 • SciPy库于 NumPy 数对开发的一数学方法。为开, 以分用的开发者不断来的方法。用 SciPy 的用方法开 发的 Python ,为或应用的一部分,以 MATLAB、Octave 或 RLab 。SciPy 了方法,数据、数据可和等方法 应有有,使 Python 语言、具。 • scikit-learn ( sklearn )用 Python 语言实现的开机器学习。实现了、分 和等不的机器学习法,包括 k 基的应用法DBSCAN。库和 Python 的 NumPy、SciPy 等数学库可生对。库的数方法用 Python 实现的,为了,有些数用 Cython 实现的。如,量 机和对数用 Cython 的,对部库(LIBSVM、 LIBLINEAR)了。 • 理NLTK包一理NLP库和数。NLTK 的为 NLP 和的、学。些有工、 科学、、语言学和机器学习。还有一一文本处理 数,可实现分(tokenization)、(stemming)、(tagging)、法 分析(parsing)、语推理(semantic reasoning)和分。NLTK 还 和数据,可 50 语库和数据库。 • Scrapy用 Python 实现的开 Web (crawler)框架。为 的,为用,也适合用 API 数据。Scrapy 实现 (spider),的为一来。的一 Web shell,开发实现概念,可用 shell 。Scrapy 如 由 Scrapinghub Ltd.,一家 Web 技术的开发和服务的。 • Django 用 Python 实现的开 Web 应用框架,--器(model- logistic regression,有法、、、对数,还有不的。 对数。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及36 第1 章 Python view-controller)架。Django 的建、由数据库的 。开发可的理理应用。理可建、读、 或应用所使用的数据。,一些用 Django 的,如 Pinterest、 Instagram、Mozilla、The Washington Times()和 Bitbucket。 1.4 的应用 机器学习也不法,不所有数据的于, 的,讲机器学习技术的应用有。 • 不可用实现一些由成的务(如,断 )法有用的来实现。实,可解方,如 于量,工实现些。 • 解方法工据数据,机器学习技术有 的。如,机器学习法可以,断不 。 ,如仅用数学、或的到,实现些方法 用机器的学习技术,使用机器学习技术(也不应使用)。 1. 小结 本,介绍了本的机器学习概念和术语,些的。 还介绍了机器学习业数据、处理数据和实现数据可用的库 (NumPy、pandas 和 matplotlib)。,用到的 Python 库,也一 了介绍。 学一,应了解了机器学习技术的实用。应了用的数据 处理方法,将数据为机器学习法可以处理的。一,来家解 的学习法以及如何用 sklearn 库实现。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 1 介绍,学习的的数据发现有的。 数据(数据和的数量)(为), 一何。到,用机器学习技术, 数据的(),或不的数据的( )。本介绍法( 1 部分)和方法( 2 部分)。的不 和的,用实的以。实现些用到 Python 的科学 库。所有可的 GitHub , https://github.com/ai2010/machine_ learning_for_the_web/tree/master/chapter_2/。现开讲法。 2.1 法 法(clustering algorithm),将数据为方的(, cluster),以数据推断有的。可以将为一具有些 的数据。量数据的方法,法的。 据处理数据所使用的量方法或的,可将法分成不的。 来用的方法分方法、心方法、方法和方法 (hierarchical methods)。方法,讲解的一法实现。 分方法。将实的不法的。本的 IPython notebook 本和 Python 本,到的 GitHub 书的文, https://github.com/ai2010/machine_learning_for_the_web/tree/master/chapter_2/。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及38 第2 章 2.1.1 方法数据来分,用法分参数的参数。 法和(Gaussian clustering)。 1最法 法(expectation maximization),用于参数分的, 分于量(量的法到)。法的包括 (E-step),用参数的对数数(log-likelihood function)最 (M-step)到使 E 对数的参数。 一由 N 成的数据 ()ix i = 1,,N,对数为 () () () 11 () log ; log , ; NN iii iiz lpxpxz , 为分的参数, ()iz 所的量。 不 ()iz (法的量)的,到对数的参 数。有一 ()iz 的分,和 ()iz 的概数 Q( ()iz ), () 1 1i i oz 。 () () () () () () ,; ; ; ii iii i px z Qz pz x px 的 Q( ()iz )为量 ()iz ()ix 发生一的概,以 为参数。 法用到了 Jensen 不等,以 () () () () () () () () 1. ; ,; 2. log i iii ii i i i z Qz pz z px z Qz Qz 对数数,到对数,对应的 的。 2法 合法(Mixture of Gaussians),用合的分来数据。 量文为 hidden variable 或 latent variable。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 39 ,的数量由所包的分的数量来。由 N 成的数据 ()ix ,i =1,,N, ()idx R 为合一由 d 成的量, () () () ()() 11 ,,,,, KK iiiii kkk kk px px z kpz k px • ()iz 1,, K 为量, ()ix 由成分(Gaussian component)生 成的 ={ 1 ,, K }为成分的参数。 • ={ 1 ,, K }为成分的方参数。 • k 为合,机的 x(i)由成分 k 生成的概, 1 1 K k k , ={ 1 ,, K }为的合。 • 1() ()1 () 2 /2 1/2 1, (2 ) | Tii kkkxxi kk d k px e 数据 ()ix 对应的以( k , k ) 为参数的成分 k。 合的参数有、 和。为了些参数,可以将数据的对数 数为 () () () () 111 ,, log , log ,, , NNN iiii iii lpx pxzkpzk 用一讲的法参数,参数的对应为 = (, )、 Q( ()iz )=p( ()iz ,)。 参数的不,用的,以到。 (1) 据 理 ()iz 的概, () () (),, ,iii kWpzkx 概方法如 () () () () 1 , ,, , , i kkkii K i lll l px pz kx px u (2)最将参数为如( 3 到的,具 合,文为mixture weight。志的机器学习207 将mixture coefficient,为合数。 者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及40 第2 章 方法数的数为 0,分对 、和到的) () () 1 () 1 N ii k i k N i k i wx w () () () 1 () 1 N Tii i kkk i k N i k i wx x w () 1 N i k i k w N ,由于量 ()iz ,使用法。,为有 学习, ()iz 数据的(使用的有法将 分析)。,合法,到 ()iz ,也数据 ()ix 对 应的 K 成分。实, K 的概 () (),, ,iipz kx , 可以将 ()ix 分到概的 k 。一些应用,法 数据(或数据)务。 实的,来合法可的应用有些。如, 到了的成,有学生的。的成服分, 将成分开,可以用合。一,家 了一数据,家的服分,如何据的数据 断来家,可用法来解。 2.1.2 心方法(centroid methods)用到以技术的心,将数据分到 的,的心和到的数据的。一,到 的心为量,也不数据的数据。方法,的数量参数, 为一。方法生成的,的不,也 的。可到部解,不,到 的有的不。用的心方法为 k 法(Lloyd 法),量方法 文为Gaussian discriminant analysis。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 41 为(Euclidean norm),法。心的方法,用 的(k )或使用实的数据为心。一讲,些方法还有一些 ,的于心的方(k ++或 c )不。 k 法 法据数据的心,使到的数据 到心的。可将解分的 k 法对来,者 。的可以为。(Vo r o n o i d i a g r a m,一据一的, 如的心,将分为不的方法)。数据{ ()ix },i1,,N, 法一心 K。将数据到心()的 为 j ,j1,,K,为 j 机。,以到法。 (1)对于一数据 i, i 心 j 的,心引 di, 使数据和心的| j − ()ix |,j1,,K。 (2)对于一心 j, d_ij 等于 j 的些数据(数据于为 j 的)到心的 , 1 _ 1 () N dj i j N dij i x i 法于以数 () _ 1 N i di i Fx 数的增,数。 F 为数,法到的 为。为了为部,机不的, 法。,使 F 数的一为解方。 2.1.3 方法(density methods)所据的,数据的为不 的(或),的心数据现的。用的方法 基的应用法DBSCAN,用的数据 文为k-means++。 者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及42 第2 章 的可(,方法于法 3 )。有一的, 数据的(于一)—一,的数量 于。一用方法(mean-shift),将数据到 的。由于用核方法,开, DBSCAN 或心方法。方法的于,方法本 的,将数据分成合适,不将的数量为参数, 适合处理的和数量的数据。 一参数法,数据核数的部。所到的 部可以{ ()ix },i = 1,,N 的心,部的数量为的数量。 用实现,数据 ()lx dR 的建 () () () 1 1 liN l d i xxfx KNh h ,h (bandwith)的的,的 f( ()lx ) (也,数据对 f( ()lx )有,可以)。K 为以的核数 • () 1i Rd Kx • () 0, 1, ,iKx i N 核数 K( ()ix )的有 • 2() 2() 2 ix iKx e 核 • 2() () () 3 114 0 ii i xifxKx else Epanechnikov 核 法 f( ()lx ),可以为如等(还,数分 析,数数为 0 到) () () () 1() () () ()0 liN i ill li xxKxhfx x xxK h 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 43 ,K'为核数 K 的数。 ,对等,可以到量 ()ix 对应的部。 () () () 1() () () () () 1 () () liN it ill ll l tt tt tli t xxKxhx xxxmx xxK h ,m( ()l tx )量。t=a , () ()0ll aaf xmx =0 ,法。 有,现可以 2.1 解法。 0 ,t=0, 数据 ()lx ,l1,,N()于数据。量 () () 0 ,llmx mx 1, ,lN ,为的数据, 以法的。 1 ,t=1,用到的到的数据 为一所使用的数据,数据 的,用有+的 数据所处。 2.1 , 0 ,数据用 有的, 2、K ,数 据(分有+和*)由方的 部。 K ,到数据 ()l kx ,l 1,, N,用*的。 ()l kx 所对应的 数 ()l kf x 的于一的数,为 法的的数。 K ,数据对应数据 ()l kx l1,,N,些 数据到 2-1 用方的。 量 ()ix ,l1,,N 不的部,。 合理使用方法,以。 法一的参数 h,参数,到理的分 本书 PDF 文。。者 文为clearly associated with。者 2.1 法,数据的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及44 第2 章 。实来,h ,到的数量, h ,也将不的合 到一。,还,如量的 d ,法也到的 ,为,应部的数量也,数可。 2.1. 方法也于(connectivity-based)的,据量方法, 具有的成的一,的 分到不的。法可分为(divisive clustering)和 (agglomerative clustering)。分,一开将数据分到一,将分到 不()的。分,到的一部分分,到数据 成一。合成用的方法,处,将数据分到一 。,据,将些合,到所有的数据分到一。方 法成了于不的,也为,参 2.2。一, 的方法(dendrogram)。数据的数据,。 一,些或为合为一的。 2.2 2.2,合成方法,一开的数量数据的数量一,到的一包所有 数据的。,分方法,一开有一,到的包一数据。 使用来合成/分,到的分。用 来法合成一的,用来法 合或分的数量。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 45 合成方法的一法如。 (1)将数据 { ()ix },i1,,N 的 i 分到不的,使成一。 (2)所有的,将的合为一,的数 1。 (3)到的和的。 (4)(2)和(3),到到一包所有 N 的。 C1 和 C2 的 d(C1,C2),实,用数据 c1C1,c2C2 的来。对于包数据的,有据数据来。 C1 和 C2 用的如。 • (single linkage)C1 的和 C2 的的为 (1,2)min 1,2:1 1,2 2dC C d c c c C c C • (complete linkage)C1 的和 C2 的的 为 1, 2 max 1, 2 : 1 1, 2 2dC C dcc c C c C 法(UPGMA)或(average linkage)C1 的和 C2 的 的为 112212 11, 2 1, 2 cCcCcc dC C dccNN ,,| 1cN |、| 2cN |分 为 C1、C2 的数量。 • Ward 法将不增(heterogeneity)的合。的, 增 variation measure 的,合 C1 和 C2 。variation measure ∆合,用 (C1,C2)。对于法,为合,如 212 121 2 11 2 212 1 2 111, 2 1, 2cc ccc c cC c Ccc c c NNCC c cNN NN ,| 1cN |、| 2cN |分为 C1、C2 的数量。 实现法,d(c1,c2)有不的量方法,用的 21, 2 1 2ii i dcc c c 方法方来讲不,不适合数据。 ,为的数据(),不,也合。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及46 第2 章 方法的和 生成一数据,介绍的方法。为 1 = [10,0]和 2 = [0,10],方为 12 3 1 1 4 的分,机数据成数据。 用 NumPy 库生成数据,用 matplotlib 库。 from matplotlib import pyplot as plt import numpy as np np.random.seed(4711) # for repeatability c1 = np.random.multivariatenormal([10, 0], [[3, 1], [1, 4]], size=[100,]) l1 = np.zeros(100) l2 = np.ones(100) c2 = np.random.multivariatenormal([0, 10], [[3, 1], [1, 4]], size=[100,]) #add noise: np.random.seed(1) # for repeatability noise1x = np.random.normal(0,2,100) noise1y = np.random.normal(0,8,100) noise2 = np.random.normal(0,8,100) c1[:,0] += noise1x c1[:,1] += noise1y c2[:,1] += noise2 fig = plt.figure(figsize=(20,15)) ax = fig.addsubplot(111) ax.setxlabel('x',fontsize=30) ax.setylabel('y',fontsize=30) fig.suptitle('classes',fontsize=30) labels = np.concatenate((l1,l2),) X = np.concatenate((c1, c2),) pp1= ax.scatter(c1[:,0], c1[:,1],cmap='prism',s=50,color='r') pp2= ax.scatter(c2[:,0], c2[:,1],cmap='prism',s=50,color='g') ax.legend((pp1,pp2),('class 1', 'class2'),fontsize=35) fig.savefig('classes.png') 为分了服分的,使来实。如 2.3 所。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 47 2.3 、服分的 用 sklearn 和 scipy 库实现方法,用 matplotlib 库 import numpy as np from sklearn import mixture from scipy.cluster.hierarchy import linkage from scipy.cluster.hierarchy import fcluster from sklearn.cluster import KMeans from sklearn.cluster import MeanShift from matplotlib import pyplot as plt fig.clf()#reset plt fig, ((axis1, axis2), (axis3, axis4)) = plt.subplots(2, 2, sharex='col', sharey='row') #k-means kmeans = KMeans(nclusters=2) kmeans.fit(X) predkmeans = kmeans.labels plt.scatter(X[:,0], X[:,1], c=kmeans.labels, cmap='prism') # plot points with cluster dependent colors axis1.scatter(X[:,0], X[:,1], c=kmeans.labels, cmap='prism') axis1.setylabel('y',fontsize=40) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及48 第2 章 axis1.settitle('k-means',fontsize=20) #mean-shift ms = MeanShift(bandwidth=7) ms.fit(X) predms = ms.labels axis2.scatter(X[:,0], X[:,1], c=predms, cmap='prism') axis2.settitle('mean-shift',fontsize=20) #gaussian mixture g = mixture.GMM(ncomponents=2) g.fit(X) predgmm = g.predict(X) axis3.scatter(X[:,0], X[:,1], c=predgmm, cmap='prism') axis3.setxlabel('x',fontsize=40) axis3.setylabel('y',fontsize=40) axis3.settitle('gaussian mixture',fontsize=20) #hierarchical # generate the linkage matrix Z = linkage(X, 'ward') maxd = 110 predh = fcluster(Z, maxd, criterion='distance') axis4.scatter(X[:,0], X[:,1], c=predh, cmap='prism') axis4.setxlabel('x',fontsize=40) axis4.settitle('hierarchical ward',fontsize=20) fig.setsizeinches(18.5,10.5) fig.savefig('compclustering.png', dpi=100) ,为 k 数和合为的数量(n_clusters=2、 n_components=2),将法的为 7(bandwidth=7)。法使 用 Ward 来,法的(Ward ) max_d, 为 110。fcluster 数数据于。k 和方法的 用 labels_到,合使用 predict 数。k 、 和合方法用 fit 数,法用 linkage 数。 2.4。 2.4 ,和方法将数据分成,的参数( 和)合适。的,方法,据生成的, 来一参数的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 49 truncate_mode='lastp'可将合成( p=12)。 2.4 , 100 到 135 ,。 2.4 用 k 、、合和法(Ward )对数据 from scipy.cluster.hierarchy import dendrogram fig = plt.figure(figsize=(20,15)) plt.title('Hierarchical Clustering Dendrogram',fontsize=30) plt.xlabel('data point index (or cluster index)',fontsize=30) plt.ylabel('distance (ward)',fontsize=30) dendrogram( Z, truncatemode='lastp', # show only the last p merged clusters p=12, leafrotation=90., leaffontsize=12., showcontracted=True, ) fig.savefig('dendrogram.png') 2.5 ,(括的数), 12 合,所 包的数据数量。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及50 第2 章 2.5 12 合的 合, 3 法将一些数据分,一 k 和 方法现为。实,合的方法,为数据所 的分的。为了方法的,scikit-learn 了量分(partition) 的方法v-measure、和。些方法用到数据的实, 也为部机,用到用不到的。 h (homogeneity)介于 01,量的包一的数据。 c 的介于 01,量的一的所有数据分到一。 ,将数据分到不的,包一,为 1, 包一数据,,为将一的数据分 到了。,如将分于的数据分到一, 为 1,。的,如所 1,1ll l HCCHCC hcHC HC 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.1 法 51 • 务,H(Cl|C)为 Cl 的 11 log lCC pc pc l pc c NNHCC NN • 的所,H(C|Cl)为的 11 log lCC pc pc l pc p NNHCC NN • H(Cl)为的 1 log lC p p l p NNHC NN • H(C)为的 logccNNHC NN • pcN c 为 p 的数据数量, pN 为 p 的数据数量, cN c 数 据数量。 v-measure 为和的和数 2 hcv hc 些量的方法,使用数据的,实不到。 一方法(silhouette cofficient),仅使用法用到的数据。 的数据数据和数据的。如来, 数据数据来,的数据,的分理, ,数于 1(,于-1)。数据 i 和量,来 的 • sd (i)为数据 i 数据的 • restd (i)为数据 i 数据的。 ,数可以为 () ()() (), () rest s srest didisi max d i d i ,数为所有数据数 s(i)的。 ,用 sklearn(scikit-learn) 4 法的 4 from sklearn.metrics import homogeneitycompletenessvmeasure from sklearn.metrics import silhouettescore res = homogeneitycompletenessvmeasure(labels,predkmeans) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及52 第2 章 print 'kmeans measures, homogeneity:',res[0],' completeness:',res[1],' v-measure:',res[2],' silhouette score:',silhouettescore(X,predkmeans) res = homogeneitycompletenessvmeasure(labels,predms) print 'mean-shift measures, homogeneity:',res[0],' completeness:',res[1],' v-measure:',res[2],' silhouette score:',silhouettescore(X,predms) res = homogeneitycompletenessvmeasure(labels,predgmm) print 'gaussian mixture model measures, homogeneity:',res[0],' completeness:',res[1],' v-measure:',res[2],' silhouette score:',silhouettescore(X,predgmm) res = homogeneitycompletenessvmeasure(labels,predh) print 'hierarchical (ward) measures, homogeneity:',res[0],' completeness:',res[1],' v-measure:',res[2],' silhouette score:',silhouettescore(X,predh) The preceding code produces the following output: kmeans measures, homogeneity: 0.25910415428 completeness: 0.259403626429 v-measure: 0.259253803872 silhouette score: 0.409469791511 mean-shift measures, homogeneity: 0.657373750073 completeness: 0.662158204648 v-measure: 0.65975730345 silhouette score: 0.40117810244 gaussian mixture model measures, homogeneity: 0.959531296098 completeness: 0.959600517797 v-measure: 0.959565905699 silhouette score: 0.380255218681 hierarchical (ward) measures, homogeneity: 0.302367273976 completeness: 0.359334499592 v-measure: 0.32839867574 silhouette score: 0.356446705251 对 4 法分析一,合、和 v-measure (于 1)法还(为 0.5) k 和 方法(为 0.3)。,方法的数理(0.350.41), 到的,合理的。 2.2 也,将数据为的数据的。到 的应仅包数据的,技术分为和。 用技术,数据,,的。 的法(PCA)将数据以到不的 。来介绍法。一的 IPython 和 Python 到 者 GitHub 书文https://github.com/ai2010/machine_learning_for_the_web/tree/ 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.2 53 master/chapter_2/。 (PA) 成分分析法数据所的。实,由于些数据 的数据, PCA 的有、数据不的,的。 如,可以用一量来,如用 km/h 或 m/s 的、用 的、用开或的。,可以对些 ,为不的量或量的(量),应的 可以由不的成(量和 量)。PCA 不仅不量,还方的 。也,对于用 km/h 和 m/s 的, 法方的量, 的为 velocity[km/h]=3.6*velocity[m/s],数 2.6(数的 km/h , 为1km/h=3.6m/s)。 km/h 的(projection) m/s 的分)。 2.6 为用 m/s 和 km/h 的者为 数。数据 km/h 的方, m/s 的方。 velocity [km/h]= 3.6*velocity[m/s]分的数据的方于的方。 有了,现可以方法及。不,方 的不等于以。,有量 ()ix ,l1,,N • 数据的 () 1 1 N i i xN • 发生到的数据 () () ,1,,iiux i N • 的数据,量的分量 ()i ju 以 () ()/ii j jjuu , 1/21 2() 1 N i jj iN x 括的数为 1/N。者 2.6 用 m/s 和 km/h 的 的数 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及54 第2 章 • 本的方 () () 1 1 1 N Tii i uuN • k 的(eigenvalue) i ,i1,,k,以及应的量(eigenvector) ()iw ,i1,,k。 • 到由 k 量成的的量 () ()iTikvWuR, ,W=[ 1 kww ] NxkR N k 的量。 ,的量(成分) ()lv 于 kR ,量的方 (和)。 处理数据,如部务,PCA 技术有用。对于部务, 对的和数据库的,以到的。用 PCA 实现的 Eigenfaces ()应用,用量的一实现。如, 处的()的,可以用方法,的, 可以。者的 GitHub 了 Eigenfaces 的一实现方, https://github.com/ai2010/eigenfaces。 PCA 讲解 PCA 和 NumPy 库的用法,者 1 介绍。的务 数据的成分。数据的数据 y=2x 分,包一些机( 分)的。数据及( 2.7)用以生成 import numpy as np from matplotlib import pyplot as plt #line y = 2*x x = np.arange(1,101,1).astype(float) y = 2*np.arange(1,101,1).astype(float) #add noise noise = np.random.normal(0, 10, 100) y += noise fig = plt.figure(figsize=(10,10)) #plot plt.plot(x,y,'ro') plt.axis([0,102, -20,220]) plt.quiver(60, 100,10-0, 20-0, scaleunits='xy', scale=1) plt.arrow(60, 100,10-0, 20-0,headwidth=2.5, headlength=2.5, fc='k', 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.2 55 ec='k') plt.text(70, 110, r'$v^1$', fontsize=20) #save ax = fig.addsubplot(111) ax.axis([0,102, -20,220]) ax.setxlabel('x',fontsize=40) ax.setylabel('y',fontsize=40) fig.suptitle('2 dimensional dataset',fontsize=40) fig.savefig('pcadata.png') 2.7 生成的数据。,数据一方分,对应的 数据的成分 lV 。 2.7 数据。成分的 vl 方用 法数据的和到数据的,用应的 数据的 meanx = np.mean(x) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及56 第2 章 meany = np.mean(y) ux = (x- meanx)/np.std(x) uy = (y-meany)/np.std(y) sigma = np.cov([ux,uy]) 为了成分,和量,的量 eigvals, eigvecs = np.linalg.eig(sigma) eigpairs = [(np.abs(eigvals[i]), eigvecs[:,i]) for i in range(len(eigvals))] eigpairs.sort() eigpairs.reverse() v1 = eigpairs[0][1] print v1 array([ 0.70710678, 0.70710678] 为了成分分,将 xv1 = v1[0]*np.std(x)+meanx yv1 = v1[1]*np.std(y)+meany print 'slope:',(yv1-1)/(xv1-1) slope: 2.03082418796 到为 2,一开的数一。scikit-learn 库了一 的 PCA 法实现,数据或。使用 sklearn , 将的数据为,的一为用 x、y 的数据 X = np.array([ux,uy]) X = X.T print X.shape (100,2) 现可以 PCA ,成分数量(将为 1) from sklearn.decomposition import PCA pca = PCA(ncomponents=1) pca.fit(X) v1sklearn = pca.components[0] print v1sklearn [ 0.70710678 0.70710678] 用方法到的成分[ 0.70710678 0.70710678]一到的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及2.3 SVD 57 ,的也。现,可以用方法将数据到的一 #transform in reduced space Xredsklearn = pca.fittransform(X) W = np.array(v1.reshape(2,1)) Xred = W.T.dot(X.T) #check the reduced matrices are equal assert Xred.T.all() == Xredsklearn.all(), 'problem with the pca algorithm' assert 断言语有,方法的一。 2.3 SD 方法于理 X dxN 可以分解为 TXUV • U 一 dxd 的。 • 一 dxN 的对,对 i 。 • V 一 NxN 。 ,X 由量 ()ix i1,,N 成, ()ix dR 一。可以 量的数 d,分解。实,考的 1 , t , t= < >= < >= < >= < >= 0 11 14 32 7 20 29 12 78 0 0 89 21 33 13 60 10 49 22 0 I( () 0 hx , 0) 0.5 0.99 0.85 0.76 0.76 ,一的为 0() 0 1, , ,58h jhN targminIxj 。可以的方 1 0t 、 2 0t 和 3 0t 的。成,可以 4 的 不,以 1 的分, 3.3。 3.3 () 0 tx < 0 0t 0 0 () 0 tx < 1 0t 21 32 j=0 () 0 tx 1 0t 11 89 j=1 () 0 tx 1 0t 11 36 不I( 0 0t ,0)=0.5 不I( 1 0t ,1)=0.88 () 0 tx < 2 0t 48 5 () 0 tx < 3 0t 39 3 j=2 () 0 tx 2 0t 1 46 j=3 () 0 tx 3 0t 45 13 不I( 2 0t ,2)=0.31 不I( 3 0t ,3)=0.60 , 0 处,分为 0123 2 0000000,1,2,3 ,,0,,1,,2,,3,2q j tq argminIt It It It t 也为 2 0t 的。可以,使用的方法, 的分,到。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及70 第3 章 学习,处理数据,的不,数量 (NM)。到,建使用的,或使用技术。一 分所数据数量,或的数量,有于现合 (overfitting)。法可生成于的可用(pruning)技术, 不量的分。技术有,了本书的讲解。, 还可以,成所的(random forest)。机法, 数据机一部分数据一,的学习,也使用机 的。,的为分 ,数服数。 3. (Support Vector Machine,SVM),法何将数据 ()tx i1,, N 分成为 iy =+1 和 iy =-1 的。 3.3 ,数据分成(心 和实心),也由实的(或)将分开( ,有分的数据) 3.3 实()将数据分为(心和实心) 用数学语言可为等 w⋅x + b = 0, bx w 为的,w 为的法。量机法的,数据到的。实 ,仅考、量的数据 i。于 1H 和 2H ,的分为 1d 和 2d 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.5 71 H1 w⋅ ()ix + b = +1, iy =+1 --------(1) H2 w⋅ ()ix + b = 1, iy =1 --------(2) 的(margin), 12dd ,,量机方 法的使的 w 和 b 的。 为 1H 和 2H 的为 2 w ,所以为 1 w ,量机法等于解如 2 ()1 such that , 1 0 1,..,2 i imin w y w x b i N 为了使用方法解数学,了方和 1/2。, 使用法将为如数, i >0 为 1122() 00 11122 NN i ii ii ii Lw yxwb w y 1 () 0 N i i i xwb 分对|w|和|b|数,数为 0,到 -1 () 0 N i ii i wyx (3) -1 0 0 N ii i y (4) 的数为 11 0, 0 1 00,..,1,02 NN di iijji ii iij i LHiNy , () ( )ij ij i jHyyxx。 为的对,到 i 的可 11 0, 0 1 00,..,1,02i NN iiijji ii iij i max H a i N y 用方法 s >0 sS( i =0 ,量)。用(3)量 w ()s ss sS wyx (5) s 以等(合(1)和(2)) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及72 第3 章 () 1s sywxb 将 w 为(3),以 sy (+1 或-1),到 () ()ms smm mS by yxx 所有量 Ns 的,对参数 b 的 () ()1 ms smm sS mS byayxxN (6) 据(5)和(6)到了量机法的参数。,可以用些参 数的量机数据 t 的 () () 11 11 t t t t xwb y xwb y 如一法将所有数据分到,数据以的 i >0 分, () () 11 11 t it t it xwb y xwb y ,以将数据分的。可以为 12 () 0 1 such that 1 0 1,..,2 N i ii i i min w C y w x b i N ,参数 C 用来分的(C=0 有分的, C>1,数据分,)。使用的方法,可将 为有的对,以 C 为 1 1 0, 0 1 ,00,..,1,02i N N iiijji ii iij i max H C i N y 到为,处理的分。实的分,也有,用 量机处理的分,用的方法(对数一讲)有一对 或一对一。包 M 的分方法一, M SVM ,为 j +1,-1。方法,分为 i 和 j 一, (1) 2 MM 。,方法开,也为。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.5 73 ,SVM 也可用于 iy 介于-1 到 1 的。,法的参数 w 和 b,使 ()i iywxb 实 it 可不于 iy 的为。的, 还一 i 或 i 的,具于 iy 于还于 it 。 3.4 , 数据 i 的 iy 实 it 的,还。 3.4 iy 分实 it 的 为 12 0 1 2 N ii i min w C ,,0,0,..,1ii iii ii ity ty i N 不,应的对为 11 , 00, 1 0 1 subject 2 to , 0 0,.., 1, 0 ii NN ii iii ii iijj iiij N ii i i i max t x x CiN , i 、 i 为。 py 可用 1 0 N ip pii i yxxb ,参数 b 的方法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及74 第3 章 S 的 C> s 、 s >0 和 s 、 s =0 的量解, 1 ms smmm sS mSs bt yxxN 有些数据的不可分,到合适的,可用合理将 数据分成或。如 3.5 所的 3.5 的数据不可分,到,为可分 3.5,()不可分的。如对数据应用核 数 K,使 2 2 , 2, ijxx ijKx x e 现可以用()将数据分开。SVM 法的核数用于 ijH 的, 用核数量 i、j 的 ,ij ij ij i j ij i jHyyxx HyyKxx 文为averaging on the subset S given by the support vectors associated with the subset C>αs +,αs ->0 andi +, i −=0。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.6 方法的 75 SVM 法用的核数有 • 核 ,ij i jKx x x x • (Radial Basis Kernel,RBF)核 2 22, ijxx ijKx x e • 核 , bij i jKx x x x a • Sigmoid核 ,tanhij i jKx x axx b 3.6 方法的 来解一和一分,以本的方法。 为了合,数据分为部分,到合的参数, 的。,也还有使用 3 合,参数 (hyperparameter,如 SVM 的 C 和、的 α)。数据也,分成 不合适。,法的也到、和所用的数据的 。,用的解方法,用方法将数据分成 k (),如。 • 用 k-1 数据为数据。 • 用数据到的。 • 以 k (一开的数),用 k-1 数据( 使用的也不)。对 k 到的,到的。 3.6.1 合数据法的,数据可 http://archive.ics.uci.edu/ml/datasets/Housing 和者 GitHub 本的文 (https://github.com/ai2010/machine_learning_for_the_web/tree/master/chapter_3/)。一部分的 也可文到。数据有 13 。 • CRIM • ZN 2.5 方,的用的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及76 第3 章 • INDUS用于业务的 • CHAS,量(为 1为 0) • NOX的(分一) • RM所有的数 • AGE建于 1940 的业 • DIS 5 业心的 • RAD的数 • TAX$10000 , • PTRATIO生 • B1000(Bk - 0.63)^2, Bk 为的 • LSTAT的,的 MEDV(以$1000 )。 为了的量,的方和数 2R (coefficient of determination)。 2R 的为 112 2 00 1 2 0 1, NN pred ii i ii N i i yy y RyNyy , 1 predy 的。 合数据, 2R =1,的到。 2R =0 ,为一 等的(如为数,合)。 , 、 、 和 SVM ,的方和数,用到了 sklearn 库 (IPython notebook 文 https://github.com/ai2010/machine_learning_for_the_web/tree/ master/chapter_3/)。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.6 方法的 77 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及78 第3 章 用 pandas 库数据,用 df.iloc[np.random.permutation(len(df))]数据的, 使用方法,数据机的(使用 10 )。法的 如 机法(50 )的对数据的合的数 为 0.86,MSE=11.5。合,的 2R 机,MSE 机 (分为 0.67 和 25)。核为 rbf(C=1,=0.2)的量机 的, MSE 83.9,R2 为 0.0。核 SVM 一的( 2R 和 MSE 分为 0.69 和 25.8)。 和 , 不 , 2R 和 MSE 分为 0.7 和 24。的一方法。为所有,有 一部分适用于,也对的 2R 有何。也 2R ,为将用的数据,也应(考 的)。 为,方法有,将法(Recursive Feature Elimination,RSE),具有对的,到的数量为。SVM 法, w 的,法,为的参数 。来用 sklearn 的 数 RFE,仅用 4 (best_features)来的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.6 方法的 79 为 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及80 第3 章 RFE 数(用 RFE 数的 support_到), 了 些 (为 true)和有些(为 false)。用的所讲的。 使仅使用 4 ,由 50 成的机法,的 2R 于 用部到的(0.82 和 0.86 的)。、、和 SVM 的 2R 机有的,用部到的, 可。,由于 KNN 法不为,法使用 REF 方法。 3.6.2 用量(inaccurate、accurate、good 和 very good)数据,本学 习的分器。数据有 6 的(的、成本、 数量、核数、和)。数据可以 http://archive.ics.uci.edu/ ml/datasets/Car+Evaluation 或的 GitHub 本文,也到了 (https://github.com/ai2010/machine_learning_for_the_web/tree/master/chapter_3/)。用 (precision)、(recall)和 f 法的。一包( 和)的数据,将为的数据为(true positive,tp), 为的为(false positive,fp),为的为(false negative,fn)。有了以,可以、和 f 的 2 tpPrecision tp fn tpRecall tp fn precision recallfmeasure precision recall 分,对于 C 言,(1.0)分到 C 的数据实于 C(不 C 数据分),为 1.0 C 数据分到 C (不 数据分到 C )。 分,有,些量。将一 ,。对不的分,以来 、和 f 。 书有,实为 = + tpPrecision tp fp 。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.6 方法的 81 为数据分如。,所有的库,将数据为 pandas 的DataFrame 对。 ,为 buying 0 v-high, high, med, low maintenance 1 v-high, high, med, low doors 2 2, 3, 4, 5-more persons 3 2, 4, more lugboot 4 small, med, big safety 5 low, med, high car evaluation 6 unacc,acc,good,vgood 将些为分法使用的数 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及82 第3 章 为和所有方法分的量,为一数 CalcMeasures,将量 Y 和量 X 分开 用 10 ,如 将分法的 f 、和 3 的量到 DataFrame 对 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.6 方法的 83 、分法, 4 car evaluation有不的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及84 第3 章 ,。如和引的对 DataFrame 的。 'acc': 0, 'unacc': 2, 'good': 1, 'vgood': 3 以可,为 rbf 核(C=50)SVM,机(50 )和 的分也(对于以 4 , 0.9 )。、 对数和核(C=50)SVM 的现,对于 accurate、good 和 very good 3 ,、和 f 3 不理,为有数数据 有以 分来,very good(vgood)和 good 分为 3.993% 和 3.762%,accurate 为 22.222%, inaccurate 为 70.0223% 。可以的些法不适合 数据的。 3. 来讲,方法不有学习法,也可以处理分的 ,讲一讲方法。为了理解,合一来讲。如, 推,的(、、一, Oi 分 0、1 和 2),( si i0,1)。如到的 O= 01234,,,,,OOOOO , 为 0, 1, 0, 2,,推断的 t、t+1 (推 ), Si 的 A 0.7 0.3 1, , 1 0.6 0.4 iijiji j j A aaaPsattsatt • A 的 ija t 的 iS ,t+1 于 Sj 的概。, 0.3( 01a )推 t ,t+1 不的概,0.6( 10a )不 、的概,0.7( 00a ) t、t+1 的概,0.4( 11a ) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.7 85 t 的,t+1 不的概。,还可以 B,将和 3 可的为来 0.7 0.1 0.2 1, | 0.1 0.6 0.3 jj j j BbkbkbkPkattsatt B 的 ()j kb , t 的 js ,t 到 k 的概。如,0.7( 00b )、 0.1( 01b )和 0.2( 02b )分,到推以为,的概、 和一。和 3 为的如 3.6 所 3.6 推为包的可 推的分,可以为 =[0.6,0.4](0 1 ,的可 一些)。, 、A、B 为机(row stochastic),和为 1, 有。(Hidden Markov Model,HMM)由 3 成(λ=(, A, B)),的 O= 01 1,,,TOO O 和应的 S= 01 1,,,TSS S 的。法使用如 • T 为 01 1,,,TOOO O 、 01 1,,,TSSS S 的长 • N 为可()的数量 • M 为可的数量Ok , k0,1,,M-1 • A 为 发概。B 的,为。,B 的 0 ,为 1 为不。 0 , 1 , 2 一。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及86 第3 章 • B 为概 • 为的概分。 推有有,M=3、N=2。如据到的推的 为 01 1,,,TOOO O ,讲 01 1,,,TSS S 有有。可以 S 的概,可的 00 011 21 101 1... TT Tss sss ss s TPS bOabO a b O 如, T=4、 S=0101 和 O=1012 6(0101) 0.6(0.1)(0.3)(0.1)(0.6)(0.1)(0.3)(0.3) 9.722 10p 理,可以所有合的概,可的 S。Viterbi 法可 S。的 0 到 t(一到 T-1 ) 的部(partial sequence)的概。实应用,以量 • 00()iibO i0,,N-1 • 对于 t=1,,T-1 和 i=0, ,N-1,来 j 的所有可,t i 的 概 11,.., 1 maxtTjiitjN iabO 。 ()t i 的对应的部 0 到 t 可的部。 • 可的为 T-1 概的 1()T i 。 如,,长为 T=2 的、可的方法如 • P(10)=0.0024 • P(00)=0.0294 1(0)=P(00)=0.0294 • P(01)=0.076 • P(11)=0.01 1(1)=P(01)=0.076 可的 00()。 S=0101 ,不,,不。O=1012 ,,,一。 p(0101)的,8 概一来的概,的概、不的概、不的 概、不的概、的概、不的概、不一的概。者 P(10)、P(01)和 P(11)3 有。者了,。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.7 87 一可的方法,的数量也, t, i 的概到 max ( ( ))t i Yi 。可以用法(backward algorithm) i 的概 ()tYi tt t iiYi PO • 1 1 0 N T i P Oi • 000,.., 1iiibOiN和 1 1 0 N ttjiit j ijabO 到 t,HMM t 于 i,部的概 t iP 0,. ,., ttOOsi • 1 11 0 N tijjtt j iabOj t , 1 1 1, , 1T ii N t 为 i,t 到 T-1 ,部的概 11,, ,ttttiPOOSi • 合 t 于 i 的概, tt t ai iYi PO ,以可的方法所到的不一。 的 01 1,,,TOOO O 和参数 N、M,的 HMM λ=(, A, B)可以用 Baum-Welch 法解。t 于 i,t+1 j 的概为 11 1,,,tijjtt ttt iab O jYij Ps is jO PO , 1 0 , 0,, 2 N tt j Yi YijforT T 1 1 T TYi PO 。 Baum-Welch 法如 • λ=(, A, B) • ()t i 、 ()t i 、 (, )tYij和 ()tYii0,, N-1 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及88 第3 章 • 的 21 00 0 21 00 , ,, , TT ttkt tt ij j kTT tt tt Yij ooYj iYia bO Yij Y j ,i,j0, , N−1k0, , M−1 ij 为(Kronacker symbol), i=j ,为 1,为 0。 • 到 1 1 0 N T t P Oai 一,讲解如何用 Python 实现些, HMM 法的。 HMM 的 Phon 的 hmm_example.py 文可 https://github.com/ai2010/machine_ learning_for_the_web/tree/master/chapter_3/。 一, HMM 的 3 。 class HMM: def init(self): self.pi = pi self.A = A self.B = B Viterbi 法和用以数实现 def ViterbiSequence(self,observations): deltas = [{}] seq = {} N = self.A.shape[0] states = [i for i in range(N)] T = len(observations) #initialization for s in states: deltas[0][s] = self.pi[s]*self.B[s,observations[0]] seq[s] = [s] #compute Viterbi for t in range(1,T): deltas.append({}) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.7 89 newseq = {} for s in states: (delta,state) = max((deltas[t-1][s0]*self.A[s0,s]*self.B[ s,observations[t]],s0) for s0 in states) deltas[t][s] = delta newseq[s] = seq[state] + [s] seq = newseq (delta,state) = max((deltas[T-1][s],s) for s in states) return delta,' sequence: ', seq[state] def maxProbSequence(self,observations): N = self.A.shape[0] states = [i for i in range(N)] T = len(observations) M = self.B.shape[1] # alphat(i) = P(O1 O2 ... Ot, qt = Si | hmm) # Initialize alpha alpha = np.zeros((N,T)) c = np.zeros(T) #scale factors alpha[:,0] = pi.T * self.B[:,observations[0]] c[0] = 1.0/np.sum(alpha[:,0]) alpha[:,0] = c[0] * alpha[:,0] # Update alpha for each observation step for t in range(1,T): alpha[:,t] = np.dot(alpha[:,t-1].T, self.A).T * self.B[:,observations[t]] c[t] = 1.0/np.sum(alpha[:,t]) alpha[:,t] = c[t] * alpha[:,t] # betat(i) = P(Ot+1 Ot+2 ... OT | qt = Si , hmm) # Initialize beta beta = np.zeros((N,T)) beta[:,T-1] = 1 beta[:,T-1] = c[T-1] * beta[:,T-1] # Update beta backwards froT end of sequence for t in range(len(observations)-1,0,-1): beta[:,t-1] = np.dot(self.A, (self.B[:,observations[t]] * beta[:,t])) beta[:,t-1] = c[t-1] * beta[:,t-1] norm = np.sum(alpha[:,T-1]) seq = '' for t in range(T): 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及90 第3 章 g,state = max(((beta[i,t]*alpha[i,t])/norm,i) for i in states) seq +=str(state) return seq 由于概的法可数,所有的 ()t i 、 ()t i i0, , N-1 以 了一数 • 0 1 0 0 1 () N j c j • 1 111 0 1 0 1 () () () ( ) N ttttjiitN j tjiit j cicabO ja b O , 00() ()ii 现,可以用推的 HMM ,用 的数可的 pi = np.array([0.6, 0.4]) A = np.array([[0.7, 0.3], [0.6, 0.4]]) B = np.array([[0.7, 0.1, 0.2], [0.1, 0.6, 0.3]]) hmmguess = HMM(pi,A,B) print 'Viterbi sequence:',hmmguess.ViterbiSequence(np.array([0,1,0,2])) print 'max prob sequence:',hmmguess.maxProbSequence(np.array([0,1,0,2])) 为 Viterbi: (0.0044, 'sequence: ', [0, 1, 0, 0]) Max prob sequence: 0100 ,方法的。使用的,法 也不的。到的为(、、、一) 可对应推(、有、、)的概为 0.0044。 和参数 N、M ,也可以实现 Baum-Welch 法,的 HMM 。如 def train(self,observations,criterion): 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.7 91 N = self.A.shape[0] T = len(observations) M = self.B.shape[1] A = self.A B = self.B pi = copy(self.pi) convergence = False while not convergence: # alphat(i) = P(O1 O2 ... Ot, qt = Si | hmm) # Initialize alpha alpha = np.zeros((N,T)) c = np.zeros(T) #scale factors alpha[:,0] = pi.T * self.B[:,observations[0]] c[0] = 1.0/np.sum(alpha[:,0]) alpha[:,0] = c[0] * alpha[:,0] # Update alpha for each observation step for t in range(1,T): alpha[:,t] = np.dot(alpha[:,t-1].T, self.A).T * self.B[:,observations[t]] c[t] = 1.0/np.sum(alpha[:,t]) alpha[:,t] = c[t] * alpha[:,t] #P(O=O0,O1,...,OT-1 | hmm) PO = np.sum(alpha[:,T-1]) # betat(i) = P(Ot+1 Ot+2 ... OT | qt = Si , hmm) # Initialize beta beta = np.zeros((N,T)) beta[:,T-1] = 1 beta[:,T-1] = c[T-1] * beta[:,T-1] # Update beta backwards froT end of sequence for t in range(len(observations)-1,0,-1): beta[:,t-1] = np.dot(self.A, (self.B[:,observations[t]] * beta[:,t])) beta[:,t-1] = c[t-1] * beta[:,t-1] gi = np.zeros((N,N,T-1)); for t in range(T-1): for i in range(N): gammanum = alpha[i,t] * self.A[i,:] * 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及92 第3 章 self.B[:,observations[t+1]].T * \ beta[:,t+1].T gi[i,:,t] = gammanum / PO # gammat(i) = P(qt = Si | O, hmm) gamma = np.squeeze(np.sum(gi,axis=1)) # Need final gamma element for new B prod = (alpha[:,T-1] * beta[:,T-1]).reshape((-1,1)) gammaT = prod/PO gamma = np.hstack((gamma, gammaT)) #append one Tore to gamma!!! newpi = gamma[:,0] newA = np.sum(gi,2) / np.sum(gamma[:,:-1],axis=1). reshape((-1,1)) newB = copy(B) sumgamma = np.sum(gamma,axis=1) for obk in range(M): listk = observations == obk newB[:,obk] = np.sum(gamma[:,listk],axis=1) / sumgamma if np.max(abs(pi - newpi)) < criterion and \ np.max(abs(A - newA)) < criterion and \ np.max(abs(B - newB)) < criterion: convergence = True; A[:],B[:],pi[:] = newA,newB,newpi self.A[:] = newA self.B[:] = newB self.pi[:] = newpi self.gamma = gamma ,用到了 copy 的方法,建的器的对 对(pi、B) 的 引 用 。newpi 和 pi 不的对, newpi[0] pi[0]的引用。 还用 NumPy 的 squeeze 数,了的。 O=0,1,0,2,对应的 0.0 1.0 1.0 0.0 0.0[1.00.0], ,1.0 0.0 0.0 0.38 0.62AB ,以推开,和不 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及3.8 93 。推讲(或不),一,,, 一。 的 HMM ,量,实应用, iO 由成的量。HMM 法用来分,有, HMM il ,概的 P(O| i )。,如一 机,一推。推所的() iO ,可以3 , ie 有 3 可的(、或一)3 , iv 有 3 可的(、或适)3 部, ih 有 可的(或)。, iO 可为 (,, )iiiiOevh 。, 。使用 Baum-Welch 法,用 HMM 0 。, ,用 1 。,推所的 O, P(O| 0 ) 和 P(O| 1 ),概的为。 HMM 法用于,语、和为 现。 3. 小结 本,了的分和法及实现方法。应理解方 法的使用,如何用 Python 语言和库(sklearn 和 pandas)实现些方法。 一,将介绍用的 Web 数据挖掘技术, Web 数据学习的方法。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 Web 数据挖掘技术适用于的数据,。 ,,用到法,本讲解些法。引擎,到 (search query),分析的数据,到的。的 数据分为和到的。一言,引擎由以部 成 • 的 Web 或 • 和处理的解析器 • 将为数据的引器 • 据文档的,的文档 • 以有的方,的法。 些部的核心技术为 Web 挖掘和 Web 挖掘。 引擎的 Web 、引器和机,处理的 Web 的(文本成的 )。引擎的部分(解析器和)为 Web 分析方法,为解析 ,的文本。 一来讲,对于到的,可以用语言处理技术分析的 ,如使用(Latent Dirichlet Allocation,LDA)、挖掘或感 分析工具。些技术适用于 Web 发的法。 、的商业应用,到的。本将些感分析技术。 现,来 Web 挖掘。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.1 Web 95 4.1 结 一 Web 挖掘技术,有务,一如何发现的,如何 用。务一,用,将到的和 到引器。务,的,。 .1.1 e 一 URL()开,些,。 ,到的。一,到的为。 的 URL frontier 。据使用,可将法分为 不的,如(breadth-first)和有(preferential)的。 法,一的 URL 来于 frontier 的部,的 URL 到 frontier 的部。有的,用的方法,的 URL ,以 。用解析器。Web 挖掘一介绍。 本一法,,的, 可以的数量(的)、的数量或等。, 感兴趣的(如 hub 和 authority)一部分。 包量的,的 URL 现(可量 的)。用 Scrapy 。Scrapy 库用,用 Python 实现的,用发机(用 Twisted 框架实现)处理。Scrapy 的使用 7 推荐 Web 应用,用。 .1.2 器 引器一方,将到的到数据库,于 据的。的引方法所有,,包 (的成部分)的所有文档。,如(实应用实如), 由于开,不可。用的的方法 inverted index scheme,为数引擎所用。 一 p1, , pk 和包现的所有 wiV 的 V,将及 有的对应来,成如的wi:idp1, idp3, , wi: idp2, idp7,将 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及96 第4 章 Web 的来,成引数据库。 , jpid j 的。,还可以的,如 的数或的。为了本书的,介绍了些 概念。引器的具实现,了本书的讲解。 ,由成,发,将的引, 将到的引合。,用法和,合 文档和的,引的。 .1.3 PageRan 法。为仅一,也量。,如何 的成为一。一讲,也, ,使量可。,为了解的(分 数)的,考用具有一。一 到一的。可分为以 • i 的 i 的 • i 的 i 的。 ,的应。的分析的一 部分,了法使用。有的法由于长,如不为 所。将解的 PageRank 法。法由 Sergey Brin 和 Larry Page( ) 1998 的。的一的为的所有的 和。如 j 的为 P(j), j 的所有分的, j 的 所到的等于 P(j)/Nj。用的数学语言来讲, i 的或 PageRank 为 () ( )ji j P iAPj 如 j i,的 1 1Aij N ,为 0。Aji (adjacency matrix),的 j i 的。有 N ,将量 应的,可为如 ,((1),TTPAPPP PN 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.2 Web 97 如,等于 λ=1 的。还可以用 可的术语来解Aij 为 j 到 i 的概, i 的 p(i) 为 i 的概。(或)也,不。, ,产生,用户于。 rank sink ( A ),解方法增 E,机到一, 不用 A 所的可 (1 ) TdEP dA PN ,E=eeT 为 N N 的 1 (e 为量),d(damping factor,数) A 所的概。(1-d)为机一的概。,所有 的,使一有为 0,如 s 所的。, ,N s 的,以的概 1/N s, Asj=1/N。A 为机 ,所有和为 1 1jijA i1,, N(一不为 0 或 有一)。对 P 量,使 eTp=N,可将为 1 (1 ) ( ) (1 ) ( ) 1, N T ji j P de dAP Pi d d APj i N , 可用方法解。 8 将用法实现感分析。法的 ,不于( PageRank 可,可)。 ,还具有的,有,为者将有的为 的不现实。 4.2 一挖掘技术,解如何。挖掘的如 ,理(法解析技术)处理,文本不的部分( 语言处理技术),用,为文档。将分 3 技术。 为 HTML ,将 HTML 来。HTML 解 析器建,于。现如解析器有, Scrapy 库, 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及98 第4 章 Web 了解析器, 7 。如,解析科的 https://en.wikipedia.org/ wiki/Main_Page。端 scrapy shell 'https://en.wikipedia.org/wiki/MainPage' ,可以,用 response 对和 xpath 语言解析。如, 的 In [1]: response.xpath('//title/text()').extract() Out[1]: [u'Wikipedia, the free encyclopedia'] 或者,的所有(工,, 可以用 Scrapy 库)。用, URL 为 href 的 In [2]: response.xpath("//a/@href").extract() Out[2]: [u'#mw-head', u'#p-search', u'/wiki/Wikipedia', u'/wiki/Freecontent', u'/wiki/Encyclopedia', u'/wiki/Wikipedia:Introduction', u'//wikimediafoundation.org/', u'//www.mediawiki.org/'] 可以考用的方法解析,为的者不, 所以 HTML 也包法,器可据的理解对。 ,也包量,增了解析的。如何的 ,了不的法(如,),本书,还有的 Python 库,不一。, newspaper 库实现的解析 用,文的部分, 7 用到库。 4.3 理 文本,对文本数据处理,不何的 部分。对文本本分,将文本为,所有。还 所有的用(stop words),些成的法,不包文本(如,、 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.3 理 99 和介),如 a、about、an、are、as、at、be、by、for、from、how、in、is、of、on、 or、that、the、these、this、to、was、what、when、where、who、will、with 等。 语(或语言),,不。如,think、thinking 和 thinker think,的,所用不(、等)。将 一还为的(stemming),现如,法有 (Porter、Snowball 和 Lancaster)。所有些技术于理一为的 法,nltk 库用 Python 语言实现了些技术(可用 sudo pip install nltk 库)。 ,用到的技术,处理一文本(端用 Python shell) ,stopwords 用 nltk dowloader 的,具 nltk.download('stopwords')。 .3.1 为的文档,用方法。为的建有方 法,如、量和概。讲一量及实现方法。 用的语言来由 V 成的和包 N 的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及100 第4 章 Web 文档,(或文档)di 可以由成的量 di=w1i,…, Viw 。wij j 于文档 i。据用的法,wij 可以数()或量 • -文(Term Frequency-Inverse Document Frequency,TF-IDF),wij 一 实数 • (Latent Semantic Analysis,LSA),wij 一实数(的于文档 i) • Doc2Vec(或 word2vec),wij 由实数成的量(于文档 i 的)。 由于也可以为量 q=w1q,…, Vqw ,量和文档量的 ,可到量 q 的。用的量方法,对于 文档 i,文档和的为 1 22 11 V ij jq ji VVi ij qj jj ww dq dq ww ,文还使用量方法(Okapi 和 pivoted normalization weighting), 不讲。 ,介绍 3 建方法,讲如何将用于文本处理。 1TF-IDF 方法 wij ,考到了一实,一现量 现的,于一现仅数现的。TF-IDF 由以 到 wij=tfij xidfi, • 1i, ij ij i ftf max f f 为文档 i j 的一(normalized frequency)。 • logi j Nidf df 为文档,dfj 为包 j 的数量。 2LSA 法的来于如法,(文档)可以到分, 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.3 理 101 的文本现的也。的,用(断) 分解方法来,方法 2 介绍。将分解方法用于 LSA 法,包 所有的文档用 X(V×N ),一一文档 T tttXU V Ut (V'd)为到 d 的, T ttV (d'N)为到的文档的 , t (d'd)为包的对。量如方到 1 tttqqU , Vt 的一所的文档 qt 的。,文档的数 学为 ttV (不 Vt),为的(scaling factor),将 考。,文档应 ttq 。,的 Vt 和 qt 的 ,不实应用方法。 3Doc2Vec(word2vec) 方法将 wj 成于包的文档 di 的量 vwj。Doc2Vec Mikolov 等发的 word2vec 法的,Doc2Vec 法用和方法生成(和 文档)量。于(学习)机器学习应用增, 讲一的方法,介绍概念和。对于的机器学习, 方法将。的于 Rong(2014)、Le 和 Mikolv(2014) 的文,到的些术语也文所使用的。 4word2vec—和 Skip-gram 将 V 的 j 为长为|V|的量,量的为 xj=(x1j,xVj),有 xjj=1,为 0。word2vec 方法架( 4.1) 一,由 N ()成的一()。架 有包 N 或 h 的一。,可将方法学习 不学习,者有的。(Continuous Bag Of Words, CBOW)方法( 4.1 )使用 C 为(文), 的文的()。方法的 Skip-gram,以为 ,的文( 4.1 )。C 参数, 的文 分量。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及102 第4 章 Web 4.1 word2vec 法的 Skip-gram()和 CBOW()架 X Rong(2015)所的word2vec Parameter Learning Explained , W 将量为,将 W'为的 y, 到(或文)。,的(或文)的, 用机, W 和 W'。将一 CBOW 方法为数学的 。,Skip-gram 等,将参 Rong(2015)的文,为 介绍。 5CBOW 的 开到 h,可 1 1 ChWxxC 1 1 cwwCvvvC 到,,vwi 量长为 N, wi。wc C 文量 vwi 的。 wj,量 vwj(W的 j )以 h 可以到 uj 的 jjwuvh 还不 yj 的,为的文 C, wj 的概 ,用 softmax 文,yj 的方如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.3 理 103 1 11 ,., T jjC T iiC vuv jjCVV vuv ii eeypwww ee 现,,对于所有,一概,等于 max P 11 1 ., log ( ,., ) log wi j V vhT jC j CwMj i ww w E max pww w v h e , ()jj TT wwMj max v h v h , jM 量 W使的,也可的。 E 对 W (wij) 和 W(wij),可到机。为的 wj, 如 1,jj new old ww j Evv hjVu 1 1, ,jj new old ww Evv j CCh , 1 , N EE E hh h ,,α 为的学习。 数 , Mj j j j E yu 实的。,实 现学习。 1, ,jwvj V 语用的量(word representations)。 Rong(2015)的文。 6Doc2Vec Le 和 Mikolov 文(2014)解, Doc2Vec word2vec 方法的, Doc2Vec 将文档的量。,对 于 CBOW 架,量 h 为文量和文 档量 di 的 1 1 1 () 1 ()ci Ci wwdC hWxxdC vvvvC 4.2 所的架(Distri buted Memory Model,DM), 为 文 档 di 量了 文语有来的文档。文档 di 4.2 分,文包 3 (window=3) Le 和 Mikolov(2014) 所的Distributed Representations of Sentences and Documents(和文档的分) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及104 第4 章 Web 到(sample)的所有文用 vdj,对于所有文档, W(和 W')的。 一架(Distributed Bag of Words,DBOW),仅考一文 档量,文档到的一文语。 DM 架 DBOW 架 , DM gensim 库使用的。建读者读一 Le 和 Mikolov 2014 发的文,了解。 7 使用 Bo Pang 和 Lillian Lee 的 IMBD 数据,的 3 实用法。数据为 http://www.cs.cornell.edu/people/pabo/movie-review-data/, polarity dataset v2.0 和 Pool of 27886 unprocessed html files 文。(数据和 也可以者的 GitHub ,为 https://github.com/ai2010/machine_learning_ for_the_web/tree/master/chapter_4/)。 movie.zip(实来的文 polarity_html.zip),解生成 movie 文,了所有的( 2000 文)。,读些文,数据 ,用 BeautifulSoup HTML 解析的(title),建 moviedict 。polarity dataset v2.0.tar.gz 包 review_polarity 文,文有 txt_sentoken 文, 的文分和(pros 和 cons)。用处理些文 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.3 理 105 现,将 2000 到 tot_textreviews ,到 tot_titles 。用 sklearn 的 TF-IDF 实现, TF-IDF PreprocessTfidf 数,处理文档(用、分和)。 理,用 gensim 库的 LSA 实现, LSA , 10 (latent dimension) GenSimCorpus 数用用技术处理文档,将文档为 gensim 的 LSA 实现可 以读的。 lsi 对到 U、V 和 S ,将到 用到的些 ,到了的引 dict_words,将为 dict_corpus 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及106 第4 章 Web 应的引。 Doc2Vec。, gensim 的 Doc2Vec 实现处理的,数据 将于一 namedtuple 对,对包 PreprocessDoc2Vec 数( 用分)处理的和文的。,有, 为发现不(读者可将 doc2vecstem 为 True, 的如何)。用以成 Doc2Vec 用 DM 架(dm=1),为 500 (),为 10 , 将所有现 1 的(min_count=1)。参数方法有 (negative 的,hs 的 hierarchical softmax,也为 softmax)。 了 20 epoch(数),学习为 0.99。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.3 理 107 现可以方法的。如如,所有科 的文档。所的科也用的的 用 TF-IDF 5 的,如 使用数据,用 cosine_similarity 数将量为 量,。,。LSA 处理方,将为 qk, 5 的 ,doc2vec 用 infer_vector 数将为量。most_similar 数 的 ,用方法(或 softmax), 的 random 参数为一 ,以的。如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及108 第4 章 Web • TF-IDF • LSA • Doc2Vec 3 方法的有和的。有趣的,TF-IDF 法的 LSA 和 Doc2Vec 法,为些法的 In the Heat of the Night、Pokemon、 Rocky Horror Picture Show 和 Wild Things , TF-IDF 的仅有一部 (No Telling)。Charlie's Angels 和 Batman & Robin 部, action 。Doc2Vec ,为,法 学到的量,法的(如,发的 word2vec 包 的文档)。学机学 http://www.cs.cornell.edu/people/pabo/ movie-review-data/一的数据,读者可习用的数据 Doc2Vec 。 4.4 的后理 Web 来,可以用语言处理法,建 Web 引擎,或用于商业的。文档的分 析(latent Dirichlet analysis)法,以及感和的技术(挖掘技术)。 ..1 配 (Latent Dirichlet Allocation,LDA)一于生成的 语言处理法。技术于以,一些量可以用、到的量来解, 也到的数据或不的。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.4 的后理 109 如,对于文本文档言,到的量,文档可以( 到的量)合一成的,一。 如,家的文档 • 文 1: Changing how people search for fashion items and, share and buy fashion via visual recognition, TRUELIFE is going to become the best approach to search the ultimate trends … • 文 2: Cinema4you enabling any venue to be a cinema is a new digital filmed media distribution company currently in the testing phase. It applies technologies used in Video on Demand and broadcasting to ... LDA 可发现些文档所包的。如,以文档,LDA 也 以的语 • 1people Video fashion media…( ) • 2Cinema technologies recognition broadcasting…( 技术 ) ,可将 2 为技术, 1 为商业。 ,可将文档为的合,文档的以一的概分于不的 • 文 1 1 42%、 2 64% • 文 2 1 21%、 2 79% 文档方法可用于应用,如将分为不的或一 的。一,解法的数学。 1 文档为的机合,用语的分来。文档包 M 文档 d=(d1,, dM), 文 档 i 包 Ni 。如 V 的长,文档 i 的 为长为 V 的量 wi,有 v iw =1,为 0 wi = (0,,, v iw =1,) ()的数量为 K,对于文,z=(z1,, zN1)为 wi 对应的 文TRUELIFE 用方法、分和用的方,将为的方。 为文涉及分不概的,所以文用文。。者 文Cinema4you 一家的数分,可将何为,处于。 用了技术,者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及110 第4 章 Web 量。zi 量长为 K, j j iz 为 1,为 0, j iz wi 来的。 b 为 K×V ,bij 的 j i 的概ij=p(wj=1|zi=1)。 ,b 的一 i i 的分,一 j j 的分 。用以来 LDA 法 (1)的分(为),到文档 Ni 的长。 (2)对于文档 di,一分 qi,为分 Dir(a), i1, M,α 参数一长为 K 的量,使 0 1 0 0 () () () K d K d i iidK d d d p (3)分 znMultinominal(i)文档 di n 的。 (4)对于文档 di、 n 和 zn,由 b 的 zn 的分 wn zn,生成 wn。 法的,对于文档,概 (,, ,)(, ,,) (,) ii ii i pzdpzd pd 据概的,分为 ,, , , ,ii i iipzd pdzpzp ,量 z 和概 b,文 档 i 的概可以为概的 , 1 , i nn N izw n pd z 由于 zn 量,有 j j nz =1,为 0, p(z|i)=(i)j。 的(2) 10 , 01 0 ,, , i i nn n K d NK d ii i zwiK dz dn d d pzd p(Q, 2, di | , ) = p(di | 2, ) p(2, |Qi) p(Qi|)。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.4 的后理 111 (1)的分,文档的分,对 di 分,对 z 和到。分 qi 的 和分(b 的)的概,用推断(approximated inference) 方法来解些了本书的。 参数参数(concentration parameter),分到可的的。 参数为 1(或 k,分的,文所使用的),的概 等。参数 0 的,所到的分所有可到一 (不分于不的,分于数)。 ,10 的分(categorical distribution),量为 10 ,一也 由。,参数 0.01 和 0.001 ,如量 ,参数的还。 据 L. Li 和 Y. Z h a n g 的文 An empirical study of text classification using Latent Dirichlet Allocation(用 LDA 为文本分的实),LDA 可以用文本的方法,有。 ,使方法应用现不,还有一些考。的机的, 可不。,参数的也,还有的方法。 2LDA 用数据 textreviews, 4.3.1 的7. 处理。来 LDA 将分成不的。 到的 GitHub , https://github.com/ai2010/machine_learning_for_the_web/tree/ master/chapter_4/ postprocessing.ipynb 文。 书的(1),的概的。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及112 第4 章 Web 对文档分(使用一分器),了用。为了 到的,不增何、现的语(如 movie 和 film)。现数 1000 以或于 3 的 现,可以 10 的 LDA (passes 为用文档的数) 的 10 ,生成的不 10 ,可以到 2 的 disney、mulan(Disney 的一部)、love 和 life 2 , 6 的 action、alien、bad 和 planet 科。实,可以所有 可于 6 的 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.4 的后理 113 如 Rock Star (2001) Star Wars: Episode I - The Phantom Menace (1999) Zoolander (2001) Star Wars: Episode I - The Phantom Menace (1999) Matrix, The (1999) Volcano (1997) Return of the Jedi (1983) Daylight (1996) Blues Brothers 2000 (1998) Alien³ (1992) Fallen (1998) Planet of the Apes (2001) 数科和, LDA 法将到一的。 (lda_lfq[corpus])的文档(document representation),还可 以用法( 2 )处理,将读者,不。,还 ,由于的机的, LDA 法,也不(如到的 书不,也)。 ..2 () 挖掘或感分析一如何的,些分为或 (或)的。分析实用,如,可据对产 或服务的。挖掘的方法将感(或)、或为分的 。文档的数为所有不的数量。分器用 SVM 和 。,可以用 LDA 法和所用的 2000 为数 据,数据了(或)。本的所有 postprocessing.ipynb 文 ,可 https://github.com/ai2010/machine_learning_for_the_web/tree/master/chapter_4/。 处理数据 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及114 第4 章 Web ,将数据分为(80%)和(20%),将处理成 nltk 库可以处理 的(为的或以文档的为,以文档对应的为的) 现,可以用 nltk 库的 NaiveBayesClassifier 分器(), 和分器, 到 28.25%的,用文档的,可以。 一现的,用方 X 2 不现的。些 的包文档的,用语言处理的术语来讲,搭 (collocation)。如,由 w1 和 w2 成的,语库有 N 可的 。 w1 和 w2 现不。可以将的现数(w1, w2)和可的的现数用 O 来, 4.1 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.4 的后理 115 4.1 w1 w1 w2 10 901 w2 345 1111111 ,X2的方法为 1,1 2 0, 02 = ij ij ij ij OE X E ,Oij 由(i, j)成的的现数 ( O00=10),Eij 为(i, j)现的数(如, 00 01 00 10 00 ()()OO OOENNN )。 不,到的数 Oij 数,X2 ,可以 。成为搭的的数现的,包。X2 可 用 f test(也方)以数 N 到,如所 2 00 11 01 10 10 11 01 00 01 11 00 10 , OO OOXN OOOOOOOO 于搭和 X 2 的,参考 C. D. Manning 和 H. Schuetze(1999)合的 Foundations of Statistical Natural Language Processing(语言处理)。 一,为增的一量方法,可将 X2 一 3 的 方法。 nltk 库,用 X2 方法文档的 500 , 分器,如 文为mean square contingency coefficient。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及116 第4 章 Web 一到 20%,于方法的。X2 还可用来部语 量的。可以量的(或)文档 的,为的分(如,如 great 的 X2 于 的 X2 ,的一)。分 部语、语和语的,部语 1 的,如 现,用文具分的bestwords 的 分器 为 12.75%,于数据对,可以了。如 可,应使用方法( 3 ),读者习。还可以用 Doc2Vec 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及4.5 117 量(4.3 7.)分器。,到 Doc2Vec 量, 成,将到 model_d2v.docvecs 对,法将数据分为 (80%)和(20%) , SVM 分器(基 RBF)或对数 和 SVM ,分为 0.5172 和 0.5225,于数据 ,法包参数的法,如。 4. 小结 本了 Web 数据挖掘用和的法,介绍了如何用 Python 库来实 现。学本,应理解 Web 数据挖掘的,具用 Python 语言 处理一些为的的。一,将商业所使用的、为 的推荐法。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 可的产或服务,用户法合理的的,有 使用推荐的。推荐引擎可以的家,量端用户不的商, 用户有的商,商务的部。推荐的应用于 Amazon、Netflix、eBay 和 Google Play 商,些产用到的数据,用户推荐 也的商。 20 ,发了推荐技术,介绍如为业用、 的推荐技术,方法的。些推荐分为基的(Content-based Filtering,CBF)和协(Collaborative Filtering,CF)。还推荐方法( 、对数和合推荐)及如何用不方法推荐方法的。用 MovieLens 数据(http://grouplens.org/datasets/movielens/),包括 943 用户对 1682 部的分数据(分 数 1 到 5 5 等),数量有 10 。用户 20 部分,部于 。本可 GitHub ,文 https://github.com/ai2010/machine_ learning_for_the_web/tree/master/chapter_5,文为 rec_sys_methods.ipynb。 推荐法,介绍的和用的量,以数据、建 推荐。 .1 用 推荐用到数据用户和商。用户的商。分 ijr (1 到 5) 将用户 i 和商 j 来,用户商的。些数据来,用来, 的用(utility matrix)R。的一 i,用户 i 为些商分 的一 j 所有为商 j 分的所有用户。,到 ml-100k 文 的 u.data 文(和 u.item 文,),将 读 来 , 为 pandas 的 DataFrame 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.1 用 119 对(处理将到的用为 csv , utilitymatrix.csv 文),如 如 1 (为 user,用户的 ID),一的包括部分的 和 MovieLens 数据库的 ID,部分用文分开。, 0 , 为用户分的于 1600 部,所以 0。,为于 50 分的用,所以数为 604(于 50 分的有 603 部)。推 荐的些的,为了使用些技术,为 (,imputation)。的方法有用户的分或商 的分,方法数 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及120 第5 章 本实现的法用数,为了使用方,了 数。,本的用 R 为 N×M , N 用户、M 商。由于不法 用量方法,来用的。 .2 方法 量 x 和 y 可以用户(用的)或商(用的),用的 量方法有以 • 22 (, ) ii i ii ii xy sxy x y • 数 22 ()() (, ) ()() ii i ii ii xxy y sxy x xyy ,x 和 y分为量的。 量方法,为 0,。有了些,可以开不 的推荐法,讲。一,量的,用 sim()数 用 SciPy 库实现的数(,scipy 的 讲的刚,用 1 cosine 数的)。 .3 协方法 推荐方法的,用户用户的商。来讲,所的 本,用户 B 的用户 A,商的分数可 B 。实, 可用方实现一概念不用户的,据用户的,用 书处有,分。者 书where x and y are the averages of the two vectors的x和y实为 x 和 y 。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.3 方法 121 户的分(于)用户数据,分,据些分(于 )。方法量数据,对用户的推荐如何,于数据有 用户。推荐的,有分,文 建合使用 CF 和 CBF。MovieLens ,数据,不 。CF 法的还有 1)可,为用户和产数量的增,量也增(也有用 技术) 2)的用,为用户为数商分(一用解 )。 .3.1 的 一方法,用用,用户或商的。些方法 可和,用或,现商用用的 方法。来于用户的和于商的。 1基用的协 法用 k-NN 方法( 3 )用户分的用户,对的 分,用户的。 法如 对于用户 i 及有的商 j (1)用量方法 s, K 为商 j 分的用户。 (2)对于用户 i 有分的商 j, K 用户分的为用户 i 为 j 的分数 0 0 (, )( ) (, ) K kj k k ij i K k s ik r r pr sik ir 和 kr 分为用户 i 和 k 的分,增为了的(有的用 户分,有的),s(i,k),讲。还可以用用户 分的分分数,使分数具可 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及122 第5 章 0 0 (, )( )/ (, ) K ikjkk k ij i K k sik r r pr sik i 和 k 分为用户 i 和 k 所分数的。 法以数 K 为参数,K 的为 2050,数应用使用的 可。以的实,用数到的于,可 为数,用户的分,用户具可。 用户的的。 ,u_vec 用户的分数,数 FindKNeighbours.CalcRating 用刚讲的 , u_vec 到 K 用户的分数,分数(有分数的分)。如 用于,不到,将用户分的分为。 于 5 或于 1,分将为 5 或 1。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.3 方法 123 2基的协 方法的本于用户的,不的商不用户的 。数,用户的数量商的数量,商的可以 ,使用户(如用户数量 N )来,商的也不有 ,可以用方法实现的推荐。 对于用户 i 和商 j,法如 (1)用一量方法 s,用户 i 分的商的 K 商。 (2) K 商分数的,将为 0 0 () () K ik k ij K k s jk r p s jk ,可到,为了 ijp 有(也),将 于 0 的(如推荐商,不的分数, 考商的)。于商的,K 2050 的,也数应用 的。 用一实现法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及124 第5 章 CF_itembased 的数,商 simmatrix。用 CalcRatings 数用户的,用到。GetKSimItemsperUser 数, K 用户(u_vec)的用户。CalcRating 数实现了的的方法。 到,将分数为商的分。 3最的基的协—slope one 法 了用的量方法,还有一有的推荐法。 可以到 D,的一 ijd 商 i 和 j 的(average difference) 1 1 () K k ki kj ij k ij N k ij k rrn d n 如用户 k 为商 i 和 j 分, 1 0 ki kjk ij rr n , () 如果 > 0 打分数据缺失 量为 1, 1 N k ij k n 为商 i 和 j 分的用户数。法于商的一所讲的。对 于用户 i 和商 j (1)商 j 的 K 商, jd*,, jd*= 1jd , , jKd (*可的引 ,,将为 1 到 K)。 (2),将为 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.3 方法 125 11 11 () KN l jk ik jk kl ij KN l jk kl dr n p n 法 CF 法了,不于,开,还于 实现。 SlopeOne 的实现方,于于商的 CF 方法的 CF_itembased 一的于difmatrix 解,法用来商 i 和 j 的 d(i,j),数 GetKSimItemsperUser difmatrix 的,以 K 。商 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及126 第5 章 有可(不可)有分, difmatrix 可以包有的,将 为 1000。可于 5 或于 1,到,分将为 5 或 1。 .3.2 的 方法用用生成,用户的分。包的 ,或(分解)。推荐,发文。 法(Singular Value Decomposition,SVD,以及 法)、最小(Alternating Least Square,ALS)、(Stochastic Gradient Descent,SGD)和(Non-negative Matrix Factorization,NMF)法。 1最小ALS 分解 R 的方法。用户和商可以到 K 的 ˆTRPQR ,N×K 的 P 为的用户,M×K 的 Q 为商 的。,可以为的数 J 2 222 ,, 1 2 K T ij ij ij ik kj i jpq pqij ij k Jmine minMr pq p q ,λ 为参数,学习到的参数,量 ip 和 T jq 的量不于 ,以合。 ijMc 的于用户 i 为商 j 分,如 ijr >0, ijMc 为 1,为 0。对于用户量 ip 和商量 jq , J 的数为 0,到以 等 1 1 2 2 i TT ii ii TT jj j pQMcQIQMcR qPMcPIPMcR , iR 和 iMc 为 R、Mc 量的 i , jR 和 jMc 为 R、Mc 量的 j 。 P、Q,等,可用法(ALS)解。数了如何用 Python 实现 ALS 法 least square algorithm,也方法。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.3 方法 127 Mc mask,量 l 参数 lambda,为 0.001。用 NumPy 库的 linalg.solve 数解。方法有(SGD)和 (SVD)(),于实现,于用方法()。 2SGD 方法于分解,为于对用 R 的 ˆTRPQR , P(N×K)和 Q(M×K)分为用户、商 K 的 (representation)。的分数 ˆijr 可以为 1 ˆ K ij ik kj k rpq 用 ALS 法解方(regularized squared errors) 2 ije 的,到 ˆR (数 J 3 ) 2 222 ,, 1 2 K T ij ij ik kj i jpq pqij ij k min e min r p q p q ,用方法解( 3 有机器学习) 2 2 (2 ) (2 ) ij ik ik ik ij kj ik ik ij kj kj kj ij ik kj kj epp p eqpp epp q eqqp 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及128 第5 章 ,α 为学习( 3 ), 1 ik kj K ij ij k er pq 。等( kjq , ikp ,对来)到到 R。SGD SVD(一讲)于处 理()。SGD 法的 Python 实现如所 SGD 数有参数,学习 α=0.0001,参数 λ=l=0.001, 数为 1000,据(convergence tolerance)tol=0.001。,的,分的商 (分数为 0),不参。,使用方法,()。 3NMF 一方法将 P(N×K)和 Q(M×K)的为 R 的分解(K 为 的),为的。应的为 2 222 ,0,0 1 1 (1 )22 K TT ij ij ik kj i j i jpq p qij ij k Jmine min r pq a p q p q 参数 α 使用方法(0 为方,1 为或者的合),λ 为 参数。有解法,如法(projected gradient)、法 (coordinate descent)、法(non-negativity constrained least squares)。些 方法的本书讲解,数,用到了 sklearn NMF实现 的法 书为NFM。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.3 方法 129 分解,可对。数 fit_transform P , QT 于 nmf.components_对。α 的为 0(方),将为 1alpha=1。λ 的 为 0.01l=0.01。用为(分数),方法分数的 方法。 4SVD 为方法, 2 法,将分解为 U、、V(技术 , 2 ),用来。法,用 SVD 分解, 用方法,用户的用的方法,用的 (或)或者的(不 0 不)。了用 SVD 法分解 用,还可以用法( 2 ), ˆRR (1) ˆˆ()RSVDR (2) ˆ ˆ ij ij ij r r r () 如果用户打过分数 打分数据缺失 以,到方和 2ˆ()ij ij ij rr 于的(tolerance)。法及 的 SVD 分解,如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及130 第5 章 用的 sklearn 库实现的 SVD 法,实现了方法(用户分的和 商分的), 用 参 数 none, 用 0 为的。 SVD 法,参数有据(0.0001)和数(10000)。SVD 法(用 法) ALS ,。还的,用 SVD 方法分解用, 了用户分的,为(SVD 成,用户分的)。 本,一,SVD 分解还可用于于的 CF 方法,的( U 或 TV )用户或商,据来的用分数(SVD 合 k-NN 方法)。 .4 方法 方法商的数据用户的。MovieLens ,部 j 有一 G ,来具有以的、、、、、、 、、、、、、、、、科、、或部。 用些()来,将部为 G (的数量)的 量 jm , j 包,量的为 1,为 0。 用 dfout 的 DataFrame 对(用一),量 jm , 将于 DataFrame 对 dfout_movies 将到 movies_content.csv 文, CBF 方法用到文。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.4 CBF 方法 131 于推荐的,生成用户,用用户的 。方法的,有法商的,商务方法不可 的。方法的于,对用户的推荐,于用户的分,不为 商分数不于。将推荐方法,的。方法 一,用户的分数,生成用户,用量方法, 用户的的。方法,用,据用户分数据和 ,生成用户。用用户的,用户的分数。 ..1 方法实,用 MovieLens 的来解方法,些 讲。方法的为用户 i 生成量 01(,, )ii iGvv v (长 为 G)。具分 ir 和 g igv 的方法,用户 i(Mi)所的包 g 的部的分,分,以包 g 的数量 0 0 () i i M ik i kg k ig M kg k rrI v I ,如 k 包 g, kgI 为 1,为 0。 量 iV 和量 jm 的,将的推荐用户 i。 用一 Python 实现方法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及132 第5 章 器将于 MoviesList ,于 Movies 量,GetRecMovies 数生成用户的量 iv (用一的),也的 features_u, 量的。 ..2 方法学习的参数 i i0,,N−1, i RG+1: 0i =1,N 为用户数,G 为 商的数(数)。为用户参数 i ( 0i =1)增(intercept value), 为量 jm 增, 0jm =1, jm RG+1。为了学习参数量 qi,解 以的 01 11 11 22 00 00 1min ( )22N NM NG T ij ijij ik ij ik mrI , ijI 为 1,用户 i 为部分, j 为 0,λ 为参数( 3 )。 可以用法解( 3 )。对于用户 i • 1 00 0 0 ()(0) M T ii ijijjij j mrmIk • 1 00 0 () (0) M T ik ik i j ij j ij j ij ik j mrmImI k 分为和用户量增了一,参数(k=0)和参数的学习, 开来(为不合的可,不用对处理)。学习到参数 i ,对于何 ijr ,用 T ij i jrm 解。 方法的实现如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.5 用 133 器 CBF_regression 用方法参数 i (的 Pmatrix),数 CalcRatings 用 R(用户不用)的分数量,用应 的参数量。 . 用 商业推荐不使用挖掘,由于可以用数据, 应了解方法。实,可以用解实。方法的, 数据库 T 商的现,到商的(如,用户 i 的或 的商,可以一数据)。讲,一可以{item1, item2}=>{item3} 的,一商{item1, item2}一商{item3}的。 X=>Y 用以来 • (support)一商 X, supp(X)为包 X 的数据 数据的。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及134 第5 章 • (confidence)包 X 和 Y 的数据包 X 的conf(X=>Y)=supp(X U Y)/supp(X)。 conf(X=>Y)的可 conf(Y=>X)。 一数据库的, X 现的,Y 现 的概。,用数据库挖掘的(的, 的),可以 X 和 Y 的量方法。到推荐 ,数据库可以用 R 生成用户的,由 X 和 Y 成的,合 X 和 Y 包一商()。用 ass_matrix 来 些,的 ass_matrixij i=>j 的。用 ass_matrix 以用户 的分量 u_vec,到用户推荐商recitems = uvec⋅assmatrix,对 recitems ,推荐 recitems 的。,方法到的不对分的, 的推荐方法,使用为,也的 。对于如何以的到所有可的商合,以到 X 和 Y,文 到 了 方法apriori 和 fp-growth 法(不,为的 X、Y 包 一商)。 用一来实现推荐 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.6 方法 135 器的参数有用 Umatrix、 Movieslist、 min_support( 为 0.1)、 min_confidence(为 0.1)和将数据考的 分数 likethreshold(为 3)。数 combine_lists 所有可的, filterSet , 的。calc_confidence_matrix 用(为 0)的 ass_matrix 。GetRecItems 据用户的分数 u_vec,推荐。 .6 方法 (Log-Likelihood Ratio,LLR)量 A、B 不可, 现于(一发生)的一方法。言,LLR A 和 B 现的,分(的分)所的。 Ted Dunning ( http://tdunning.blogspot.it/2008/03/surprise-and-coincidence.html ) 讲, 可以 A 和 B 的分来 LLR,分 k 及 LLR 的为 5.1 A Not A B k11 k12 Not B k21 k22 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及136 第5 章 11, 12, 21, 22, 11, 12, 21, 22, 11, 12, 21, 22,2LLR N H k k k k H k k k k k k k k , () 11 12 21 22 0 ,() /log(/) len p ii i Nk k k kHp pN pN 为量量 p 所包的 。 11 12 21 22 11 12 21 22 11 21 12 22([ , , , ]) ([ ]) ([ ])Hk k k k Hk k k k Hk k k k也为 量 A 和 B 的(Mutual Information,MI),量的的发生如何的。 方法也 G2,实(文本分析)的现方 有,可用于数据的(如的用)。 到推荐的, A 和 B 对应的用户或不 A 和 B。 一部的,分于 3 分(,不)。用实现法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.7 137 器的参数有用、和断用户的 likethreshold (为 3)。数 loglikelihood_ratio k(calc_k)和应的 LLR ( calc_llr ),为一对 i 和 j 生成 LLR 。数 GetRecItems 用户(用户的分数据为 u_vec)的 推荐(方法不分数据)。 . 方法为了到理的,推荐引擎合使用 CBF 和 CF 方法。业 合推荐方法,来不以 • 对 CBF 和 CF 到的分数,。 • 分用 CF 和 CBF ,将合为一。 • 据的,使用 CF 或 CBF 方法。 • 合考 CF 和 CBF 的,到的用户或商。 • (Feature augmentation)于合,还用分数, 推荐引擎使用到的分数生成推荐。如,对于于的 分的,增(Content-Boosted Collaborative Filtering)学习为 分,用方法推荐。 ,合于商的 CBF 方法和于用户的 CF 方法,实现合 的合方法。方法一用于用户的 CF,用,增用户 的分。具实现方法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及138 第5 章 器生成的用 Umatrix_mfeats,为用户增了为的 的分。数 CalcRatings 使用数量方法,用户 的量, K 。方法,用 SVD 方法用,将用户的 合。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.8 139 SVD 方法,用户所的分数了用户的分。用户的分数 了的分。 . 了商业应用为的方法,现来学习推荐的方 法。可(用用的数据)或(用用和用户实产生的数据) 。 7 将合推荐讲解方法。一,用推荐 用的方法,来些推荐方法的分数的方(Root Mean Square Error,RMSE)和的。所有方法,用 k-( 3 ), 为了的,用 5 。用以数将用分为 5 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及140 第5 章 DataFrame 对 df 用,k 为数。用户的分数量 u_vec, 机了数的分数,以的实。 u_vals ,u_test 用于法的实分数。不法不量方法, 用、到 DataFrame 对,将数据分成 5 ,使用方法。 包 df_vals ,用本的 HideRandomRatings 数用户实 的分数。 movies、movieslist 以及 DataFrame 对 df_trains、vals_vecs_folds 和 tests_vecs_folds ,来和的方法。 的方(RMSE)。 ..1 (RMSE) 方方法适用于 CF 和 CBF,为有些法生成分数。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.8 141 u_vals 的分数 ijr ,用方法到分数 ˆijr ,应的方为 2 ,_ ˆ() RMSE= ij ij ijuvals val rr N ,Nval 为 u_vals 量分数据的数量。的方的, RMSE(分数)的方法,的,分于对所有分数的,不 数分数,不对 ,_ ˆ() MAE= ij ij ijuvals val rr N 所的。 于的 CF、于用户和商的方法,的 RMSE 方法 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及142 第5 章 对于方法,用 SE 数,一的,到所有的。 于商的 CF 和 slope one 法使用 5 ,于用户的 CF 使用 20 ,方 法的 5.2。 5.2 方法 RMSE 的 于用户的 CF 1.01 39972 于商的 CF 1.03 39972 Slope one 1.08 39972 于用户的 CF-CBF 1.01 39972 以方法, RMSE ,方法于商的。 对于于的方法,不分数,将 u_test 合到用一 ,用 RMSE 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及5.8 143 了 CBF 和 SVD 方法的 RMSE,读者可以用 法的,为所的数以的到( SVD、 SGD、ALS 和 NMF)。 5.3(K 为的) 5.3 方法 RMSE 的 CBF (α= 0.01、l =0.0001、50 ) 1.09 39972 SGD(K=20、50 、a =0.00001、l=0.001) 1.35 39972 ALS(K=20、50 、l =0.001) 2.58 39972 SVD(=用户分数、K =20) 1.02 39972 SVD EM(=商分数、30 、K =20) 1.03 39972 合 SVD(=用户分数、K =20) 1.01 39972 NMF(K =20、=用户分数) 0.97 39972 不所,ALS 和 SGD 现,用讲解推荐有于理解, 对以(还有一,的实现有 sklearn 库所实现的方法)。 方法不。,的,合方法的 SVD、于用户的 CF 法一。还的,机的,,可不。 ..2 的 分 RMSE 不实方法的,一学术方法,实商 业不使用的。的用户推荐,不用户的实分。 用、和 f1 ( 3 )推荐商的。的分 数于 3 的。法的 50 部的 3 (如法 ,不 50 的分数)。些的方如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及144 第5 章 ,量 ratingsval 推荐方法的分数还。用 数 ClassificationMetrics 所有方法的 RMSE ,的有 (可以习)。 5.4 了方法的 3 (neighs 为数、 K 为的) 5.4 方法 f1 的 于用户的 CF ( neighs =20) 0.6 0.18 0.26 39786 于用户的 CBFCF ( neighs =20) 0.6 0.18 0.26 39786 合 SVD ( K =20、=用户分数) 0.54 0.12 0.18 39786 于商的 CF ( neighs =5) 0.57 0.15 0.22 39786 Slope one ( neighs =5) 0.57 0.17 0.24 39,786 SVD EM ( K =20、30 、=用户分数) 0.58 0.16 0.24 39786 SVD ( K =20、=商分数) 0.53 0.12 0.18 39786 CBF (α= 0.01、l =0.0001、50 ) 0.54 0.13 0.2 39786 SGD (K=20、α=0.00001、l =0.001) 0.52 0.12 0.18 39786 ALS ( K =20、λ =0.001、50 ) 0.57 0.15 0.23 39,786 CBF 0.56 0.12 0.19 39786 LLR 0.63 0.3 0.39 39786 NMF ( K =20、λ =0.001、方法为 ssss ) 0.53 0.13 0.19 39786 0.68 0.31 0.4 39786 由 5.4 可,推荐方法,LLR、于用户的合 CBFCF、于用户的 CF 。,由于机,也有所不。 . 小结 本了用的推荐方法、于的和的合 法。文,可到推荐(modal recommendation),将 不的数据(用户、学、、理、等)合到法。 些为的方法用不的数据。 7 ,将用本的方法实现一 Web 推荐。,用 6 一的来介绍搭建 Web 应用所使用的 Django 框架。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 开 Web 框架 Django 用,和,应用于商业( 分用了 Python 有的库一)。 可以用 Web 应用来理和分析数据,开发 Web 应用用到 Web 框架的, 本讲解 Django 框架的些。,还解搭建的 Web 应用包括 些,和于,不,阅方文档 https://docs.djangoproject.com 或。将介绍 Web 服务器应用的概念(、 和)、HTML 和 shell 的、REST 框架的概念及 Django 如何实现的(serializer、REST 用和 swagger)。介绍如何用 HTTP GET、POST 方法数据,还讲解 Django 的方法以及如何用搭建 Web 服务器。 6.1 HTTP——GET 和 POST 方法的基础 超文本传输协议(Hypertext Transfer Protocol,HTTP)实 现 了 户 端( 如 Web 器) 和服务器(的应用)的。的 URL ,户端使用 GET 方法服务 器数据, URL 以参数的。用 curl 来解,如所 curl -X GET urlpath?name1=value1&name2=value2 URL?的对,的的数据,数据用&分。 户端将数据服务器的方法 POST。POST 方法将的数据到的 body 部分 curl -X POST -d @datafile.txt urlpath 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及146 第6 章 开始 Django 之旅 现,开如何用 Django 搭建 Web 服务器和 Web 应用。 6.1.1 Django 的安装和服务器的搭建 端以, Django 库 sudo pip instal django 应的 1.7 或以本的 Django(者用的 1.7 本)。建 Web 应用, 用以 django-admin startproject test_server 生成 test_app文,文的文如 └── testserver ├── manage.py └── testserver ├── init.py ├── settings.py ├── urls.py └── wsgi.py test_server 文有 manage.py 文,开发可用。文, 还有一的文 test_server,有以文 • settings.py服务器的所有参数 • urls.py Web 应用的所有 URL 及对应的数,些数于 views.py 文,用,生成 URL 所的 • wsgi.py Web 应用服务器的 • __init__.py将文为一包,以包。 以,本的机器, http://127.0.0.1:8080/,可到 Django 的 (Welcome to Django) python manage.py runserver 8080 应为 test_server。者 用到 manage.py 的,到 manage.py 所的,到工具到。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.1 HTTP——GET 和 POST 方法的基础 147 ,8080 为服务器开的端(如不,开 8000 端)。现服务器 ,可以用如建 Web 应用,建建。 python manage.py startapp nameapp test_app文的,建一文 nameapp ├── manage.py ├── nameapp │ ├── init.py │ ├── admin.py │ ├── migrations │ ├── init.py │ ├── models.py │ ├── tests.py │ └── views.py └── testserver ├── init.py ├── settings.py ├── urls.py └── wsgi.py 解的参数,文的及。, Django 1.9 本,nameapp 文包 apps.py 文,用 apps.py 文 nameapp 应 用,不用 settings.py 文。 6.1.2 配置 settings.py 文 Django 服务器所的部。的、的参数 如所。 (1)了的、理所的一 Django 应用,还 REST 框架 INSTALLEDAPPS = ( ... 'restframework', 'restframeworkswagger', 'nameapp', ) 应为 test_server。者 —GET 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及148 第6 章 开始 Django 之旅 了 REST 框架,Django 应用(的 nameapp)可以用 REST API ,REST Framework Swagger 一理 REST API 的 Web 。些。还 ,建的一应用(的 nameapp)到 INSTALLED_APPS 。 (2)Diango 用端数据库(MySQL、Oracle 和 PostgreSQL 等)数据。 使用 SQLite3() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase', } } 用 HTML 实现,一文, HTML 。习 用 templates 文文 TEMPLATEDIRS = ( os.path.join(BASEDIR, 'templates'), ) (3)的 CSS 和 JavaScript 到 static 文,将到 test_server 文。文的文,如 MEDIAROOT = os.path.join(BASEDIR, 'static') STATICURL = '/static/' MEDIAURL = '' STATICROOT = '' STATICFILESDIRS = ( os.path.join(BASEDIR, "static"), ) (4)的 URL ,以,URL 将文(的 test_ server/urls.py 文) ROOTURLCONF = 'testserver.urls' (5)可以建一文,为解 bug 的语,到文。使 用 logging 库,方如 LOGGING = { 'version': 1, 'disableexistingloggers': True, 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.1 HTTP——GET 和 POST 方法的基础 149 'formatters': { 'standard': { 'format': '%(asctime)s %(levelname)s %(name)s %(message)s' }, }, 'handlers': { 'default': { 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', 'filename': 'testserver.log', 'maxBytes': 1024*1024*5, # 5 MB 'backupCount': 5, 'formatter':'standard', }, }, 'loggers': { '': { 'handlers': ['default'], 'level': 'DEBUG', 'propagate': True }, } } ,用 logging 库的所有语,将到 test_server.log 文 (如,logging.debug('write something'))。 ,settings.py 所有的,。来,可以开发一 的应用。讲的方法,建一应用 python manage.py startapp addresesapp ,服务器(addressapp)文的 test_server 文,建 文 templates 和文 static ├── addresesapp │ ├── init.py │ ├── admin.py │ ├── migrations │ ├── models.py │ ├── tests.py │ └── views.py —GET 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及150 第6 章 开始 Django 之旅 ├── manage.py └── testserver ├── init.py ├── init.pyc ├── settings.py ├── settings.pyc ├── static ├── templates ├── urls.py └── wsgi.py , settings.py 文 INSTALLED_APPS 一增 addressesapp,方法 nameapp 。一,讲实现的。所有到者的 GitHub 库 chapter_6 文(https://github.com/ai2010/machine_learning_for_the_web/tree/ master/chapter_6)。 6.2 编写应用——Django 最重要的功能 建的 Web 应用,不仅建数据数据,还, 用户增、和。还将为或将数 据发应用。所有些,Django 了应的(model、view、admin 和 API REST 框架)。来数据的方。 6.2.1 model 建,将的和到数据。 Django ,数据 model, models.py 的 from django.db import models from django.utils.translation import ugettextlazy as class Person(models.Model): name = models.CharField(('Name'), maxlength=255, unique=True) mail = models.EmailField(maxlength=255, blank=True) #display name on admin panel def unicode(self): return self.name Django ,数据的对应 model 的,model 的数据、 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.2 编写应用——Django 最重要的功能 151 等。Django 为的对一增的 ID 。, name 用到的 unique , model 不,blank 为,用户可以不。__unicode__数可有可,的用将 对为(用一对)。 建 model , SQLite 数据库将 model 的数据建来 python manage.py makemigrations python manage.py migrate makemigrations 将的到文(addressesapp 文的 migrations 文 ),migrate 将应用于数据库(database schema)。,一 有应用,,实现的应应用的python manage.py makemigrations 'appname'。 6.2.2 HTML 网页背后的 URL 和 view 数据,还用方,一所 有方。一,介绍 HTML 的。 HTML 页面 本讲解的所有于 test_server 文的文(templates)。 应用的,用户一的方, 6.1 6.1 如 6.1 所,的部分,有等用户的框和。 Add ,将到数据库。的 HTML 文 home.html 如所 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及152 第6 章 开始 Django 之旅 {% extends "addressesapp/base.html" %} {% block content %}
{% csrftoken %}

Add person to address book



{% endblock content %} 用 POST 方法,将(

)到的数据到服务器, 由 Add (»文本)的。的 Add person to address book(增到)用(

)。 csrf_token ,可用( https://www.squarefree.com/ securitytips/web-developers.html#CSRF)。 的(CSS 和 JavaScript 文)以及部、部(Home、Emails Book 和 Find ) base.html 文( templates 文)的。Find 用 如实现 用 div 文本,Find GET 方法,一 URL,服务器将 URL urls.py 文的 get_contacts 数处理()。 一的,如 6.2 所。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.2 编写应用——Django 最重要的功能 153 6.2 {% extends "addressesapp/base.html" %} {% block content %}

Email address book

[ {% for letter in alphabet %} which is given by the book.html file: {% extends "addressesapp/base.html" %} {% block content %}

Email address book

[ {% for letter in alphabet %} {{letter}} {% endfor %} | Index ]

{% for contact in contacts %}①

name: {{ contact.name }} email: {{ contact.mail }}     delete

{% endfor %}
{% endblock content %} whichis qivew到应书,书处有。可参考者 Github 的。者 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及154 第6 章 开始 Django 之旅 ,用 base.html 部、部和。 Email address book 用, for {% for letter in alphabet %}, 26 文, 用来实现以开的。具实现方法将的 {{letter}}到的 URL 。的,{% for contact in contacts %},将到将的、和 到一,的用数据库的。来 的实现(、或,)。 6.2.3 URL 声明和 view 现讲解 urls.py 和 views.py 文的 HTML 一工 ,实现的的。 由可应用的 home 和 address book 有一 URL, Django URL urls.py 文的 from django.conf.urls import patterns, include, url from django.contrib import admin from addressesapp.api import AddressesList urlpatterns = patterns('', url(r'^docs/', include('restframeworkswagger.urls')), url(r'^$','addressesapp.views.main'), url(r'^book/','addressesapp.views.addressesbook',name='addressesbo ok'), url(r'^delete/(?P.*)/','addressesapp.views.deleteperson', name='deleteperson'), url(r'^book-search/','addressesapp.views.getcontacts', name='get contacts'), url(r'^addresses-list/', AddressesList.asview(), name='addresseslist'), url(r'^notfound/','addressesapp.views.notfound',name='notfound'), url(r'^admin/', include(admin.site.urls)), ) URL 用的(URL 一 r),的 为 http://127.0.0.1:8000/(以开的^开,的$ ),的(增一)由 views.py 文的 main 数实现 def main(request): context={} 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.2 编写应用——Django 最重要的功能 155 if request.method == 'POST': postdata = request.POST data = {} data['name'] = postdata.get('name', None) data['email'] = postdata.get('email', None) if data: return redirect('%s?%s' % (reverse('addressesapp.views. main'), urllib.urlencode({'q': data}))) elif request.method == 'GET': getdata = request.GET data= getdata.get('q',None) if not data: return rendertoresponse( 'addressesapp/home.html', RequestContext(request, context)) data = literaleval(getdata.get('q',None)) print data if not data['name'] and not data['email']: return rendertoresponse( 'addressesapp/home.html', RequestContext(request, context)) #add person to emails address book or update if Person.objects.filter(name=data['name']).exists(): p = Person.objects.get(name=data['name']) p.mail=data['email'] p.save() else: p = Person() p.name=data['name'] p.mail=data['email'] p.save() #restart page return rendertoresponse( 'addressesapp/home.html', RequestContext(request, context)) 用户、一的,POST 方法将 GET 方法处理。如 和,建一 Person 对,如对,。 ,不,方法(Person.objects.get())将不的, Andrea、 — 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及156 第6 章 开始 Django 之旅 ANDREA 和 andrea 将不的。如解,读者可用 lower() 数将 name 的为, andrea 一 andrea。 base.html 文的对应 http://127.0.0.1:8000/book-search/ URL , 的处理数为 views.py 的 get_contacts 数 def getcontacts(request): logging.debug('here') if request.method == 'GET': getdata = request.GET data= getdata.get('term','') if data == '': return rendertoresponse( 'addressesapp/nopersonfound.html', RequestContext(request, {})) else: return redirect('%s?%s' % (reverse('addressesapp.views.addressesbook'), urllib.urlencode({'letter': data}))) 如用户部的文本,一,数将 addressesbook 数,用户的(到,应的)。 的 Emails book , URL http://127.0.0.1:8000/book/,URL 发 addressesbook 数, def addressesbook(request): context = {} logging.debug('address book') getdata = request.GET letter = getdata.get('letter',None) if letter: contacts = Person.objects.filter(nameiregex=r"(^|\s)%s" % letter) else: contacts = Person.objects.all() #sorted alphabetically contacts = sortlower(contacts,"name")#contacts.orderby("name") context['contacts']=contacts alphabetstring='ABCDEFGHIJKLMNOPQRSTUVWXYZ' context['alphabet']=[l for l in alphabetstring] return rendertoresponse( 'addressesapp/book.html', RequestContext(request, context)) def sortlower(lst, keyname): 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.3 管理后台 157 return sorted(lst, key=lambda item: getattr(item, keyname).lower()) letter (Find 发, addressesbook 数处理)或 ( Emails book 发的),对 Person model 。到的 context 对 contacts , context 对 alphabet 。如有, 数据库所有。,有可,用的 order_by 方法法为。,使用 sort_lower 方法,将 为,。 由 delete_person 数实现, http://127.0.0.1:8000/delete/(?P.*)/ URL 可发。.*所有的合法成部分(如用 、数和,应使用[a-zA-Z0-9 ]+) def deleteperson(request,name): if Person.objects.filter(name=name).exists(): p = Person.objects.get(name=name) p.delete() context = {} contacts = Person.objects.all() #sorted alphabetically contacts = sortlower(contacts,"name")#contacts.orderby("name") context['contacts']=contacts return rendertoresponse( 'addressesapp/book.html', RequestContext(request, context)) 数 Person 数据,量 name,到,包 的。 理, urls.py 文的notfound一 URL,到的处 理数 notfound,现应的工方。 URL admin Django 的理(), docs 为 REST 框架的 swagger, 6.3.3 讲。 6.3 管理后台 admin 理应用的用户,可器。可以刚建的 model 到 admin.py 文,如 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及158 第6 章 开始 Django 之旅 from models import Person admin.site.register(Person) 所有 model 可以用户, http://127.0.0.1:8000/admin/ 以,用户和成。所以,用以建用 户, python manage.py createsuperuser ,用户、(用的 andrea/a)。 ,可以理了, 6.3 6.3 Persons,将到用的 Person 对(为 Person model 的__unicode__数,用), 6.4 6.4 6.3.1 shell 接口 Django 框架还用 shell 和建的 model。 端 以 , 用 shell 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.3 管理后台 159 python manage.py shell Person model, In [1]: from addressesapp.models import Person In [2]: newcontact = Person() In [3]: newcontact.name = 'myfriend1' In [4]: newcontact.mail = 'bla@.com' In [5]: newcontact.save() In [6]: Person.objects.all() Out[6]: [, , , , ] 建一对 myfriend1,所有的 Person 对,以实对 有有建成。 6.3.2 命令 Django 框架,可以用 manage.py 来。如, 到 CSV 文。方法如 management 文建 commands 文( 文一__init__.py 文)。, BaseCommand ,实现用的 到 CSV 文的 from addressesapp.models import Person from django.core.management.base import BaseCommand, CommandError from optparse import makeoption import csv class Command(BaseCommand): optionlist = BaseCommand.optionlist + ( makeoption('--output', dest='output', type='string', action='store', help='output file'), ) def persondata(self, person): return [person.name,person.mail] def handle(self, *args, **options): outputfile = options['output'] contacts = Person.objects.all() 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及160 第6 章 开始 Django 之旅 header = ['Name','email'] f = open(outputfile,'wb') writer = csv.writer(f, quoting=csv.QUOTENONNUMERIC) writer.writerow(header) for person in contacts: writer.writerow(self.persondata(person)) 一 handler 数,。 test_server 文, python manage.py contactstocsv -output='contactslist.csv' 6.3.3 RESTful 应用编程接口(API) RESTful API 用 HTTP (如 GET 和 POST)理 Web 应用数据的应用 。,实现用 curl 用 API 来。方法如 settings.py INSTALLED_APPS 部分 rest_framework 应用, api.py 文实现 API from restframework import viewsets, generics, views from restframework.response import Response from restframework.permissions import AllowAny from restframework.pagination import PageNumberPagination from addressesapp.serializers import AddressesSerializer from addressesapp.models import Person class LargeResultsSetPagination(PageNumberPagination): pagesize = 1000 pagesizequeryparam = 'pagesize' maxpagesize = 10000 class AddressesList(generics.ListAPIView): serializerclass = AddressesSerializer permissionclasses = (AllowAny,) paginationclass = LargeResultsSetPagination def getqueryset(self): query = self.request.queryparams.get if query('name'): return Person.objects.filter(name=query('name')) else: return Person.objects.all() 用 ListAPIView ,所有 Person 对,或 name 的 Person 对。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及6.3 管理后台 161 为的也, PageNumberPagination ,一的对 LargeResultsSetPagination ,可包 1 对。API 将 Person 对为 JSON 的对, serializers.py 文 serializer 对 Addresses Serializer 来实现 from addressesapp.models import Person from restframework import serializers class AddressesSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Person fields = ('id', 'name', 'mail') ,可以用 curl curl -X GET http://localhost:8000/addresses-list/ URL 的。,可以来的 curl -X GET http://localhost:8000/addresses-st/?name=namevalue 如数量(或分的数量), 可 以 用 参 数 一 。 urls.py 文,还了 Swagger RESTful API 文档的 URL ,开发可器和 些 API, 6.5 6.5 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及162 第6 章 开始 Django 之旅 方,于开发 API 工,数据。 6.4 小结 本用 Django 框架搭建 Web 应用。介绍了 model、admin、view、command、 shell 以及 RESTful API 等 Django 的。学本,读者应具开发实用 Web 应用的。 ,将用些和所讲的搭建推荐引擎和感分析。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及 本讲解如何用 Django 框架搭建一实的推荐。的,据用 户的( 5 讲),阅了推荐服务的用户推荐,用 5 的分 数据603 部的分数据,部的分 50 以,有 942 用户参 分。为了到的推荐服务,用户为一数量的分, 讲解的实现( 4 ),以用户、成分。还将 Django 应用的不部分setting、model、用户/、、、推荐 、理和 API(所有到者 GitHub 库 chapter_7 文https://github.com/ ai2010/machine_learning_for_the_web/tree/master/chapter_7)。为 6 介绍了 Django 的 ,所以开发推荐,到一,讲解技术 。现开介绍推荐 Web 应用的,来。 .1 应用 的法,建一 Django django-admin startproject servermovierecsys server_movierecsys 文,建一应用 python manage.py startapp booksrecsysapp 来,对 settings.py 的。 6 的法,应用, HTML 和文的,使用 SQLite 数据库 INSTALLEDAPPS = ( 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及164 第7 章 Web 应用 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'restframework', 'restframeworkswagger', 'booksrecsysapp', ) TEMPLATEDIRS = ( os.path.join(BASEDIR, 'templates'), ) STATICURL = '/static/' STATICFILESDIRS = ( os.path.join(BASEDIR, "static"), ) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASEDIR, 'db.sqlite3'), } } 了 Django 的应用,还应用(INSTALLED_APPS)了 REST 框架(swagger)。 ,将数据到长,用户数据, 或数据,以来用户。 settings.py 文,用 Django 框架的 ,将数据或开的到 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased. FileBasedCache', 'LOCATION': '/var/tmp/djangocache', 'TIMEOUT': None, } } 使用/var/tmp/django_cache 的 File Based Cache ,TIMEOUT( )为 None,的数据不。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.2 model 165 用以建理用户,以使用理 python manage.py createsuperuser (admin/admin) 以,服务器, http://localhost:8000/,到应用的 python manage.py runserver .2 o 对于推荐一应用,一部的数据以及用户 的分数据。建 class UserProfile(models.Model): user = models.ForeignKey(User, unique=True) array = jsonfield.JSONField() arrayratedmoviesindxs = jsonfield.JSONField() lastrecs = jsonfield.JSONField() def unicode(self): return self.user.username def save(self, *args, **kwargs): create = kwargs.pop('create', None) recsvec = kwargs.pop('recsvec', None) print 'create:',create if create==True: super(UserProfile, self).save(*args, **kwargs) elif recsvec!=None: self.lastrecs = json.dumps(recsvec.tolist()) super(UserProfile, self).save(*args, **kwargs) else: nmovies = MovieData.objects.count() array = np.zeros(nmovies) ratedmovies = self.ratedmovies.all() self.arrayratedmoviesindxs = json.dumps([m.movieindx for m in ratedmovies]) for m in ratedmovies: array[m.movieindx] = m.value self.array = json.dumps(array.tolist()) super(UserProfile, self).save(*args, **kwargs) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及166 第7 章 Web 应用 class MovieRated(models.Model): user = models.ForeignKey(UserProfile, relatedname='ratedmovies') movie = models.CharField(maxlength=100) movieindx = models.IntegerField(default=-1) value = models.IntegerField() class MovieData(models.Model): title = models.CharField(maxlength=100) array = jsonfield.JSONField() ndim = models.IntegerField(default=300) description = models.TextField() MovieData model 部的数据、介、量(ndim 为量的)。MovieRated 用户为些分( MovieRated 对,对 应一 UserProfile 对,使用的用户)。UserProfile model 所有用户, 有对,分和推荐有的可。 UserProfile 对 Django 的 user model 的,增了 array ,以用户对所有的分数据, 还增了 recsvec ,一为用户推荐的了 save 数, 用(用户对应的)MovieRated 对 array (如 else 语为)用一 的推荐数据 lastrecs(如 else if 语为)。,MovieRated model 的 UserProfile, related_name 为raetedmoviesUserProfile model 的 save 数, self.ratedmovies.all()的一 UserProfile 的所有 RatedMovie 对。UserProfile model 的 arrayratedmoviesindxs ,用户分的所有,推荐应用的 API 将使 用些数据。 以,将 models.py 文的些数据到数据库 python manage.py makemigrations python manage.py migrate .3 推荐一应用,为了用户感,将数据到(), 用到的。用的数据(603 部,942 用户的分数据, 部分 50 以) 4 使用的,,搭建, 用户、成分,还用户介参考。来开发一 ,实现 4 的用,开数据库(Open Movie 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.3 167 Database,OMDB)介的 from django.core.management.base import BaseCommand import os import optparse import numpy as np import json import pandas as pd import requests class Command(BaseCommand): optionlist = BaseCommand.optionlist + ( optparse.makeoption('-i', '--input', dest='umatrixfile', type='string', action='store', help=('Input utility matrix')), optparse.makeoption('-o', '--outputplots', dest='plotsfile', type='string', action='store', help=('output file')), optparse.makeoption('--om', '--outputumatrix', dest='umatrixoutfile', type='string', action='store', help=('output file')), ) def getplotfromomdb(self,col,dfmoviesplots,dfmovies,df utilitymatrix): string = col.split(';')[0] title=string[:-6].strip() year = string[-5:-1] plot = ' '.join(title.split(' ')).encode('ascii','ignore')+'.' url = "http://www.omdbapi.com/?t="+title+"&y="+year+"&plot=fu ll&r=json" headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36"} r = requests.get(url,headers=headers) jsondata = json.loads(r.content) if 'Plot' in jsondata: #store plot + title 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及168 第7 章 Web 应用 plot += jsondata['Plot'].encode('ascii','ignore') if plot!=None and plot!='' and plot!=np.nan and len(plot)>3:#at least 3 letters to consider the movie dfmoviesplots.loc[len(dfmoviesplots)]=[string,plot] dfutilitymatrix[col] = dfmovies[col] print len(dfutilitymatrix.columns) return dfmoviesplots,dfutilitymatrix def handle(self, *args, **options): pathutilitymatrix = options['umatrixfile'] dfmovies = pd.readcsv(pathutilitymatrix) movieslist = list(dfmovies.columns[1:]) dfmoviesplots = pd.DataFrame(columns=['title','plot']) dfutilitymatrix = pd.DataFrame() dfutilitymatrix['user'] = dfmovies['user'] for m in movieslist[:]: dfmoviesplots,dfutilitymatrix=self.getplotfromomdb(m,df moviesplots,dfmovies,dfutilitymatrix) outputfile = options['plotsfile'] dfmoviesplots.tocsv(outputfile, index=False) outumatrixfile = options['umatrixoutfile'] dfutilitymatrix.tocsv(outumatrixfile, index=False) 的方如 python manage.py --input=utilitymatrix.csv --outputplots=plots.csv – outputumatrix='umatrix.csv' 部的 utilitymatrix 文,getplotfromomdb 数用 Python 的 requests , http://www.omdbapi.com/的介。介(和)以及应的 用(outputumatrix)到一 CSV 文(outputplots)。 来 2 用介,建(TF-IDF ),据 用户的语。,将 TF-IDF 和的推荐(于商的 CF 和对数)到 Django 的。如 from django.core.management.base import BaseCommand import os 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.3 169 import optparse import numpy as np import pandas as pd import math import json import copy from BeautifulSoup import BeautifulSoup import nltk from nltk.corpus import stopwords from nltk.tokenize import WordPunctTokenizer tknzr = WordPunctTokenizer() #nltk.download('stopwords') stoplist = stopwords.words('english') from nltk.stem.porter import PorterStemmer stemmer = PorterStemmer() from sklearn.featureextraction.text import TfidfVectorizer from booksrecsysapp.models import MovieData from django.core.cache import cache class Command(BaseCommand): optionlist = BaseCommand.optionlist + ( optparse.makeoption('-i', '--input', dest='input', type='string', action='store', help=('Input plots file')), optparse.makeoption('--nmaxwords', '--nmaxwords', dest='nmaxwords', type='int', action='store', help=('nmaxwords')), optparse.makeoption('--umatrixfile', '--umatrixfile', dest='umatrixfile', type='string', action='store', help=('umatrixfile')), ) def PreprocessTfidf(self,texts,stoplist=[],stem=False): newtexts = [] for i in xrange(len(texts)): text = texts[i] if stem: tmp = [w for w in tknzr.tokenize(text) if w not in stoplist] else: 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及170 第7 章 Web 应用 tmp = [stemmer.stem(w) for w in [w for w in tknzr. tokenize(text) if w not in stoplist]] newtexts.append(' '.join(tmp)) return newtexts def handle(self, *args, **options): inputfile = options['input'] df = pd.readcsv(inputfile) tottextplots = df['plot'].tolist() tottitles = df['title'].tolist() nmaxwords=options['nmaxwords'] vectorizer = TfidfVectorizer(mindf=0,maxfeatures=nmaxwords) processedplots = self.PreprocessTfidf(tot textplots,stoplist,True) modtfidf = vectorizer.fit(processedplots) vectfidf = modtfidf.transform(processedplots) ndims = len(modtfidf.getfeaturenames()) nmovies = len(tottitles[:]) #delete all data MovieData.objects.all().delete() matr = np.empty([1,ndims]) titles = [] cnt=0 for m in xrange(nmovies): moviedata = MovieData() moviedata.title=tottitles[m] moviedata.description=tottextplots[m] moviedata.ndim= ndims moviedata.array=json.dumps(vectfidf[m].toarray()[0]. tolist()) moviedata.save() newrow = moviedata.array if cnt==0: matr[0]=newrow else: matr = np.vstack([matr, newrow]) titles.append(moviedata.title) cnt+=1 #cached cache.set('data', matr) cache.set('titles', titles) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.3 171 cache.set('model',modtfidf) #load the utility matrix umatrixfile = options['umatrixfile'] dfumatrix = pd.readcsv(umatrixfile) Umatrix = dfumatrix.values[:,1:] cache.set('umatrix',Umatrix) #load rec methods... cfitembased = CFitembased(Umatrix) cache.set('cfitembased',cfitembased) llr = LogLikelihood(Umatrix,titles) cache.set('loglikelihood',llr) from scipy.stats import pearsonr from scipy.spatial.distance import cosine def sim(x,y,metric='cos'): if metric == 'cos': return 1.-cosine(x,y) else:#correlation return pearsonr(x,y)[0] class CFitembased(object): ... class LogLikelihood(object): ... 的方如 python manage.py loaddata --input=plots.csv --nmaxwords=30000 --umatrixfile=umatrix.csv 参数 input 的用 get_plotsfromtitles 到的介。用参数 nmaxwords 数,建 TF-IDF ( 4 )。将部的数据到 MovieData 对 (、TF-IDF 、介、TF-IDF 量)。,一, 用 nltk.download('stopwords')语用(,语了)。 用以,将 TF-IDF 、和用 TF-IDF 的,到 Django 的 from django.core.cache import cache ... cache.set('model',modtfidf) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及172 第7 章 Web 应用 cache.set('data', matr) cache.set('titles', titles) 请注意,Django 的 cache 模块(django.core.cache) 使用前,要先导入它。导入语句要放到文件的开始 位置。 ,用用(umatrixfile)推荐方法于商的和对 数方法。方法有到的,为本 5 讲解的( 者的 GitHub 库 chapter_7 文)。,将推荐及用 到 Django 的以用 cache.set('umatrix',Umatrix) cache.set('cfitembased',cfitembased) cache.set('loglikelihood',llr) 现,用应的,可以使用数据(和),。 .4 用的和功能 推荐一应用,的不用户推荐,实现 、和。使用 Django 的 User 对实现, model 一 讲 User 对。应用的将引用 base.html , base.html 实现了 部,用户或(), 7.1 7.1 sign in()或 sign up(),将以 方法 urls.py url(r'^auth/', 'booksrecsysapp.views.auth', name='auth') URL 用 views.py 文的 auth 数来处理 def auth(request): if request.method == 'GET': data = request.GET authmethod = data.get('authmethod') if authmethod=='sign in': return rendertoresponse( 'booksrecsysapp/signin.html', RequestContext(request, {})) else: return rendertoresponse( 'booksrecsysapp/createuser.html', RequestContext(request, {})) elif request.method == 'POST': postdata = request.POST name = postdata.get('name', None) pwd = postdata.get('pwd', None) pwd1 = postdata.get('pwd1', None) create = postdata.get('create', None)#hidden input if name and pwd and create: if User.objects.filter(username=name).exists() or pwd!=pwd1: return rendertoresponse( 'booksrecsysapp/userexistsorproblem.html', RequestContext(request)) user = User.objects.createuser(username=name,password=pwd) uprofile = UserProfile() uprofile.user = user uprofile.name = user.username uprofile.save(create=True) user = authenticate(username=name, password=pwd) login(request, user) return rendertoresponse( 'booksrecsysapp/home.html', RequestContext(request)) 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及174 第7 章 Web 应用 elif name and pwd: user = authenticate(username=name, password=pwd) if user: login(request, user) return rendertoresponse( 'booksrecsysapp/home.html', RequestContext(request)) else: #notfound return rendertoresponse( 'booksrecsysapp/nopersonfound.html', RequestContext(request)) auth 数将用户 7.2 7.2 如用户,将, 7.3 7.3 用户用户和,。,用些数据建 Django 框 架的 User 对和应的 UserProfile 对(参数 create 为 True,建的用户对 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.5 175 ,有为,为用户还有为何分) user = User.objects.createuser(username=name,password=pwd) uprofile = UserProfile() uprofile.user = user uprofile.save(create=True) user = authenticate(username=name, password=pwd) ,用 Django 的数将用户来 from django.contrib.auth import authenticate, login ... login(request, user) ,的(username 为 a) 7.4 7.4 如一用户的(,到的)或用户不到(,到的 ),的处理实现,读者可,了解些的处理方法。 sign out() urls.py 以语 url(r'^signout/','booksrecsysapp.views.signout',name='signout') URL 用 views.py 文的 signout 数处理 from django.contrib.auth import logout … def signout(request): logout(request) return rendertoresponse( 'booksrecsysapp/home.html', RequestContext(request)) 数使用了 Django 的 logout 方法,将用户( sign in 和 sign up )。实现了、和,用户可以,使用( 引擎),为分。,讲的实现方法。 . 用户使用 7.5 的,,以为分 文为sign in and sign out,用户,应sign up。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及176 第7 章 Web 应用 7.5 文本框,( urls.py 文的 URL home)用 views.py 文的 home 数 def home(request): context={} if request.method == 'POST': postdata = request.POST data = {} data = postdata.get('data', None) if data: return redirect('%s?%s' % (reverse('booksrecsysapp. views.home'), urllib.urlencode({'q': data}))) elif request.method == 'GET': getdata = request.GET data = getdata.get('q',None) titles = cache.get('titles') if titles==None: print 'load data...' texts = [] mobjs = MovieData.objects.all() ndim = mobjs[0].ndim matr = np.empty([1,ndim]) titleslist = [] cnt=0 for obj in mobjs[:]: texts.append(obj.description) newrow = np.array(obj.array) #print 'enw:',newrow if cnt==0: matr[0]=newrow else: 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.5 177 matr = np.vstack([matr, newrow]) titleslist.append(obj.title) cnt+=1 vectorizer = TfidfVectorizer(mindf=1,maxfeatures=ndim) processedtexts = PreprocessTfidf(texts,stoplist,True) model = vectorizer.fit(processedtexts) cache.set('model',model) #cache.set('processedtexts',processedtexts) cache.set('data', matr) cache.set('titles', titleslist) else: print 'loaded',str(len(titles)) Umatrix = cache.get('umatrix') if Umatrix==None: dfumatrix = pd.readcsv(umatrixpath) Umatrix = dfumatrix.values[:,1:] cache.set('umatrix',Umatrix) cfitembased = CFitembased(Umatrix) cache.set('cfitembased',cfitembased) cache.set('loglikelihood',LogLikelihood(Umatrix,moviesli st)) if not data: return rendertoresponse( 'booksrecsysapp/home.html', RequestContext(request, context)) #load all movies vectors/titles matr = cache.get('data') titles = cache.get('titles') modeltfidf = cache.get('model') #find movies similar to the query queryvec = modeltfidf.transform([data.lower(). encode('ascii','ignore')]).toarray() sims= cosinesimilarity(queryvec,matr)[0] indxssims = list(sims.argsort()[::-1]) titlesquery = list(np.array(titles)[indxssims] [:nmoviesperquery]) context['movies']= zip(titlesquery,indxs sims[:nmoviesperquery]) context['rates']=[1,2,3,4,5] return rendertoresponse( 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及178 第7 章 Web 应用 'booksrecsysapp/queryresults.html', RequestContext(request, context)) 数开的参数 data,用来用户的。load_data 将到 ,数用,将用户的为用 TF-IDF 方法的量 matr = cache.get('data') titles = cache.get('titles') modeltfidf = cache.get('model') (matr)、(titles),量的 ( 4 )。 1 用数,为,建(和 数据),将到。于用,,如用户 war 为 ,将 war()的(query_results.html), 7.6 7.6 7.6 为 war 的, 5 部(可以 views.py 文开 用 nmoviesperquery 的数量),有。 实现为分一。 .6 ( 7.6),用户()的分数, 可为分。分数的,将发 views.py 文的 rate_movie 数( urls.py 的 URL) def ratemovie(request): data = request.GET rate = data.get("vote") 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及7.6 179 movies,moviesindxs = zip(*literaleval(data.get("movies"))) movie = data.get("movie") movieindx = int(data.get("movieindx")) #save movie rate userprofile = None if request.user.issuperuser: return rendertoresponse( 'booksrecsysapp/superusersignin.html', RequestContext(request)) elif request.user.isauthenticated() : userprofile = UserProfile.objects.get(user=request.user) else: return rendertoresponse( 'booksrecsysapp/pleasesignin.html', RequestContext(request)) if MovieRated.objects.filter(movie=movie). filter(user=userprofile).exists(): mr = MovieRated.objects.get(movie=movie,user=userprofile) mr.value = int(rate) mr.save() else: mr = MovieRated() mr.user = userprofile mr.value = int(rate) mr.movie = movie mr.movieindx = movieindx mr.save() userprofile.save() #get back the remaining movies movies = RemoveFromList(movies,movie) moviesindxs = RemoveFromList(moviesindxs,movieindx) print movies context = {} context["movies"] = zip(movies,moviesindxs) context["rates"] = [1,2,3,4,5] return rendertoresponse( 'booksrecsysapp/queryresults.html', RequestContext(request, context)) 数将的分数 MovieRated 对,用户应的分数量 rate( userprofile.save()实现)。将有分的发 query_results.html。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及180 第7 章 Web 应用 ,用户为分,用户有,处理, 用户(pleasesignin.html)。 . 数将使用 views.py 文的的参数。 nminimumrates=5 numrecs=5 recmethod = 'loglikelihood' nminimumrates 用户为部分,到推荐服务numrecs 用户推荐部recmethod 推荐使用的推荐方法。用户的 Recommendations(推荐)可推荐的, 7.7 7.7 将发 views.py 文的 movies_recs 数( urls.py 文应 的 URL) def moviesrecs(request): userprofile = None if request.user.issuperuser: return rendertoresponse( 'booksrecsysapp/superusersignin.html', RequestContext(request)) elif request.user.isauthenticated(): userprofile = UserProfile.objects.get(user=request.user) else: return rendertoresponse( 'booksrecsysapp/pleasesignin.html', RequestContext(request)) ratedmovies=userprofile.ratedmovies.all() context = {} if len(ratedmovies)0: title = title[0].encode('utf-8').strip().lower() content = a.text.encode('ascii','ignore').replace('\n','') if content == None: content = 'none' if len(cropemptyel(sel.xpath('//div//article//p/text()'). extract()))>1: contents = cropemptyel(sel.xpath('//div//article//p/ text()').extract()) print 'divarticle' . elif len(cropemptyel(sel.xpath('/html/head/meta[@ name="description"]/@content').extract()))>0: contents = cropemptyel(sel.xpath('/html/head/meta[@ name="description"]/@content').extract()) content = ' '.join([c.encode('utf-8') for c in contents]). strip().lower() #get search item searchitem = SearchItem.djangomodel.objects.get(term=self. searchkey) #save item if not PageItem.djangomodel.objects.filter(url=response.url). exists(): if len(content) > 0: if CheckQueryinReview(self.keywords,title,content): if domain not in unwanteddomains: newpage = PageItem() newpage['searchterm'] = searchitem newpage['title'] = title newpage['content'] = content newpage['url'] = response.url newpage['depth'] = 0 newpage['review'] = True #newpage.save() return newpage else: return null 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.3 Scrapy 的和应用 193 由可,Search Scrapy 库的 Spider 。了以方法有的 方法。 • __init__spider 的器, start_urls ,以的 URL。 ,还了 search_key 和 keywords 量,用引擎 API 以 为数据,将用到些。 • start_requests用 spider ,将发数,对 start_urls 的 URL 对 URL,用的 parse_site 数(不的 parse 数)。 • parse_site的数,用来解析 URL 所对应的数据。用 newspaper 库(sudo pip install newspaper)和文本,如 ,用的,解析 HTML 文,到不的以 于引(用 sel .xpath )。为了的到 的,的(rottentomatoes、cnn 等)实, 方法些(有所有,还 参 GitHub 库文)。,用应的 Scrapy item 和 ReviewPipeline 数(),将到的数据到 Django model PageItem 。 • CheckQueryinReview的数,(来) 于的或。 开端, scrapy_spider 文,以, scrapy crawl scrapyspiderreviews -a urllist=listname -a search key=keyname .3.3 Pieline Pipeline 到,对。的 parse_site 数 PageItem 对,发以 Pipeline 对(pipelines.py) class ReviewPipeline(object): def processitem(self, item, spider): #if spider.name == 'scrapyspiderreviews':#not working item.save() return item item(spider 术语,一的)。 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及194 第8 章 应用 .3. 本开的部分到,了 URL 所有到的,用 PageRank 法的。 recursive_link_results.py 如 #from scrapy.spider import Spider from scrapy.selector import Selector from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from scrapy.http import Request from scrapyspider.items import PageItem,LinkItem,SearchItem class Search(CrawlSpider): name = 'scrapyspiderrecursive' def init (self,urllist,searchid):#specified by -a #REMARK is alloweddomains is not set then ALL are allowed!!! self.starturls = urllist.split(',') self.searchid = int(searchid) #allow any link but the ones with different font size(repetitions) self.rules = ( Rule(LinkExtractor(allow=(),deny=('fontSize=*','infoid=*','SortBy=*', ),unique=True), callback='parseitem', follow=True), ) super(Search, self).init (urllist) def parseitem(self, response): sel = Selector(response) ## Get meta info from website title = sel.xpath('//title/text()').extract() if len(title)>0: title = title[0].encode('utf-8') contents = sel.xpath('/html/head/meta[@name="description"]/@ content').extract() content = ' '.join([c.encode('utf-8') for c in contents]).strip() fromurl = response.request.headers['Referer'] 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.3 Scrapy 的和应用 195 tourl = response.url depth = response.request.meta['depth'] #get search item searchitem = SearchItem.djangomodel.objects.get(id=self.searchid) #newpage if not PageItem.djangomodel.objects.filter(url=tourl).exists(): newpage = PageItem() newpage['searchterm'] = searchitem newpage['title'] = title newpage['content'] = content newpage['url'] = tourl newpage['depth'] = depth newpage.save()#cant use pipeline cause the execution can finish here #get fromid,toid frompage = PageItem.djangomodel.objects.get(url=fromurl) fromid = frompage.id topage = PageItem.djangomodel.objects.get(url=tourl) toid = topage.id #newlink if not LinkItem.djangomodel.objects.filter(fromid=fromid). filter(toid=toid).exists(): newlink = LinkItem() newlink['searchterm'] = searchitem newlink['fromid'] = fromid newlink['toid'] = toid newlink.save() Search Scrapy 库的 CrawlSpider 。了方法, 来的方法(的 Spider )。 • __init__Search 的器。start_urls 参数开的 URL,到为 参数 DEPTH_LIMIT 的,将 URL 。参数 rules /的 URL (,不,的不)。 还处理到的的数(parse_item)。还了 search_id 量,以数据的 ID。 • parse_item的数,将到的的数据来。为 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及196 第8 章 应用 建一 Django Page model(),和(用 xpath HTML 解析器)。为了 PageRank 法,到的和的 ID,用应的 Scrapy item 为 Link model()。 开端, scrapy_spider 文,以, scrapy crawl scrapyspiderrecursive -a urllist=listname -a search id=keyname .4 Django o 的数据到数据库。 Django ,数据库为 model, models.py 文(于 pages 文)。 models.py 文以 from django.db import models from django.conf import settings from django.utils.translation import ugettextlazy as class SearchTerm(models.Model): term = models.CharField(('search'), maxlength=255) numreviews = models.IntegerField(null=True,default=0) #display term on admin panel def unicode (self): return self.term class Page(models.Model): searchterm = models.ForeignKey(SearchTerm, relatedname='pages',null =True,blank=True) url = models.URLField(('url'), default='', blank=True) title = models.CharField(('name'), maxlength=255) depth = models.IntegerField(null=True,default=-1) html = models.TextField(('html'),blank=True, default='') review = models.BooleanField(default=False) oldrank = models.FloatField(null=True,default=0) newrank = models.FloatField(null=True,default=1) content = models.TextField(('content'),blank=True, default='') sentiment = models.IntegerField(null=True,default=100) class Link(models.Model): searchterm = models.ForeignKey(SearchTerm, relatedname='links',null 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.5 Django 和 Scrapy 197 =True,blank=True) fromid = models.IntegerField(null=True) toid = models.IntegerField(null=True) 用户感分析应用的的 SearchTerm model , 的数据 Page model 。了的(HTML、、URL 和),还的感和的(,还用一 还一的、的)。Link model 的, PageRank 法用的。Page model 和 Link model 应的 SearchTerm。以, model 生成数据 python manage.py makemigrations python manage.py migrate 为了些 Django model,实现 Scrapy 和 Django 的,具方法 一讲。 . Django 和 Sa 为了的,于用,了 scrapy_spider 文。, movie_reviews_analyzer_app 文,webmining_server 文 scrapy_spider 文 于一 ├── db.sqlite3 ├── scrapy.cfg ├── scrapyspider │ ├── ... │ ├── spiders │ │ ... └── webminingserver Scrapy 的 settings.py 文 Django 的 # Setting up django's project full path. import sys sys.path.insert(0, BASEDIR+'/webminingserver') # Setting up django's settings module name. os.environ['DJANGOSETTINGSMODULE'] = 'webminingserver.settings' #import django to load models(otherwise AppRegistryNotReady: Models 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及198 第8 章 应用 aren't loaded yet): import django django.setup() 为了实现 Scrapy 理 Django,库 sudo pip install scrapy-djangoitem items.py 文, Django model 和 Scrapy 的对方 from scrapydjangoitem import DjangoItem from pages.models import Page,Link,SearchTerm class SearchItem(DjangoItem): djangomodel = SearchTerm class PageItem(DjangoItem): djangomodel = Page class LinkItem(DjangoItem): djangomodel = Link , DjangoItem ,用 django_model 量的、 的 Django model 来。Scrapy 一,Scrapy 来的数据如何处理, 还讲。来处理数据用到的 Django 和理应用的 Django 。 ..1 命令(和) 应用理一些,些不用户,如感分析、 ,以,不现有数据。,将 解如何实现些的。 ..2 器 应用的,断的感(或)。为了实现一, 使用部数据搭建感分析器,将()使用, load_sentimentclassifier.py 成的 import nltk.classify.util, nltk.metrics from nltk.classify import NaiveBayesClassifier from nltk.corpus import moviereviews from nltk.corpus import stopwords 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.5 Django 和 Scrapy 199 from nltk.collocations import BigramCollocationFinder from nltk.metrics import BigramAssocMeasures from nltk.probability import FreqDist, ConditionalFreqDist import collections from django.core.management.base import BaseCommand, CommandError from optparse import makeoption from django.core.cache import cache stopwords = set(stopwords.words('english')) methodselfeatures = 'bestwordsfeatures' class Command(BaseCommand): optionlist = BaseCommand.optionlist + ( makeoption('-n', '--numbestwords', dest='numbestwords', type='int', action='store', help=('number of words with high information')),) def handle(self, *args, **options): numbestwords = options['numbestwords'] self.bestwords = self.GetHighInformationWordsChi(numbestwords) clf = self.trainclf(methodselfeatures) cache.set('clf',clf) cache.set('bestwords',self.bestwords) 文开,method_selfeatures 量方法(用的语为 4 ),用的分器 train_clf。参数 num_bestwords 语()的数量。,将分器和(bestwords)到,于感 分析应用使用(用 cache )。分器和语()的方法如所 def trainclf(method): negidxs = moviereviews.fileids('neg') posidxs = moviereviews.fileids('pos') if method=='stopwordfilteredwordsfeatures': negfeatures = [(stopwordfilteredwordsfeatures(movie reviews.words(fileids=[file])), 'neg') for file in negidxs] posfeatures = [(stopwordfilteredwordsfeatures(movie reviews.words(fileids=[file])), 'pos') for file in posidxs] elif method=='bestwordsfeatures': negfeatures = [(bestwordsfeatures(moviereviews. words(fileids=[file])), 'neg') for file in negidxs] 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及200 第8 章 应用 posfeatures = [(bestwordsfeatures(moviereviews. words(fileids=[file])), 'pos') for file in posidxs] elif method=='bestbigramswordsfeatures': negfeatures = [(bestbigramswordsfeatures(moviereviews. words(fileids=[file])), 'neg') for file in negidxs] posfeatures = [(bestbigramswordsfeatures(moviereviews. words(fileids=[file])), 'pos') for file in posidxs] trainfeatures = negfeatures + posfeatures clf = NaiveBayesClassifier.train(trainfeatures) return clf def stopwordfilteredwordsfeatures(self,words): return dict([(word, True) for word in words if word not in stopwords]) #eliminate Low Information Features def GetHighInformationWordsChi(self,numbestwords): wordfd = FreqDist() labelwordfd = ConditionalFreqDist() for word in moviereviews.words(categories=['pos']): wordfd[word.lower()] +=1 labelwordfd['pos'][word.lower()] +=1 for word in moviereviews.words(categories=['neg']): wordfd[word.lower()] +=1 labelwordfd['neg'][word.lower()] +=1 poswordcount = labelwordfd['pos'].N() negwordcount = labelwordfd['neg'].N() totalwordcount = poswordcount + negwordcount wordscores = {} for word, freq in wordfd.iteritems(): posscore = BigramAssocMeasures.chisq(labelwordfd['pos'] [word], (freq, poswordcount), totalwordcount) negscore = BigramAssocMeasures.chisq(labelwordfd['neg'] [word], (freq, negwordcount), totalwordcount) wordscores[word] = posscore + negscore best = sorted(wordscores.iteritems(), key=lambda (w,s): s, 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.5 Django 和 Scrapy 201 reverse=True)[:numbestwords] bestwords = set([w for w, s in best]) return bestwords def bestwordsfeatures(self,words): return dict([(word, True) for word in words if word in self. bestwords]) def bestbigramswordfeatures(self,words, measure=BigramAssocMeasures.chisq, nbigrams=200): bigramfinder = BigramCollocationFinder.fromwords(words) bigrams = bigramfinder.nbest(measure, nbigrams) d = dict([(bigram, True) for bigram in bigrams]) d.update(bestwordsfeatures(words)) return d 实现了语的方法。 • stopword_filtered_words_features用 NLTK(语言处理工具)的用, 用,将为语。 • best_words_features用 X2 方法(NLTK 库)或 的语( 4 )。 • best_bigrams_word_features用 X 2 方法(NLTK 库)语合, 量的 200 ( 4 )。 用分器( 3 )和 NLTK.corpus 的 movie_reviews 的文本 (、感)为语。语的方法,开 Python shell,以 corpus movie_reviews 数据 nltk.download()--> corpora/moviereviews corpus① ..3 的 由于可以不的参数(如方法、语的数量等),也 Python shell nltk.download()(如还有 nltk,端 pip install nltk nltk 库)。开的 NLTK Downloader 的 Corpora movie_reviews,方的 Download 。者 nltk.download() , movie_reviews , Status installed。者 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及202 第8 章 应用 用不的参数,分析和分析。用到 delete_query , 如 from pages.models import Link,Page,SearchTerm from django.core.management.base import BaseCommand, CommandError from optparse import makeoption class Command(BaseCommand): optionlist = BaseCommand.optionlist + ( makeoption('-s', '--searchid', dest='searchid', type='int', action='store', help=('id of the search term to delete')),) def handle(self, *args, **options): searchid = options['searchid'] if searchid == None: print "please specify searchid: python manage.py --searchid=--" #list for sobj in SearchTerm.objects.all(): print 'id:',sobj.id," term:",sobj.term else: print 'delete...' searchobj = SearchTerm.objects.get(id=searchid) pages = searchobj.pages.all() pages.delete() links = searchobj.links.all() links.delete() searchobj.delete() 如有 searchid(的 ID),将所有的及 ID。 可以使用 python manage.py deletequery --searchid=VALUE 可以使用的感分析用户的感,一。 .. 器Django view 和 HTML 本的数(、Bing 引擎、Scrapy 和 Django model) views.py 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.5 Django 和 Scrapy 203 文 analyzer 数的, 8.1 的( urls.py 文的 URL 为(r'^$','webmining_server.views.analyzer')) def analyzer(request): context = {} if request.method == 'POST': postdata = request.POST query = postdata.get('query', None) if query: return redirect('%s?%s' % (reverse('webminingserver.views. analyzer'), urllib.urlencode({'q': query}))) elif request.method == 'GET': getdata = request.GET query = getdata.get('q') if not query: return rendertoresponse( 'moviereviews/home.html', RequestContext(request, context)) context['query'] = query strippedquery = query.strip().lower() urls = [] if testmode: urls = parsebingresults() else: urls = bingapi(strippedquery) if len(urls)== 0: return rendertoresponse( 'moviereviews/noreviewsfound.html', RequestContext(request, context)) if not SearchTerm.objects.filter(term=strippedquery).exists(): s = SearchTerm(term=strippedquery) s.save() try: #scrape cmd = 'cd ../scrapyspider & scrapy crawl scrapyspider reviews -a urllist=%s -a searchkey=%s' %('\"'+str(','.join(urls[:num reviews]).encode('utf-8'))+'\"','\"'+str(strippedquery)+'\"') os.system(cmd) except: 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及204 第8 章 应用 print 'error!' s.delete() else: #collect the pages already scraped s = SearchTerm.objects.get(term=strippedquery) #calc num pages pages = s.pages.all().filter(review=True) if len(pages) == 0: s.delete() return rendertoresponse( 'moviereviews/noreviewsfound.html', RequestContext(request, context)) s.numreviews = len(pages) s.save() context['searchtermid'] = int(s.id) #train classifier with nltk def trainclf(method): ... def stopwordfilteredwordsfeatures(words): ... #Eliminate Low Information Features def GetHighInformationWordsChi(numbestwords): ... bestwords = cache.get('bestwords') if bestwords == None: bestwords = GetHighInformationWordsChi(numbestwords) def bestwordsfeatures(words): ... def bestbigramswordsfeatures(words, measure=BigramAssocMeasures.chisq, nbigrams=200): ... clf = cache.get('clf') if clf == None: clf = trainclf(methodselfeatures) cntpos = 0 cntneg = 0 for p in pages: words = p.content.split(" ") 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.5 Django 和 Scrapy 205 feats = bestwordsfeatures(words)#bigramword features(words)#stopwordfilteredwordfeats(words) #print feats strsent = clf.classify(feats) if strsent == 'pos': p.sentiment = 1 cntpos +=1 else: p.sentiment = -1 cntneg +=1 p.save() context['reviewsclassified'] = len(pages) context['positivecount'] = cntpos context['negativecount'] = cntneg context['classifiedinformation'] = True return rendertoresponse( 'moviereviews/home.html', RequestContext(request, context)) 用户的到 query 量,将发 bing_api 数, 的 URL。用 Scrapy,对 URL ,到的文本, 用到的 clf 分器和的量的语(bestwords)分(如 为,一将生成一)。的感(positive_counts、 negative_counts 和 reviews_classified)发 home.html(templates 文)。使用 的生成

Movie Reviews Sentiment Analysis

Reviews Classified : {{ reviews classified }}

Positive Reviews : {{ positivecount }}

Negative Reviews : {{ negative count }}

数 drawChart 用的可数 PieChart,数数据(和的 数量),生成。HTML 和 Django view 方的, 6.2.2 。 的感( 8.1 ),方的可到的 PageRank ,的。 .6 PaganDjango 和法 感分析应用实现了 PageRank 法(4.1.3 )为的 。pgrank.py 文于 webmining_server/pgrank 文,实现了 PageRank 法, 如 from pages.models import Page,SearchTerm numiterations = 100000 eps=0.0001 D = 0.85 def pgrank(searchid): s = SearchTerm.objects.get(id=int(searchid)) links = s.links.all() fromidxs = [i.fromid for i in links ] # Find the idxs that receive page rank linksreceived = [] 异步社区会员 Tom_masike(2287763343@qq.com) 专享 尊重版权www.aibbt.com 让未来触手可及8.6 PageRankDjango view 和法 207 toidxs = [] for l in links: fromid = l.fromid toid = l.toid if fromid not in fromidxs: continue if toid not in fromidxs: continue linksreceived.append([fromid,toid]) if toid not in toidxs: toidxs.append(toid) pages = s.pages.all() prevranks = dict() for node in fromidxs: ptmp = Page.objects.get(id=node) prevranks[node] = ptmp.oldrank conv=1. cnt=0 while conv>eps or cnt
还剩233页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

aibbtcom

贡献于2018-04-10

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf