前言:
找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑该岗位,毕竟在机器智能没有达到人类水平之前,机器学习可以作为一种重要的手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大。
关键公式:
伪代码(pseudo_code):
计算训练集中到该点的距离
选择距离最小的k个点
返回k个点出现频率最高的类别作为当前点的预测分类
def knn(in_x, data_set, labels, k): diff_mat = tile(in_x, (data_size,1)) - data_set sq_diff_mat = diff_mat**2 distances = sq_diff_mat.sum(axis=1)**0.5 sorted_dist_indicies = distances.argsort() for i in xrange(k): vote_label = labels[sorted_dist_indicies[i]] class_count[vote_label] = class_count.get(vote_label, 0) + 1 sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
关键公式:
决策树中很重要的一点就是根据信息熵的大小选择一个属性进行分枝,因此要注意一下信息熵的计算公式,并深入理解它。
伪代码(pseudo_code):
检测数据集中的每个子项是否属于同一分类:
If so return 类标签;
Else
寻找划分数据集的最好特征
创建分支节点
for 每个划分的子集
调用函数createBranch并增加返回结果到分支节点中
return 分支节点
原则只有一个,尽量使得每个节点的样本标签尽可能少,注意上面伪代码中一句说:find the best feature to split the data,那么如何find thebest feature?一般有个准则就是尽量使得分支之后节点的类别纯一些,也就是分的准确一些。如(图一)中所示,从海洋中捞取的5个动物,我们要判断他们是否是鱼,先用哪个特征?
关键公式:
为什么
机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(如一封电子邮件)是实例,而电子邮件中的某些元素则构成特征。我们可以观察文档中出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目一样多。假设词汇表中有1000个单词。要得到好的概率分布,就需要足够的数据样本,假定样本数为N。由统计学知,如果每个特征需要N个样本,那么对于10个特征将需要
如果特征之间相互独立,那么样本树就可以从
是什么
朴素贝叶斯在概率图模型中被划为判别模型(Discriminative model),经典贝叶斯公式,如(公式一)所示:
下面进入“正规”的机器学习,之所以“正规”是因为它开始要建立损失函数(cost function),接着优化价值函数求出权重,然后测试验证。这整套流程是机器学习必经环节。
关键公式:
理论参考机器学习理论与实战(五)支持向量机
伪代码(pseudo_code):
创建一个
当迭代次数小于最大迭代次数时(外循环)
对数据集中的每个数据向量(内循环):
如果该数据向量可以被优化:
随机选择另外一个数据向量
同时优化这两个向量
如果两个向量都不能被优化,退出内循环
如果所有向量都没被优化,增加迭代数目,继续下一次循环
关键公式:
AdaBoost意为adaptive(自适应) boosting原理:
关键公式:
回归意为数据进行曲线拟合。
损失函数:
线性回归
即经典最小二乘法,说到最小二乘法就不得说下线性代数,因为一般说线性回归只通过计算一个公式就可以得到答案,如(公式一)所示,其中“w帽”为当y投影到X的列空间后的估计参数:
如何解得公式一呢,这里给出投影解法,后续几个回归类推。首先,咱们先来了解误差函数(公式二)
这下(公式三)和(公式一)完全一样了图中a相当于公式一中X,b相当于式中的y,X相当于式中的
前一节的回归是一种全局回归模型,它设定了一个模型,不管是线性还是非线性的模型,然后拟合数据得到参数,现实中会有些数据很复杂,肉眼几乎看不出符合哪种模型,因此构建全局的模型就有点不合适。这节介绍的树回归就是为了解决这类问题,它通过构建决策节点把数据切分成区域,然后局部区域进行回归拟合。先来看看分类回归树(CART,Classification And Regression Trees),这个模型优点就是上面所说,可以对复杂和非线性的数据进行建模,缺点就是得到的数据不容易理解。顾名思义,它既可以做分类也可以做回归,至于分类前面已经说过了,这里略过。直接看伪代码吧。
伪代码(poseudo_code):
对每个特征:
对每个特征之:
将数据急切分成两份
计算切分的误差
如果当前误差小于当前最小误差,那么将当前切分设定为最佳切分并更新最小误差
返回最佳切分的特征和阈值
下面就是无监督学习方法,所谓无监督学习也就是没有标签,对样本进行聚类分析、关联分析,这两大类都可以说的很简单也可以说很复杂,学术的东西本身就一直在更新着。
k-均值聚类可以扩展一下形成层次聚类(Hierarchical Clustering),也可以进入概率分布空间进行聚类。而关联分析又是另外一个比较有力的工具,它又称为购物篮分析,我们可以大概体会它的用途,挖掘之间的关系,经典故事就是啤酒和尿布的关联。另外提一下,google搜索的两大核心技术:深度学习和知识图。深度学习就不说了,知识图就是挖掘关系。找到了关系就是找到了金矿,关系也可以用复杂网络(complex network)来建模。好今天就聊到这里,来看看k-Means的伪代码:
创建k个点作为起始质心(经常是随机选择)
当任意一个点的蔟分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到据其最近的蔟
对每一个蔟,计算蔟中所有点的均值并将其做为质心
《机器学习实战》的最后的两个算法对我来说有点陌生,但学过后感觉蛮好玩,了解了一般的商品数据关联分析和搜索引擎智能提示的工作原理。先来看看关联分析(association analysis)吧,它又称关联规则学习(association rule learning),它的主要工作就是快速找到经常在一起的频繁项,比如著名的“啤酒”和“尿布”。试想一下,给我们一堆交易数据,每次的交易数据中有不同的商品,要我们从中发掘哪些商品经常被一起购买?当然穷举法也可以解决,但是计算量很大,这节的算法Apriori就是解决此类问题的快速算法。Apriori在拉丁语中表示“from before”(来自以前)的意思,在这里就是来自于子集的频繁信息咯,不懂,别着急。下面给出几个简单的交易数据,如(图一)所示:
支持度=(包含该子集的交易数目)/总交易数目
比如{豆奶}的支持度为4/5,有四条交易数据都有豆奶,而{豆奶,尿布}的支持度为3/5。
置信度只是针对像{尿布}->{葡萄酒}的关联规则来定义的:
尿布到葡萄酒的置信度=支持度({尿布,葡萄酒})/支持度(尿布)
比如在(图一)中,{尿布,葡萄酒}的支持度为3/5,而尿布的支持度为4/5,那么尿布->葡萄酒的可信度为3/4=0.75。
FP-growth算法只需要对数据库进行两次扫描,而Apriori算法对于每个潜在的频繁项集都会扫描数据集判定给定模式是否频繁,FP-growth比Apriori算法快。缺点:实现复杂
为什么
当运算需求超出了当前资源的运算能力,可以考虑购买更好的机器。另一个情况是,运算需求超出了合理价位下所能够买到的机器的运算能力。其中一个解决办法是将计算转成并行的作业,MapReduce就提供了这种方案的一个具体实施框架。在MapReduce中,作业被分成map阶段和reduce阶段。
是什么
一个点行的作业流程是先使用map阶段并行处理数据,之后将这些数据在reduce阶段合并。这种多对一的模式很经典,但不是唯一的流程方式。mapper和reducer之间传输数据的形势是key/value对。一般地,map阶段后数据还会按照key值进行排序。Hadoop是一个流行的可运行MapReduce作业的Java项目,它同时也提供非Java作业的运行支持,叫做Hadoop流。
怎么做
Amazon 网络服务(AWS)允许用户按时长租借计算资源。弹性MapReduce(EMR)是Amazon网络服务上的一个常用工具,可以帮组用户在AWS上运行Hadoop流作业。简单的单步MapReduce任务可以在EMR管理控制台上实现并运行。更复杂的任务则需要额外的工具。其中一个相对新的开源工具是mrjob,使用该工具可以顺序地执行大量的MapReduce作业。经过很少的配置,mrjob就可以自动完成AWS上的各种繁杂步骤。
很多机器学习算法都可以很容易地写成MapReduce作业。而另一些机器学习算法需要经过创新性的修改,才能在MapReduce上运行。SVM是一个强大的文本分类工具,在大量文档上训练一个分类器需要耗费巨大的计算资源,而Pegasos算法可以分布式地训练SVM分类器。像Pegasos算法一样,需要多次MapReduce昨夜的机器学习算法可以很方便地使用mrjob来实现。