《集体智慧编程》学习总结

关键词:集体智慧,机器学习
作者:BIce 创建时间:2012-01-30 20:00:00

一、介绍

1.1关于《集体智慧编程》

最近看了一本书《集体智慧编程》,其中主要讲述机器学习的各种方法及其实际应用,个人觉得这本书覆盖面很全,而且难能可贵的是书中所有的算法都附有代码,都可以自己拿来实际试用。书中所写的代码是由Python语言书写而成,这带给了算法极大的可扩展性,同时这也给我带来了很大的理解困难..由于Python支持面向对象、面向过程和函数式编程,本书的算法主要由函数式编程和对象来书写,所以理解起来对于Python初学者有些难度。

1.2机器学习

         在我们拥有的大量的非随机数据中,计算机认为在这些数据中都包含这样或者那样的“模式Pattern”,机器的任务就是根据这些模式来对数据进行归纳。为了让机器可以完成归纳的任务,我们需要利用数据中算法识别的重要特征对机器进行“训练”,并由此得到一个模型。我们可以利用这个模型对未来的数据进行预测(分类),或者可以用这些模型来解释一些我们不知道的问题(特征识别、提取)

         而大多数的机器学习算法都是基于数学和统计学。机器学习算法的最重要的需求就是可以对新数据进行持续学习。

1.3简单的说

         简单来说,机器学习算法就是在数据之中找关系,而很多的应用就是在这些关系基础之上展开的,下面先以找关系的典型系统---推荐系统来简单介绍。

二、推荐系统---从找关系说起

         推荐系统是我们经常可以见的,典型的推荐方式有两种:一是像人人网的这种,对登录用户推荐可能的好友。另外一种是像Amazon的那种,对购买的客户推荐可能喜欢的书籍。而完成推荐系统,最重要的一个切入方面就是找关系

协作型过滤(Collaborative Filtering)

         当我们想要买一些东西,如电脑时,通常我们都会向了解的朋友询问他们的推荐来得到我们可能进行的选择的答案,但是选择的种类越来越多,通过一个一个询问朋友的方式已经不能满足我们的需求,由此人们开发出来一套被称为协作型过滤的技术。这也是我们用作推荐的主要技术

         定义:对一大群人进行搜索,并从中找出与我们品味相近(关系更近)的一小群人,算法对这小群人的偏爱内容进行考察,并将它们组合起来构成一个经过排名的推荐列表。

2.1数据准备

在执行机器学习算法之前,我们首先要收集好需要数据,这是机器学习算法的起点,对于推荐系统而言,如

好友关系推荐:数据则应该是人与人之间现在的好友关系,类似一个二维矩阵,如果两个人是好友关系则数据为1,否则为0,每个人的数据则为一个一维向量

而对于书籍等商品的推荐关系:数据应该是所有客户对已经购买的商品的评分数据,每个用户的数据也是一个一维向量,其中数据是用户对商品的评价情况,为15的分值。

对于大多数机器学习算法而言,一维向量是一种比较常用的数据格式,很多算法都采用这种输入。

在数据的输入上,有很多情况我们并不能直接采用原有的数据,虽是数值,但是不同数据的重要程度是不一样的,这就需要我们对数据进行缩放或者加权进行处理,才能达到比较好的效果。

2.2如何计算两组数据的关系

         在我们准备好数据之后,由上面所述,我们需要找寻数据之间的关系,其中每条数据代表一个人,作为推荐系统,我们找寻的也就是人与人之间的关系,而这个关系如何定义呢?我们使用关系的远近进行定义。计算的方法有很多种,下面列举出常用的几种:

1.         欧几里德距离

欧几里德距离的计算比较简单,就是两个向量的空间距离,差值平方和开根号。

2.         皮尔逊相关度

皮尔逊相关度与欧几里德距离不一样,它的计算是计算两组数据与某组数据的拟合程度,其中x,y坐标为两组数据的评分,如下图:

其中我们可以看到一条直线,这条直线是图上点的最佳拟合线(best-fit line),如果两组数据相似度非常的高,则这条直线的斜率应该是1,是一条对角线。皮尔逊相关系数作为一个度量两个变量间相关度的方法,它是一个介于-11的值,1表示变量完全正相关,0表示无关,-1表示完全负相关,其计算公式为:

其中N为向量的长度。

3.         Jaccard系数

4.         曼哈顿距离

5.         Tanimoto相似评价值

2.3求得推荐结果

         有了计算两组数据之间相似度的计算方式,我们就可以根据数据进行推荐了。以Amazon的书籍推荐为例,有两种实现方法:基于用户的过滤算法和基于物品的过滤算法。这两种算法的区别在于一个是以用户之间的关系作为切入点进行推荐,另一个则是基于物品之间的关系进行推荐,下面分别介绍这两种算法:

1.         基于用户的过滤推荐

首先,选择上述所描述的求相关度算法之一,对用户和所有用户进行相关度计算,得到一小组与该用户比较相近的用户群

遍历用户群中所有人评价过的商品,得到评分,根据与被推荐用户与这些用户的相似度为这些商品进行加权计分

根据最后的商品计分对商品进行排序,得到一个列表,取前N个作为推荐的商品。

2.         基于物品的过滤推荐

首先,计算商品之间的相关性(记得我们之间计算人的相关性的时候,输入为一个2维矩阵,存储每个人对商品的评分关系,现在我们只要把这个矩阵就转置即可得到物品与人评分关系的矩阵,然后对这个矩阵进行相似度计算,就可以得到物品之间的相似关系)

然后找到被推荐人曾经评过分的所有商品,遍历每个商品,找到与之相关的商品集。根据此人的评分,对相关的商品进行加权计分。

根据商品的加权计分进行排序,得到列表,其中前N个为推荐的商品。

这两种方式的示意图如下。

不同的是,由于物品之间的比较关系不会像用户间比较那么频繁地变化,所以我们可以预先计算好物品之间的管联关系,进行存储,在进行推荐的时候不用进行实时计算,直接使用即可,这样也就为大规模的数据集处理提供了比较好的解决方案,我们可以进行离线计算而在实际推荐时简单使用即可,实际推荐时效率较高,而且基于物品的比较更适合用户数据集比较稀疏(即用户只对少数产品给出评价,而大多数并未评价)的数据更加有效(计算更少,推荐也比较准确)

         通过对推荐系统的学习,我们大体了解了机器学习的一些要素,在进入具体的机器学习部分之前,我们还要学习另外一种非常有用的算法,优化算法

三、优化算法

3.1可以解决的问题

         每一个算法都是为了解决一系列问题存在的,而在这我们说的这类算法主要用户处理:受多种变量影响,存在许多种可能解的问题,以及结果因这些变量的组合产生很大变化的问题。通俗的讲就是在一个不可能完全遍历的解空间中,求得一个最优/次优解的方法。(换句话说叫做搜索问题?)

         (在这里不得不吐槽一下,有很多问题看起来就是这种无法简单求得最优解的问题,但是由于特殊的情景,或者是比较巧妙的算法,如动态规划或者贪心算法,可以使我们得到一个确定的算法而求得最优解,但是如何界定问题可以解还是必须要用优化算法?这个应该就要看人的主观能动性了,已自身的知识和对问题的理解进行判断,给出适合的方案。当然如果是肯定性的要求你给出确定算法,如测试,那就应该是能正常解出)

而优化算法对于这类问题的解决方法是:首先开始于一个随机解,然后通过某种方式采取对题解可能会有改进的方式来对其进行智能化的修正,从而得到最优解或者次优解。

3.2描述题解

         通常我们把题解描述成一个向量的形式,同时要给出向量中每个变量的值域范围。解中每个值的具体意义根据题意而定。

3.3成本函数

         为了对每个可能得问题解给出一个评判,我们需要提供一个函数来对解的好坏程度进行衡量。成本函数就是完成这个功能的,它也是优化算法解决问题的关键,通常也是不好确定的。我们需要选择好对成本有影响的变量之后,找到一个可以将它们组合在一起形成一个值的函数。

         在选择好成本函数之后,我们就可以用不同的优化策略进行解空间的遍历了,下面是常用的几个优化算法。

3.4随机搜索

         顾名思义,仅仅是随机遍历解空间,进行有限次的猜测,取其中的成本函数值最低的解为最优解。比较强势的解法,但是效率不高,确可以作为其他优化算法的基线,因为这样得出的解是最低级别的解,其他好的优化算法必须要和它的解值类似或是更好才可。

3.5爬山法

         这个算法从一个随机解开始,在其临近的解集中寻找更好的题解。(如在解空间上,对已有的随机解中的若干变量小幅度增加或者减少一定值而得的一组变化后的题解,取最好的解作为当前解再次进行迭代,直到没有更好的解为止)

         当然这种算法容易遇到成本函数局部最小值的问题,得到的解是局部最优而不是全局最优(如多峰值的函数,落到其中一个谷底,并非一定是最低点),这个问题我们可以采用随机重复爬山法,选取多个随机点,作为爬山法的初始点重复执行,取其中最优的解

3.6模拟退火法

         这个算法可以避免进入局部最小值,它的来源是来自物理学的启发。其核心思想是:如果新的成本更低,则新的解成为当前解,不过如果新的成本值更高的话,则新的解也可能成为当前题解,这依赖被解释的概率,这个概率的公式为:

其中highcostlowcost分别为上次和本次的成本值,温度temperature初始值很高,在每次迭代的过程中,temperature都会乘以一个0-1范围的冷却率,temperature就会越来越小,这样概率p就会越来越小,这样较差的结果也越来越难以被接受,直到temperature降到某个足够小的值,算法终止返回当前最低成本解。

3.7遗传算法

         遗传算法是进化算法(遗传编程)的一个简单应用,关于遗传编程,在后面会有简单的介绍。总之,遗传算法(或者是遗传编程)的主要思想就是:

首先随机产生一组解,也叫种群

在这一组解中,找到比较优秀的若干解,之间进入下一代,然后对这些优秀的解进行变异或者交叉,得到的结果加入下一代。上下两代种群的个体数是应该相同的。

对下一代种群再次进行迭代式处理,直到达到若干代数,或者在很多代的繁衍过程中都没有得到更好的题解,那么过程结束,返回最后一代中的最优值。

(同时,需要注意的是,在选取进入下一代的个体中,要加入一些普通的个体,而非仅仅加入几个最优的解,这样是为了防止“近亲结婚”的情况)。

 

总之,优化算法为我们解决一些无法得到特定解的问题时给出了一个比较好的解决方案,在我们面对一些不知道如何下手,或者不知道应该采用哪种方案的时候,可以采用优化算法帮我们选出一组最优解,作为我们继续进行的起点。(关于优化算法的应用还是比较多的,比如网络的可视化,这个会另起一篇文章说明。)

四、机器学习算法

4.1算法的类别

         机器学习的算法有很多,首先我们对这些算法的分类有个简单的认识。通常来讲机器学习算法有两种:一种是监督型算法,一种是非监督型算法。

监督型算法:即在机器学习的过程中,给定输入,有确定的输出来矫正学习,这样的算法有很多,如神经网络,决策树,支持向量机,贝叶斯过滤等等。这类算法主要进行的工作是对未来的数据分类进行预测。而这些方法都可以作为分类器。而在这些方法中按对输入的要求有适合完成数值预测的如神经网络,支持向量机,不适合做数值预测如决策树.

非监督型算法:这大类算法并不用有正确答案的数据对算法进行训练,它的主要目的是在一组数据中找出某种结构。(也就是特征提取)这种结构是我们要的结果,可以用来分析某些情景。这样的算法有,聚类,非负矩阵因式分解,自组织映射等等。

4.2关于分类

         其实大多数机器学习算法最终实现的工作就是将数据进行分类,其结果是各种各样的分类器?监督型算法的目的是要讲未知数据划分到已知的某类当中,而非监督算法则是对数据进行划分,找到数据之间的关系

 

下面根据监督型和非监督型算法,简单对这些算法进行记录,由于自身知识缺乏,对下面所述算法也不是很了解,紧紧了解大概,等看完《模式分类》再进行补充完善。

五、监督型算法

5.1神经网络

神经网络是一种比较常用的监督型算法,它模拟人大脑的组成,来进行学习。它可以应用的场景有很多,但是有一个很明显的缺点是它关于结果的推理过程是不可见的,也就是虽然它可能会给出一个很好的预测结果,但是我们确并不知道为什么会有这样的结果..

(神经网络可以用于分类问题,也可用作数值预测问题)。

神经网络是由神经元(节点)组成,它们彼此互连,神经网络有很多种,一种常用的神经网络称为多层感知机(multilayer perceptron ,MLP)网络。

5.1.1多层感知机网络

         这种网络的特点是由多层神经元组成,其中

第一层神经元接收输入,(也就是每一个神经元对应一个变量)

最后一层神经元给予输出,(在分类的情况下,最后一层每一个神经元代表一个分类)

中间层,可能有一个到多个,也被称为隐藏层,其职责是对输入进行整合

所有位于输入层的节点都与所有位于隐藏层中的节点相连接,而所有位于隐藏层中的节点也都与所有位于输出层中的节点相连接(只有一个隐藏层的情况)

神经元之间的连接是有权重的,这个连接强度是我们需要训练的对象。

下面所说的一般都是只有一个隐藏层的感知网络。

5.1.2神经网络的建立

         在一般情况下,我们在使用神经网络的时候网络中的节点已经是建立好的,我们可以预先建立一个有大量节点的隐藏层,同时,我们也可以选择自己建立网络。

在建立神经网络的过程中,由于输入和输出变量是固定的,也就是第一层和最后一层节点是固定的,所以我们主要需要创建的是隐藏层的神经元以及神经元相互之间的连接。而关于隐藏层节点的创建,一种可以采取的策略是,每当出现一个未曾出现的输入组合时我们就建立一个隐藏层的神经元,并且建立好它与所有第一层和最后一层的连接并赋予默认强度。

5.1.3神经网络的正向运行

         下面我们给出神经网络的一次输入到输出的过程。

首先,我们需要一个用以指示每个节点对输入的响应程度的函数,我们采用的是反双曲正切变换函数(hyperbolic tangent, tanh)

函数的x轴为对节点的总输入,Y轴为节点输出。我们注意到这是一个S型函数,而神经网络在选择这些函数的时候几乎都选择S型函数。

神经网络一次从输入到输出的过程:根据第一层的输入和连接强度,我们求出对于隐藏层节点的总输入sum,然后将sum传入tanh函数中,得到隐藏层的输出,同理,我们也可以求得最后一层的输出,这样,一次输入到输出完成了。

5.1.4神经网络的学习方式---反向传播

         对于神经网络的训练(修正连接的强度),我们采取前馈法。我们将使用的算法称为反向传播法,因该算法在调整权重值时是沿着网络反向进行的。

         在训练时,我们知道每个输出节点的期望输出,如果我们想修正目标输出到期望输出的话,唯一一种方式是修改神经元节点的总输入,而改变总输入的方式即为修改连接强度

         传播步骤为:

对于输出层,计算期望值与实际值的差值,传入tanh斜率函数(求导?),求得对于输出层神经元的整体输入需要修改的值,根据当前强度值和学习速率(一个常数),对每个相关的与隐藏层节点相关的连接进行强度值修正。

对于隐藏层,计算由输出层反馈而来的改变需要改变的量,带入tanh斜率函数求得需要的总输入量修改,根据当前连接强度和学习速率,修改每个与输入层相连的连接强度。

这样,我们完成了一次由输出层到隐藏层,以及隐藏层到输入层的连接强度修正。

5.1.5 使用

通过重复执行反馈过程直至输出差值小于某个常数或者迭代代数达到一定数目即可停止。我们即得到了一个可以使用的神经网络,就可以未知数据进行预测了。

5.1.6优点与缺点

优点:可以处理复杂的非线性函数,并且可以发现不同输入之间的依赖关系,支持增量式训练(面对新数据时可以不用重新训练之前的数据)

缺点:是一种黑盒方法,推导过程不可知,而且在选择训练数据和比例及问题相适应的网络规模方面,并没有明确的规则可以遵循,最终的决定往往需要依赖大量的实验。

另外,由于数据有噪声,所以在进行归纳的过程中不能要求输出与期望完全吻合,这样会产生过度归纳(over generalize)的现象。

5.2贝叶斯分类器

         贝叶斯分类器是一种比较常用的分类方法,在《集体智慧》一书中,它被用作文档过滤技术。但是它也可以用作任何其他形式的数据集上。(只要能提取出特征)

而提到分类器,首先要说的就是特征,分类器的原理就是利用某些特征来对不同的内容项进行分类,而在讨论文档的过程中,特征即为单词或者短语(也可以是虚拟特征,如是否全为大写)。然后另外一个必须提到的就是概率,分类器通过计算输入在各个目标分类的概率来计算最后的分类情况。

5.2.1文档过滤计数

文档过滤技术的应用有垃圾信息(邮件)处理,文档自动分类等等。初期的文档过滤技术有基于规则的分类器等等(规则如,某些单词的过度使用,图片过多等等)

5.2.2贝叶斯定理

         之所以被称为贝叶斯分类器,是因为它运用了贝叶斯定理的内容,如下:

         即在目前文档Document的情况下,类别为Category的概率可以用:Category类别下出现文档Document的概率(朴素算法,Category下出现Document中单词概率乘积),乘以Category分类的概率(统计而得),除以Document文档的出现概率算得。

由于我们要比较所有CategoryDocument的概率,因此Document的概率也就可以约去,不用计算。这样文档DocumentCategory的概率就可以计算了,分类完成。

5.2.3优点与缺点

优点:与其他分类器方法相比,其最大的优点是在接受大数据量训练和查询时有所具备的高速度。即使选用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且涉及的运算也只有针对特征概率的数学运算而已。它的实际学习情况比较好解释,容易理解

缺点:无法处理特征组合产生的变化结果,仅仅能处理相互没有关系的比较朴素的情况。

另外,Mark一下,有一种另外的分类器,费舍尔方法,可以用于贝叶斯方法的替换方法,现在不了解,以后补上。

5.3决策树方法

         决策树方法是一种很有用的方法,它有非常容易解释的特点。适用于有分界点类型输入的数据。它是对被测数据进行分类的一种非常直观的方法,在经过训练后,看起来是一系列if-then-else的树一样,如图:

5.3.1决策树的使用流程

决策树方法的适用流程如下:

找到数据中可能影响结果的因素,得到变量

对变量的取值进行区间化(如是数值的话),得到区间点,或是可能值(非数值)

选择合适的拆分方案(即选择一个变量,和一个区间点对输入数据集进行拆分)

重复进行拆分过程,其间构造决策树

构造好决策树之后就可以使用它进行分类预测了。

5.3.2对决策树进行训练

         对决策树进行训练的过程,就是创建决策树过程。书中使用一种叫CART(Classification and Regression Trees)分类回归树的算法。算法首先创建一个根节点,然后通过评估所有可选的变量,从中选出比较合适的对数据进行拆分。拆分之后,再分别根据两个拆后数据集进行树的递归创建,完成决策树的创建过程。

         我们注意到,该算法需要选择一个合适的变量及值进行拆分,如何定义拆分后是合适与否,就需要一个度量的方法,我们采用基尼不纯度(Gini impurity)和熵(entropy)来衡量,测量被拆分后的两个数据集的混乱程度,选择其中最不混乱的变量和值进行拆集。

5.3. 4Gini impurty基尼不纯度

是一种度量集合有多纯的方法。指将来自集合中的某种结果随机应用于集合中某一数据项的预期误差率。(即一行数据被随机分配到错误结果的总概率,如一个集合为AABA,那么这个集合随机挑出某个元素猜测其为A的错误概率则为0.25,集合比较纯。)公式如下:

5.3.5熵和信息增益

         熵代表集合的混乱程度,计算公式为:

熵达到峰值的过程相对要慢,因此,熵对于混乱集合的判罚往往要重一些,一般评判集合我们都用熵来进行。

信息增益,是我们用来计算拆分之后的集合与拆分之前的集合的混乱程度的,其公式为,

Weight1=subset1的大小/原始集合大小

Weight2=subset2的大小/原始集合大小

信息增益gain=entropy(original) – Weight1*entropy(set1) – Weight2*entropy(set2),它用来判定集合的拆分结束与否,当拆分后信息增益小于0时就不必继续拆分。

5.3.6优点与缺点

         优点:利用它来解释一个受训模型是非常容易的,算法将最为重要的判断因素都很好的安排在了靠近树的根部位置。它还能够很容易处理变量之间的相互影响。

         缺点:不擅长对数值型数据进行预测(也可以,但是不合适,合适的如K最近邻算法),还有这种算法要求一次性给出所有的测试数据集,不支持增量的训练。(当然增量的决策树是现在的研究方向,还没有非常好的方案)

5.4K最近邻算法

         K最近邻算法(kNN)是一种通过寻找与目标商品情况相似的一组商品,对商品价格求均,完成对商品价格预测的方法。(适用于数值型数据预测的算法)

         K最近邻算法中k代表为了计算最后结果参与计算的近邻数.这个k值的选择不能大也不能小,大的话会导致不相关商品参与求均值,小的话又会导致预测缺乏通用性。(可使用优化算法进行选择K)

5.4.1定义相似度

         相似度的定义和我们在推荐系统里提过的一样,可以选择任何一个,在这里我们选择欧几里德距离作为相似度算法。

         因为在变量中,有的变量对最终价格的影响因子大,有的变量对价格的最终结果影响小,我们需要对变量进行缩放处理,来凸显变量的作用性。(缩放的参数如何确定?优化算法!)

5.4.2 最终价格计算加权knn

         在计算最终结果的时候,我们通常不应该直接将K个近邻的数据进行简单的平均计算,而是根据距离的远近进行加权计算---至此我们得到的新的加权knn算法。

5.4.3优点与缺点

         优点:可以使用复杂函数进行数值预测,同时又保持了简单易懂的特点。(相比神经网络..)而合理的数据缩放参数也可以给我们解释一些变量对于价格的作用关系。它支持增量式数据添加。

         缺点:计算量非常大,需要非常庞大的样本数据,另外寻找合理的缩放因子是比较麻烦工作。

5.5支持向量机

         支持向量机是一种最为高阶的分类器,它只接受数据集作为数字输入,并尝试预测这些数据属于哪个分类。支持向量机通过寻找介于两个分类间的分界线来构造预测模型。确定这个分界线的坐标点,是距离它最近的那些点,他们被称为支持向量

         在分界线找到之后,对新的数据,我们可以将其绘制到图上,并观察其落在线的哪一侧即可完成分类工作。(对于2维数据)

5.5.1基本的线性分类

         基本的线性分类通过寻找每个分类中的所有数据的平均值,来寻找一个代表该分类中心位置的中心点。然后通过计算被测数据与分类中心的距离,来判断所属分类进行预测。这样,在2维数据且2个分类情况,最后将得到一条分界线(通过两个中心点的连线中心,并垂直于连线的线),通过对被测数据在线的那一侧就可以判别它的分类。

         同样,不必计算距离,另外一种计算方式可以利用点积来完成上述计算。

其中C是两个中心点之间的中间,X1,X2分别为两个被测数据,通过XC与中心点连线的点积,我们就可以计算出其所在区域(点积一个为正,一个为负)

5.5.2核技法目前不理解.

         像上面给出的分类,比较简单的情况,可以找到一个直线将平面划分开,但更加一般的情况是,不存在这么一条直观的线可以将空间划分(如分布为环状或者是高维数据的情况),那又该怎么办呢?

         维数比较低的话,我们可以通过对坐标进行替换或者其他运算,把其图像改变,从而找到一个分界线,但是维数比较高的话就不可能这么简单找到了,而核技法就可以解决这个问题。它用于解决非线性的划分问题

         核技法对于所有运用到点积的算法,包括线性分类器,都可以应用,它的思想是用一个新的函数替换掉原来的点积函数,当借助某个映射函数将数据第一次变换到更高维度的坐标空间时,新函数将会返回高维度坐标空间内的点积结果。

         而在变换函数上,我们一般只采用少数的几种,书中使用径向基函数

5.5.3支持向量机

         支持向量机是广为人知的一组方法统称,思想为尝试寻找一条尽可能远离所有分类的线,这条线被称为最大间隔超平面(maximum-margin hyperplane)。而找到了这个分类线之后,我们就可以使用点积来进行预测。由于使用了点积,我们可以用核技法将分类器转换为一个非线性的分类器。

5.5.4支持向量机的应用

         支持向量机在高维数据上的表现不错,所以它经常用于解决数据量很大的科学问题。典型的例子有:

         面部表情分类,使用军事数据侦测入侵者,根据蛋白质序列预测蛋白质结构,笔迹识别,确定地址期间的潜在危害。

5.5.5LIBSVM

         SVM的数学概念很多,计算量很大,比较麻烦。所以作者为我们推荐LIBSVM这个开源库。LIBSVM是一个支持向量机的开源库,是用C++写成的,也有Java版本,它的使用是比较简单的。给出分类数据、输入数据、使用的核方法,即可自动完成SVM的创建,使用方便。

5.5.6优点与缺点

         优点:功能强大,如果参数合适,它的执行效果会超过所有其他方法,而且其预测速度很快。通过将非数值数据转换为数值输入,可以使支持向量机同时支持分类数据和数值数据。

         缺点:针对每个数据集的最佳核变换函数及其相应的参数都是不一样的,在每当遇到新的数据集时需要重新确定这些函数及其参数,另外,支持向量机也是一个黑盒技术,存在高维空间变换,其分类过程也是难于解释。

六、非监督型方法

非监督型方法所为并非预测,它的目的是找出某种结构(特征识别等等),下面列出几类非监督型方法。

6.1数据聚类

         数据聚类是一种用以寻找紧密相关的事、人或者观点,并将其可视化的方法,它常用于数据量很大的应用中,如获取消费者的购买模式?聚类在生物学中也有很多的应用。

6.1.1分级聚类

         分级聚类是通过连续不断地将最为相似的群组两两合并,构造出一个群组的层级结构。在每次合并时,算法会计算每两个群组之间的距离(选择任意一种算法),并根据距离最近的两个群组进行合并为一个新的群组(包含原两组之数据),这个过程会重复到只剩下一个群组。最终会得到一个树状图作为分级聚类的一种可视化形式。

树状图:

6.1.2列聚类

         在研究数据的时候,不光要对人与人之间的关系进行聚类,还可以通过对数据转置运行算法,对物于物之间的关系进行聚类(方便捆绑销售)

6.1.3K均值聚类

         预先给出要分成的聚类的个数,也就是K,然后算法根据数据的情况来决定聚类的大小。K均值聚类会首先随机确定K个中心点,然后将各个数据项分配给附近的中心点,得到第一次聚类结果,分配完成后聚类中心重新计算,放置在所有节点的中心处,整个分配过程重新开始,这个过程一直重复下去,知道分类不再变化为止。

6.2特征提取非负矩阵因式分解

         从数据中提取重要特征的技术,被称为非负矩阵因式分解(NMF),这种技术也很复杂需要一些简单的线性代数知识。

6.2.1输入

         我们的输入与其他的算法没什么区别,是2维矩阵,其中每行为一条数据。假设我们持有的是一个带单词计数信息的文章矩阵,每行一个文章,其中数据表示某个单词在本文章的出现次数。

6.2.2主要思想

         这种算法的主要思想是将输入矩阵进行分解,得到两个矩阵,分别是特征矩阵和权重矩阵。其二者乘积为输入矩阵,例子如图:

其中

权重矩阵将特征映射到文章矩阵,每行对应一篇文章,没列对应一个特征,表示每个特征应用于每篇文章的程度。

特征矩阵,每行为一个特征,每个单词(输入)对应一列,代表了某个单词对于特征的重要程度。

只要将权重矩阵乘以特征矩阵就可以重新构造出初始的输入矩阵。(当然完美的重现是不大现实的,算法的目标就是要尽可能地重新构造出原始数据)

NMF只所以叫做非负矩阵因式分解,就是因为矩阵中的数据都是非负值。

6.2.3具体实现

         算法的具体实现需要使用矩阵的因式分解方法进行,另外为了得到最佳的特征矩阵和权重矩阵,我们需要提供一个成本函数(计算分解后的矩阵乘积与原始数据集的差距),并使用优化算法获取一个最优分解。(书中讲应该采用的是乘法更新法则)

七、智能进化

         智能进化是一个备受瞩目的领域,具体的技术为遗传编程(genetic programming)。它的应用有很多,比如游戏AI的生成,数学函数的自动生成以及如NASA天线设计、量子计算系统等等。

7.1遗传编程

遗传编程是受到生物进化理论的启发而形成的一种机器学习技术。和优化算法中的遗传算法类似,它的大体思想为:首先通过随机生成一个种群,然后通过对种群中进行执行用户定义的任务(user-defined task)展开竞争,竞争结束后我们可以得到种群中元素的表现排序(评价函数)列表。算法会选取种群中优秀的一些个体进入下一代,并且对这些个体进行变异或者配对的操作生成下一代的其他个体。

而遗传编程和遗传算法的区别就是,遗传算法中的个体只是一个解,一组数据,而遗传编程中的个体是一个程序,也就是说,遗传编程,我们必须给出可以生成出程序的程序。(元程序?)而在书中给出的例子中,为了表示程序设计出了一个简单语法树的结构来表示程序。

而遗传编程的终止条件为:

找到最优解

找到了表现够好的解

题解在数代之后都没有得到任何改善

繁衍代数达到了规定的限制

7.2遗传编程大体过程

7.3变异和交叉

         变异和交叉是遗传的两种重要方式,在种群中,我们也要实现这两种方式。其中:

变异:对种群的某个个体进行少量修改。在本书中则是对生成的程序进行少量修改,如语法节点替换等等。

交叉:在种群中选择两个优秀的个体,将其组合在一起构造出新的程序。本书例子中是将两个语法树的某些部分交换而成

另外,对于变异,要在满足一定概率的情况下由任何个体进行,不能频繁改变,而交叉则主要是在填充下代种群时由两个优秀个体进行。

7.4多样性

         为了保持种群的多样性,防止种群变得极端同质化,也称近亲交配,我们就有必要除了保持优秀的个体之外还要保持一些表现一般的个体,用于保持种群的多样性。这样以得到更好的结果

7.5优点与缺点

         优点:功能强大,可以用于多种领域

         缺点:受计算能力所限,耗时,且构造起来比较麻烦。

其他

1交叉验证

交叉验证是一种将数据拆分成训练集与测试集的一系列技术的统称,我们将数据拆分成大小两个部分,其中大数据部分用作训练集对监督算法进行训练,而小数据对结果进行测试,这样我们就可以得到算法预测的准确程度。

2多维缩放

         多维缩放也是一种非监督技术,它的作用不是要做预测,而是要使不同数据项之间的关系变得更加容易理解。它的主要作用是将高维数据转换为低维的表现形式。(将高维数据画到二维图纸上。)

         简单过程为:

1.       首先计算高维数据,各数据之间的距离

2.       将高维数据随机放置到二维图上(标尺比例对应)

3.       针对每两个数据项,计算目标距离与实际距离的差值,根据总体情况,将每个数据项对应的位置移近或者移远少许(for for)

4.       重复直至整体误差不再减少。

其中,每个点的移动都是在其他所有点的影响下进行,当最后误差不再减少之时就可以结束算法,对数据进行绘制了。

3开放平台

读完本书,最大的感触是作者的写作中,每一章给出的例子都是可以执行的,而且很多都是使用一些开发平台的api的,很长见识,正好最近了解了下新浪微博的开发平台,发现大同小异,虽然还是有很多的限制,不过确实开了开眼界。

像作者在全书最后说的:将机器学习、开放API、以及面向公众的参与模式结合在一起,将会迸发出各种各样的可能性。以后也要更加努力。~

留言功能已取消,如需沟通,请邮件联系博主sunswk@sina.com,谢谢:)