《机器学习(西瓜书)》阅读总结
因为最近知道经典的《深度学习》中文版译本就要出版了,未来两三个月的计划是重新阅读一遍《深度学习》,中文版的!所以这个月就又把这本《机器学习》的书翻出来重新阅读了。
这本书大概一年之前读过一边,算是目前看到过的,最好的“中文”机器学习“教科书”了。再次阅读,受益良多。
全书结构大致如下:
【1~3章】介绍机器学习基本知识(绪论、模型评估与选择、线性模型)
【4~10章】介绍一些经典而常用的机器学习方法(决策树、神经网络、支持向量机、贝叶斯分类器、集成学习、聚类、降维与度量学习)
【11~16章】介绍一些进阶知识(特征选择与稀疏学习、计算学习理论、半监督学习、概率图模型、规则学习、强化学习)
书在内容上比较全面的介绍机器学习的各个分支,以及重要而常用的方法,它非常合适没有任何背景的初学者看。作者思路清晰,讲得非常清楚,读起来不累。很多内容把来龙去脉讲得很清楚,比只讲做法不讲原因的书强太多。当时看过各种机器学习相关的书籍和文章,总感觉公式太多,晕头转向,直到看过了这本《机器学习(西瓜书)》,才对机器学习有了一次系统性的了解。
作者周志华,是我见识过的第一个把复杂的问题讲得浅显易懂的老师,这本书也算是呕心沥血的作品,诚意满满。个人感觉算是一本适合程序员深入了解机器学习的入门书籍。
Julia 入门
最近在学习Julia,啃文档 Julia Documentation
Julia 是一个面向科学计算的高性能动态高级程序设计语言。其语法与其他科学计算语言相似。在许多情况下拥有能与编译型语言相媲美的性能。
JUlia 主要用于数值计算,有以下特点:
- 核心语言非常小。标准库用的是Julia语言本身写的
- 调用许多其它成熟的高性能基础代码。如线性代数、随机数生成、快速傅里叶变换、字符串处理。
- 丰富的用于创建或描述对象的类型语法
- 高性能,接近于静态编译型语言。包括用户自定义类型等
- 为并行计算和分布式计算而设计
- 轻量级协程
- 优雅的可扩展的类型转换/提升
- 支持Unicode,包括但不限于UTF-8
- 可直接调用C函数(不需要包装或是借助特殊的API)
- 有类似shell的进程管理能力
- 有类似Lisp的宏以及其它元编程工具
目前数据挖掘、机器学习主流的无疑是Python和R。Python生态圈完整,三方的库很齐全,要完成什么功能都已经有很多的实现,直接调用就可以了;R更偏金融邻域,上手快,集成很多数据集。在工作中使用这两种语言进行数据挖掘、机器学习和量化计算肯定是绰绰有余的了。
但正是由于生态发展得太完善了,三方的实现太好了,自己又没有重复造轮子的动力和信心,想了解底层实现的时候,要么是因为代码历史太久远而且结构复杂不容易看懂,要么看着看着就会觉得没有目标而索然无味。这样只会使自己浮于了解API调用的表面,没法深入了解每一个数据挖掘、机器学习和量化计算算法实现背后的原理和思想。
Julia作为一门较新的语言,基础设计的很不错,性能好,速度快,支持分布式和并行计算,还支持元编程,可以说有着成为一门优秀语言的潜质,只是语言年轻,三方实现少才没有很流行。但这正是一个契机,期望能在熟悉Julia语言之后能自己动手实现一些三方库,即避免了重复造轮子,有可以在实践中增强学习。在这个新语言的领域做一个排头兵,作一个探索者会有意思的多。去学习这门语言的时候,查不到更多的资料,只能通过文档和源码来仔细分析,这才是学习程序的真正乐趣,而不是调用一大堆第三方库,却没有一个是自己一行行调试过的。
《程序员的数学3:线性代数》阅读总结
大学时代,感觉线性代数是一门比概率统计更没有用的数学课,直到最近逐渐接触图形编程或机器学习等领域才发现线性代数的应用无处不在,特别是在图形领域,全部是线性代数的运算。
这本书主要还是大学《线性代数》的复习,内容包括向量、矩阵、行列式、秩、逆矩阵、线性方程、LU分解、特征值、对角化、Jordan标准型、特征值算法等。回忆一下早已遗忘的内容,当然也会有重新的理解。这些知识点类的书,看完之后依然是没有什么特别的总结,但是阅读过程中发现的一篇文章《程序观点下的线性代数》非常不错,以程序员的角度对线性代数有一个全新的思考,其中“从应用的角度看,线性代数是一种人为设计的领域特定语言(DSL),它建立了一套模型并通过符号系统完成语法和语义的映射”的观点,非常认同的。特别是近期频繁接触numpy,API的风格和线性代数的操作很接近。关于线性代数的思考,这篇文章介绍得很有特点,短期自己的理解有限,受到这篇文章的影响会比较大,也就不重复这些观点了。
但是可以介绍一下这段时间对线性代数基本库使用上的一些总结。计算机发明的出发点是用来计算的(算不算废话?),而线性代数是早就被广泛的应用到科学计算中的,因此线性代数的程序库很早就有了:
BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库。该程序集最初发布于1979年,在高性能计算领域,BLAS被广泛使用。这玩意儿虽然只是一个标准,但是最早是由Netlib BLAS官方参考实现,用的程序语言为Fortran 77,在那个遥远的年代,所有的计算程序都是由Fortran写的。
CBLAS,时代在进步,慢慢的Fortran做为计算语言,使用的场景越来越少,C语言慢慢占据了统治地位,写C语言的也需要线性代数计算,但是C的语法、环境和Fortran都不一样,好在Fortran和C都算是底层语言,都是编译成机器语言执行的,应此只用将Fortran的BLAS所有API重新用C封装一次就行了,这就是CBLAS,这是针对C语言的接口。
LAPACK:(Linear Algebra PACKage),是以Fortran编程语言写的,用于数值计算的函式集。 BLAS只提供了线性代数的基本运算,最多也就到矩阵乘积,使用上还是不是特别方便,因此需要高层API的封装。LAPACK提供了丰富的工具函式,可用于诸如解多元线性方程式、线性系统方程组的最小平方解、计算特征向量、用于计算矩阵QR分解的Householder转换、以及奇异值分解等问题。
LAPACKE:LAPACKE之于LAPACK,就像CBLAS之于BLAS,提供了C语言的接口
Atlas,OpenBLAS,MKL、ACML、NVBLAS这些都是BLAS的封装,也就是说它们提供了CBLAS(BLAS的C语言接口),但是底层的实现并不是Fortran了,比如MKL可以有针对Intel CPU的汇编级的优化
因为一般LAPACKE底层都是调用BLAS或者CBLAS的,所以LAPACKE就没有太多的重新实现,直接用Netlib的LAPACKE底层调用BLAS的优化实现就可以了。
clBLAS、cuBLAS:这些也是线性代数计算的,但是和BLAS、CBLAS并不兼容,所有的计算都在GPU里面完成
BLIS、eigen:这些都是最近兴起的线性代数算法库,完全放弃了对老的BLAS的兼容,采用全新的自定义的接口
《程序员的数学2:概率统计》阅读总结
这本《程序员的数学2:概率统计》有点蹭热点的感觉。首先作者换了,不是结城浩写的了,换成了平冈和幸;其次内容变得没有那么程序员思维了,更多的是偏向概率统计的概念,感觉像一本《概率统计》的书,蹭上了《程序员的数学》这个热门。只是鉴于目前学习和研究的方向确实是机器学习方面,所以还是挑选了这本书阅读以下,复习以下概率统计的知识。
还是简单介绍以下书的内容和知识点,涉及随机变量、贝叶斯公式、离散值和连续值的概率分布、协方差矩阵、多元正态分布、估计与检验理论、伪随机数以及概率论的各类应用。
说实话,读一本类似教材的书确实总结不出啥读后感,跟多的是细节上的体味和知识点的归纳。所以只好借阅读这本说谈谈自己对《概率统计》的理解,之前也提到过,概率统计不算是程序员的基础数学能力,只是针对做机器学习的程序员来说是比较重要的,但也不算是必不可少。自己程序员出身,半路出家做机器学习,对自己的数学基础一直耿耿于怀,虽然能用已有的开源机器学习库完成需求,也能对开源模型做一些简单的算法修改,但是一直觉得自己对概率统计的东西掌握不够扎实,很多东西理解起来很模糊。
后来有一次在知乎上看到一个讨论机器学习专家与统计学家观点上有哪些不同?其中一句话我觉得说的很不错:“统计学家更关心模型的可解释性,而机器学习专家更关心模型的预测能力。”感觉机器学习是一个很工业化的概念,很多流行的方法确实没有太多的数学和统计学上的可解释性,特别是在深度学习领域,大家只知道这么做效果好就一起这么做了。但是很多做机器学习的书籍又喜欢一上来一大段公式,搞得机器学习是一门很严谨的数学学科似的,拔高门槛,让人们对机器学习敬而远之。而其实基于目前的开源实现,机器学习的入门门槛不见得比 Spring 之流高多少。有一些使用经验就能很容易的将业务需求转换成实际产出。只是目前认为制造的门槛太高,现代程序开发分工明确,不是所有写代码的人都需要了解汇编,也不是所有做机器学习的人都需要数学扎实。目前来看,机器学习转换成实际业务产出的条件已经具备,需要的只是如何具体实施的尝试了。
原来看它是一座山,现在看它还是一座山,但能迈过。
《程序员的数学》阅读总结
数学学了18年,有时候也不知道数学有什么用。代码写了10年,也觉得用到数学的时候少。只有在最近逐步接触了机器学习和数据挖掘相关的知识,才渐渐明白了数学的重要性。翻出大学的《高等数学》、《线性代数》和《概率统计》,看着满本书的公式和习题,着实需要很大的毅力才能坚持把这些书在看一遍。指导发现了这本《程序员的数学》。这个月看的是第一部,后面还有《程序员的数学2:概率统计》和《程序员的数学3:线性代数》。
这本书面向程序员介绍了编程中常用的数学知识,主要是培养程序员的数学思维。讲解了二进制计数法、逻辑、余数、排列组合、递归、指数爆炸、不可解问题等许多与编程密切相关的数学方法,分析了哥尼斯堡七桥问题、少年高斯求和方法、汉诺塔、斐波那契数列等经典问题和算法。书有着相当不错的易读性和趣味性,虽然讲的都是简单问题,但是讲解的方式和方法还是比较有意思的。
数学不算是编程的基础,但绝对是机器学习和数据挖掘的基础。程序员不需要太多的数学基础。真正需要数学的都是在具体领域里。跟编程结合最紧的,是具体数学,主要是离散数学和组合数学的内容,这一类数学跟程序员的思维密切相关,算跟工作结合比较紧密的。更多的数学则根所在的领域有关:做图形学,以线性代数、几何为基础;而做数据挖掘或者机器学习的,更涉及统计学习理论和最优化的部分。
也许数学对于一个不错的程序员来说,没那么重要,但是要再往上走一步,有一点点技术上的创新,就都是数学的事儿了。有人说过“如果你只想当个Good Programmer,那么数学不重要。但是如果你想当个Great Programmer,那么数学很重要。”
机器学习这个方向,相关资料都大量依赖于线性代数和概率论,以及一点点微积分。所以,如果希望做点有追求的技术工作的话,需要开始花点时间学习数学了。其实万事开头难,如果真的按下心来,看上一个小时,这么坚持个一月,其实就会发现,这没啥难的,就当学门新的编程语言吧。
《七周七并发模型》阅读总结
《七周七并发模型》是介绍并发模型的好书,值得一读。最近是第二遍读这本书了。
很多开发者,对并发模型却只知道多进程和多线程这两种。这本书是全面介绍并发模型的一本非常好的书,介绍了许多非常有用的并发模型:
1. 最基础的线程和锁模型,这个做过Java并发编程的都会有一定的了解。
2. 通过无变量的函数式编程实现并发,是无锁并发的一种模型。函数式编程在一些数值计算的领域有广泛的使用,支持并发应该算是其中很重要的一个特性。
3. 状态和标识的分离,类似数据库里面的事务管理,不过是由编程语言在内存中支持的,可以轻松实现内存事务模型。这本书通过 Clojure 作为示例语言。这种事务模型只在数据库上接触过,也比较熟悉,但是在编程语言层面却是一个新的体验,很有趣
4. Actor 模型是容错性非常高的分布式并发模型,这是 Erlang 的核心概念,在 Java 和 Scala 中也有 Akka 的实现。感觉基本的思想就是将任务分块,分发到每个 Aactor 的 Mailbox 里面由每一个 Actor 自己执行,各自独立完成任务,避免使用同一份数据而产生冲突。
5. CSP 模型是另一种分布式并发模型,很 Actor 模型很像,这个在 Go 里面有 goroutine 的实现。
CSP 通常是同步的,Actor 通常是异步的;CSP 中的 Channel 通常是匿名的, 而 Actor 是有标识的;在 CSP 中,只能通过 Channel 在任务间传递消息, 在Actor中,可以直接从一个 Actor 往另一个 Actor 传输数据;CSP 中消息的交互是同步的,Actor 中支持异步的消息交互。
这是从网上找到的资料,未经过实际使用的体验。
6. GPU 的并行计算主要针对数据密集型计算的并行。将数据划分成很多块,然后由统一的指令执行,Single Instruction Multiple Data (SIMD)。CUDA、OpenCL 这些高性能计算框架都是这么干的。
7. Lambda架构,应该说是目前很多大数据处理系统的指导思想。Lambda架构的主要思想就是将大数据系统构建为多个层次,Batch Layer(存储 Master Dataset,不变的持续增长的数据集并针对这个 Master Dataset 进行预运算)、Serving Layer(对 Master Dataset 随机访问并更新 Master Dataset)、Speed Layer(通过快速、增量的算法对更新到 Serving Layer 带来的高延迟的一种补充,最终 Batch Layer 会覆盖 Speed Layer)
这种非工具技术书阅读带来的收获更多的是思想上的提升和视野的开阔,一段短短的总结实在无法表达太多的东西。粗浅的阅读总结。
在 Linux 中通过命令行关闭显示
It turns out the solution is very simple. The xset command is the X server preferences command. It has a simple command to turn off the monitor:
$ xset dpms force off
and to turn the monitor back on:
$ xset dpms force on
You can also check the status of the X server settings by using:
$ xset -q
来源: How To Turn Off Your Monitor Via Command Line in Ubuntu | systemBash
更新所有的 Docker Images
docker images | awk ‘{print $1}’ | xargs -L1 docker pull
来源: Update all Docker Images at once by stefanXO
docker images \ | awk '$1 !~ /halo9pan/ { printf ("%s:%s\n", $1, $2) }' \ | awk '/^REPOSITORY|/ {next} {print $1}' \ | xargs -L1 docker pull
docker images \ | awk '$1 ~ // {print $3}' \ | xargs -L1 docker rmi
docker images \ | awk '$1 ~ /halo9pan/ {print $1":"$2}' \ | xargs -L1 docker rmi