译者序
有一天,忽然想到自己整天面对着52个英文字母、9个数字、32个符号和一个空格,经常加班没有双休日,好傻。时间不断被各种噪声碎片化,完全就是毛姆在《月亮和六便士》里写的,“If you look on the ground in search of a sixpence, you don't look up, and so miss the moon”,整天低头刷手机,却不记得举头望明月。生活也愈发无序,感觉渐渐被掏空。薛定谔的《生命是什么》给我提了个醒,他在“以‘负熵’为生”(It Feeds On ‘negative Entropy')一节指出:“要活着,唯一的办法就是从环境里不断地汲取负熵。”在介绍了熵的概念及其统计学意义之后,他紧接着在“从环境中引出‘有序’以维持组织”(Organization Maintained By Extracting ‘Order’ From The Environment)一节进一步总结:“一个有机体使本身稳定在较高的有序水平上(等于熵的相当低的水平上)的办法,就是从环境中不断地吸取秩序。”这个秩序(负熵、klog(1/n))可以是食物,也可以是知识,按主流叫法就是“正能量”(有些所谓正能量却碰巧是增加系统无序水平的正熵)。于是,我开始渐渐放弃那些让人沮丧的老梗,远离那些引发混乱的噪声,重新读书,试着翻译,学会去爱。这几年最大的收获就是明白了“隔行如隔山”的道理,试着循序渐进,教学相长,做力所能及之事,让编程变简单。
一般人都不喜欢编程,更不喜欢动手编程(时间消耗:编写&测试40%、重构40%、风格&文档20%),却喜欢在心里、嘴上编程:“先这样,再那样,如果要XX,就YY,最后就可以ZZ了。”分分钟就可以说完几万行代码的项目,水还剩大半杯。一旦大期将近,即使要亲自动手Copy代码,也会觉得苦堪搬砖,键盘不是红与黑、屏幕不能左右推、小狗总是闹跑追,不断在数不清的理由中增加自己的熵。偶尔看编程书的目的也很明确,就是为了快速上手,找到答案。当然也是在Google、StackOverflow、GitHub网站上找不到答案之后,无可奈何之举。编程书把看着复杂的知识写得更复杂,虽然大多篇幅不输“飞雪连天射白鹿,笑书神侠倚碧鸳”等经典,且纲举目张、图文并茂,甚至有作者爱引经据典,却极少有令人拍案的惊奇之处。为什么同样是文以载道,编程书却不能像武侠小说一样简单具体,反而显得了无生趣,令人望而却步?虽然编程的目的就是用计算机系统解决问题,但是大多数问题的知识都在其他领域中,许多作者在介绍编程技巧时,又试图介绍一些并不熟悉的背景知识,显得生涩难懂,且增加了书的厚度。
有时我们真正需要的,就是能快刀斩乱麻的代码。(Talk is cheap, show me the code.)编程与研究数理化不同,没有任何假设、原命题、思维实验,并非科学;与舞剑、奏乐、炒菜相似,都是手艺,只要基础扎实,便结果立判。编程技巧也可以像剑谱、乐谱、食谱一般立竿见影,这本《Python机器学习经典实例》正是如此,直接上代码,照着做就行,不用纠结为什么。
机器学习是交叉学科,应用广泛,目前主流方法为统计机器学习。既然是以统计学为基础,那么就不只是计算机与数学专业的私房菜了,机器学习在自然科学、农业科学、医药科学、工程与技术科学、人文与社会科学等多种学科中均可应用。如果你遇到了回归、分类、预测、聚类、文本分析、语音识别、图像处理等经典问题,需要快速用Python解决,那么这本菜谱适合你。即使你对机器学习方法还一知半解,也不妨一试。毕竟是Python的机器学习,还能难到哪儿去呢?目前十分流行的Python机器学习库scikit-learn是全书主角之一,功能全面,接口友好,许多经典的数据集和机器学习案例都来自Kaggle。若有时间追根溯源,请研究周志华教授的《机器学习》西瓜书,周教授啃着西瓜把机器学习调侃得淋漓尽致,详细的参考文献尤为珍贵。但是想当作菜谱看,拿来就用,还是需要费一番功夫;若看书不过瘾,还有吴恩达(Andrew Ng)教授在Coursera上的机器学习公开课,机器学习入门最佳视频教程,吴教授用的工具是Matlab的免费开源版本Octave,你也可以用Python版演示教学示例。
学而时习之,不亦乐乎。学习编程技巧,解决实际问题,是一件快乐的事情。希望这本Python机器学习经典案例,可以成为你的负熵,帮你轻松化解那些陈年老梗。如果再努努力,也许陆汝钤院士在《机器学习》序言中提出的6个问题,你也有答案了。
示例代码:
"""打印ASCII字母表、数字、标点符号""" import string for item in [string.ascii_letters, string.digits, string.punctuation]: print('{}\t{}'.format(len(item), item))
输出结果:
52 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 100123456789 32 ! "#$%&'()*+, -./:; <=>? @[\]^_`{|}~