0. 前言和准备工作

总而言之首先非常感谢我的导师给我提供了这样一个学习的机会。这次能去北京学习也是倍感荣幸,尤其是得知主讲老师是王斌老师之后尤为激动。

当然这篇日志,应该是这几天的日志都可能像流水账一样记录下课程中的有趣的问题和有趣的问题。当然你懂得我的有趣一般都比较有趣:)

それじゃあ、はじまりよ!

环境搭建

首先简要介绍下我个人电脑的环境

CPU Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz

RAM 8.0 GB DDR3 1600MHz

OS Microsoft Windows 10.0.10240 Build 10240

Type x64-based PC

其次是目前所运行的开发软件环境

Microsoft Visual Studio 2013

Matlab R2015a x64

Python 3.4

Anaconda3-2.3.0-Windows-x86_64

Python 3.5 + numpy 1.9.3 + ipython 4.0.0 + WinPython 3.4.3.5(Release 2015-06)

前两种软件不做任何安装说明,因为是傻瓜式安装,基本不会遇到什么问题。

后者的问题就。。。

先说python。python终于还是修到了3.5和2.7.10,然而,并没有什么卵用。

Linux上面自然不用多说,方便得很,什么什么apt-get一下就搞定了,教程很多也很方便。

但是windows就不是什么省油的灯了。我也是刚刚这个中午才了解到windows的python全是用VS2008的企业版编译连接的。

那么问题来了,怎么安装自定义的包?

方法一:

pip install --packagename

这个招对于绝大部分的管用,但是很多时候会遇到没有编译器或者更直接的是 unable to find vcvarsall.bat。这个就是我刚才提到的编译器的问题。下面会补上。

方法二:

找 windows 的 (\*.exe)(\*.msi) 包,直接安装。

值得注意的是务必看准 python 版本,比如我现在用的是 3.5,那么其他版本都是不能用的。

方法三:

对于没有编译好的原始代码包,如果并没有用到太多底层的东西,可以直接下载源代码本地编译即可。

一般的操作都是简单的

python setup.py install

或者看 readme 的介绍。

方法四:

对于有人提前编译过的适合你的平台的包,并且制作成轮子文件了 (\*.whl),那么只需下载并且

pip install --packagewhellname

回到方法一的问题,标准解决方案是,安装一个 VS2008 企业版然后编译即可,或者修改环境变量中的 VS120COMNTOOLS 之类的到真实的有 vsvarsall.bat 的文件夹里。然而我这里不管怎么修改怎么添加都没用。

所以我的建议是,下载并安装编译好的轮子。这里给出一个传送门

然而

当然,我这里的环境配置路线其实还是比较简单清楚的

  • 从官网下载python3.5
  • pip install pyreadline
  • pip install ipython
  • 从官网下载WinPython
  • 从上文中的传送门下载”numpy-1.9.3+vanilla-cp35-none-win_amd64.whl”
  • pip install “numpy-1.9.3+vanilla-cp35-none-win_amd64.whl”
  • pip install pylab

然而最后的最后我还是直接安了一个 Anaconda3(逃

1. What are they talking about?

抱歉,其实今天一天没讲什么,主要讲的全是概要性的介绍啊,可以应用到哪些领域啊之类的,不过我还是记下了一些有趣的地方。

(1) Search Engine

搜索引擎也是基于机器学习搞出来的一个很有趣的设备(玩具)。同时也得知了一些有趣的应用。一开始大家的思路似乎都是很轻松的基于词频来进行搜索结果的排序,再后来由于有网站恶意开始对基于词频这一点进行攻击,“我告诉大家我叫XX网站”也逐渐改变成“他们都叫我XX网站”,也就是著名的 pagerank 的雏形了。

不过有趣的是,SEO,这个服务和搜索引擎的对抗,往往更能体现出搜索引擎算法的进化。除了国内某公司的手动权重分之外,借助某些 SEO 团队的“殚精竭虑”所试验出的方案往往会直接放倒甚至是google这样的良心公司。

所以,目前依旧是,人工智能还得管人类叫爷爷咯!

再过 50 年呢?

(2) Paper Duplicate Checking/Code Duplicate Checking

论文查重和代码查重两个看似一家,实际上差别还是有很大的。查重问题,简单了讲,就是预先录入好很多样本之后,通过判断新来的和样本的相似度,来决定出是否涉嫌抄袭。这里的主要难度就在于特征选取了。

特征选取听了老师讲解之后,感觉还是人为的因素更重一些。就英文文献而言,词汇不能选择过于偏僻的(容易出现噪音),也不能选择过于简单的(并没有实际意义)。两者都会造成噪音,后者的噪声程度更是难以想象。而中文文献就更坑了,因为中文是典型的非字母文字,更别提分词这个事情了。

代码查重这个技巧就更多了。变量名?函数名?乱七八糟无从下手。但是平时看到代码还是很容易一眼分辨出来到底是不是抄出来的。

也就是讲,特征选取,一定要选到不变量。

就代码查重而言,如果两段代码的算法思路一样,最终结果一样,那么其代码的逻辑必定相似。不过代码逻辑这个似乎也不好量化,但是却容易想到其他的东西,比如函数调用的总次数,变量的总个数,赋值语句的总数,等等。不过最近看了一些编译器相关的书籍,学到了一些编译器优化的小技巧,倒是想到了一个主意,那就是对每一个变量 统计其参与赋值,逻辑控制的次数,然后分别统计赋值操作1-5次的变量多少个,6-10次的变量多少个,11-15次的变量多少个,等等,再统计参与逻辑控制的次数,然后以此作为一组特征进行评价。

抱歉,脑洞打开了。

(3) TFIDF and Entropy

这个问题是老师上课提到的:很多人都说我们这个抬不起头来,因为我们的用词频权重(TF, a.k.a Term Frequency)和逆文档频率(IDF, a.k.a Inverse Document Frequency)的乘积作为最终的向量空间的权重并没有太好的理论依据。不过还好临走前把信息论作业抄完了,将将会信息熵这个概念,我就班门弄斧证明一个

首先还是先整理下目前用到的名词:

  • 词频 :这个词频有很多种方案,比如直接用原始的频率,也可以取个对数(怎么取当然是随意搞),也可以归一化频率,这个也是随意搞。我这里假设,对于单词 表示其在文档 中出现的次数,那么显然有对于单词 的词频为
  • 逆文档频率 :也就是文档频率的倒数,再取对数。文档频率指的是,一个词汇 在整个文档集合 中,出现的频率,不妨假设词汇 在文档集合 出现的次数是 ,那么显然有对于单词 显然有

可能写到这里基本上就出来了,不过还是写完好了:

针对文档,有:

注意到此时的结果实际上便是文档 的信息熵,即证。

(4)Best Algorithm and Most Data

It’s not who has the best algorithm wins, it’s who has the most data.

这句话给我的感触很深,震撼之余由不得敬佩三分。诚然,有的时候算法的反馈很优秀,但是还是不如一个朴素的算法经过大量数据训练之后的反馈结果。

果然,真正的好方法是随机应变(逃

2. And Then What?

我准备这几天闲下来就去做下《机器学习实战》的东西,尽量一步一步来,然后也准备把这个机器学习的东西应用到我的那个教材经费计算的项目上(因为naive模型太可爱了。。。)

再说吧,7点写这个现在9点了,还是洗个澡比较好。(逃