机器学习简明原理doc47页docxWord文档格式.docx
《机器学习简明原理doc47页docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《机器学习简明原理doc47页docxWord文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
这其中有很多原因,比如数据预处理的效果、训练集的大小、特征值的选择、参数设置以及核函数的选择等因素。
任何模型都是优点与缺点并存的。
SVM的优点是:
1.可以解决线性不可分的情况。
如图2所示,两类数据点根本无法用超平面分隔开;
2.计算复杂度仅取决于少量支持向量,对于数据量大的数据集计算复杂度低。
SVM的缺点是:
1.经典的SVM算法仅支持二分类,对于多分类问题需要改动模型;
2.不支持类别型数据,需在预处理阶段将类别型数据转换成离散型数据。
类别型数据即"
男"
、"
女"
这类由字符串表示某类信息的数据,需将这类数据转换成离散型数据如1、2。
图2线性不可分问题
3.SVM基本原理
SVM原理分为软间隔最大化、拉格朗日对偶、最优化问题求解、核函数、序列最小优化SMO等部分。
虽然这些名词看起来很晦涩,但是深入探索后就会发现其中的思想并没有那么复杂。
3.1.软间隔最大化
SVM的核心思路是最大化支持向量到分隔超平面的间隔。
后面所有的推导都是以最大化此间隔为核心思想展开。
一般的机器学习问题都是先得到模型的目标函数和约束条件,然后在约束条件下对目标函数求得最优解。
因此,我们下面首先需要推导出SVM模型的目标函数和约束条件。
既然要最大化间隔,那么回顾下点x到超平面(w,b)的距离公式:
其中超平面的公式为:
由此可推出点x到超平面(w,b)的几何间隔为:
其中xi代表第i条数据,yi代表第i条数据对应的目标变量的取值,取值有+1和-1两种。
所以当第i条数据被正确分类时,y取值和w*x+b取值的正负一致,几何间隔为正;
当被错误分类时,y取值和w*x+b取值的正负相反,几何间隔为负。
图3样本数关于w*x+b的取值符号
定义几何间隔中最小的为:
由此,可以得到间隔最大化问题的目标函数:
并遵循如下约束条件:
做如下变换:
则目标函数转换为:
相应的约束条件变为:
可得目标函数和约束条件变为:
由于w,b成倍数变化并不会影响超平面的公式,所以:
此时得到最终的间隔最大化的目标函数和约束条件如下:
但是,到这里并没有真正得结束。
考虑到现实生活中的真实数据,存在一些特异点即outliers,这些数据点并不满足上面推导出的约束条件,如图4所示,图中点A就是outlier特异点。
图4Outlier特异点
为了解决这种问题,对每个样本点引进一个松弛变量,使得约束条件变为:
这样给outlier的约束条件加上一个变量,使其可以满足大于等于1的条件。
则相应的目标变量变为:
其中C为惩罚参数,它的目的是使得目标变量最小即几何间隔最大,且使得松弛变量最小化。
加入松弛变量的目标函数就是软间隔最大化。
3.2.拉格朗日对偶
对于凸二次优化问题,通过引入拉格朗日乘子,将目标函数和约束条件整合到拉格朗日函数中,这样能方便求解最值问题。
那么,对每个不等式约束引入拉格朗日乘子,得到拉格朗日函数如下:
分析可知:
则原最优化问题转换成:
由于原最优化问题直接求解很困难,利用拉格朗日对偶性,可通过求解原最优化问题的对偶问题得到原问题的最优解。
原最优化问题的对偶问题为:
3.3.最优化问题求解
到此为止,已经将目标函数和约束条件转换成了极大极小化拉格朗日函数的问题了。
首先求解关于拉格朗日函数的极小化问题。
对三个变量分别求偏导得:
将以上三式带入拉格朗日函数中得:
那么极大极小化拉格朗日函数转换成:
为求解方便,将极大转换成极小得:
3.4.核函数
对于线性不可分问题,如图2所示,这类问题是无法用超平面划分正负样本数据的。
倘若能将超平面换成超曲面,则可以将正负样本正确分类,如图5所示。
图5超曲面分离正负样本
我们知道曲面的公式是:
映射到新坐标如下:
可将超曲面在新坐标下表示成超平面:
也就是将在二维空间(x1,x2)下线性不可分的问题转换成了在五维空间(z1,z2,z3,z4,z5)下线性可分的问题。
得映射后新坐标下的内积:
有一核函数如下:
可知
何为核函数?
核函数在低维空间中完成了映射到高维空间后的内积运算。
这点非常有用,利用核函数,无需先将变量一一映射到高维空间再计算内积,而是简单得在低维空间中利用核函数完成这一操作。
为什么说不用一一映射到高维空间很有用呢?
原因就在于首先我们无法针对每种情况提供精确的映射函数,再者对于需要映射到无穷维的情况显然无法一一映射完成。
那么为什么是映射到高维后的内积运算呢?
这是因为在上节中我们得到了如下目标函数:
正是因为该目标函数中包含自变量的内积运算,而映射到高维空间后的内积运算又恰好可以通过核函数在低维空间中直接求得,故而有了核函数的由来。
较常用的核函数是高斯核,高斯核可以将低维空间映射到无穷维。
运用核函数后,最优化问题的目标函数和约束条件变为:
3.5.序列最小优化(Sequentialminimaloptimization)
到目前为止,优化问题已经转化成了一个包含N个alpha自变量的目标变量和两个约束条件。
由于目标变量中自变量alpha有N个,为了便与求解,每次选出一对自变量alpha,然后求目标函数关于其中一个alpha的偏导,这样就可以得到这一对alpha的新值。
给这一对alpha赋上新值,然后不断重复选出下一对alpha并执行上述操作,直到达到最大迭代数或没有任何自变量alpha再发生变化为止,这就是SMO的基本思想。
说直白些,SMO就是在约束条件下对目标函数的优化求解算法。
为何不能每次只选一个自变量进行优化?
那是因为只选一个自变量alpha的话,会违反第一个约束条件,即所有alpha和y值乘积的和等于0。
下面是详细的SMO过程。
假设选出了两个自变量分别是alpha1和alpha2,除了这两个自变量之外的其他自变量保持固定,则目标变量和约束条件转化为:
将约束条件中的alpha1用alpha2表示,并代入目标函数中,则将目标函数转化成只包含alpha2的目标函数,让该目标函数对alpha2的偏导等于0:
可求得alpha2未经修剪的值:
之所以说alpha2是未经修剪的值是因为所有alpha都必须满足大于等于0且小于等于C的约束条件,用此约束条件将alpha2进行修剪,修剪过程如下:
由此得:
分两种情况讨论:
情况1.当y1等于y2时,有:
情况2.当y1不等于y2时,有:
修剪后,可得alpha2的取值如下:
由alpha2和alpha1的关系,可得:
在完成alpha1和alpha2的一轮更新后,需要同时更新b的值,当alpha1更新后的值满足0<
alpha1<
C时,由KKT条件得:
由于篇幅有限,在此就不把推导过程一一列举,可得:
同样的道理,当alpha2更新后的值满足0<
C时可得:
若更新后的alpha1和alpha2同时满足大于0且小于C的条件,那么b就等于b1等于b2;
否则,b取b1和b2的中点。
那么问题来了,如何选择alpha1和alpha2呢?
选择违背下列KKT条件推导结果的alpha作为alpha1:
为了让每次变化尽可能大,alpha2的选择满足如下式子最大,即步长最大化:
其中E是上面提到过的预测值和真实值差值的绝对值,也就是误差值。
按上述方法不断选择一对alpha并更新,直到达到最大迭代次数或所有alpha都不再变化,则停止迭代。
有朋友就会问,求出alpha之后呢?
如何判断新样本数据属于1还是-1呢?
别忘了,在最优化求解一节,我们得到了如下:
若f(x)大于0,则新样本数据属于1;
否则,新样本数据属于-1。
可以见得,求出alpha后,所有问题都迎刃而解了。
4.频繁项集与关联规则FP-growth基本原理
4.1.从啤酒和尿布引出的频繁项集
在上一节中,主要介绍了支持向量机SVM模型的原理和实现。
在文章一开始,笔者提到机器学习主要分为四大类,分别是分类,聚类,回归和关联分析。
第一篇中的SVM就属于分类。
那么下面笔者开始介绍关联分析。
关联分析分为频繁项集挖掘和关联规则挖掘。
生活中的数据本身包含着各种规律,机器学习模型可以从数据中挖掘出这些规律,啤酒与尿布就是一个典型的例子。
有研究发现,在超市的订单记录中,啤酒和尿布总是频繁共同出现在同一条订单记录里。
换句话说,买尿布的人,往往会顺手买啤酒。
这就引出了本文的主题之一,即频繁项集。
频繁项集是在数据库中大量频繁出现的数据集合。
那么发现这些频繁项集有什么意义呢?
1.用于制定营销策略。
如同啤酒与尿布的例子,超市如果将啤酒和尿布放在相邻的位置,会增加两者的销量。
还可用于制定打折促销活动,给买了啤酒和尿布的客户打折,也可以增加销量。
2.用于发现共现词。
这种场景其实我们经常会遇到。
当我们在浏览器中输入"
频繁项集"
时,浏览器自动弹出如"
频繁项集置信度"
,"
频繁项集关联规则"
等备选记录,我们每每都会感叹浏览器的智能,其实这里的秘诀就是频繁项集。
也就是说,在大量的用户搜索记录中,"
和"
置信度"
共同出现在了大多数的搜索记录中。
同理,"
关联规则"
也频繁得共同出现在搜索记录中。
3.用于发现事物的热点信息。
从新闻报道和微博中获取关于某事物的相关文档,然后应用频繁项集挖掘算法可以得到该事物的热点新闻。
主流的频繁项集挖掘算法有Apriori和FP-growth。
其中Apriori算法需要多次扫描数据库,这就使得该算法本身不适合大数据量。
FP-growth,即FrequentPatternGrowth,它通过构建FP树(即FrequentPatternTree)这样的数据结构,巧妙得将数据存储在FP树中,只需要在构建FP树时扫描数据库两次,后续处理就不需要再访问数据库了。
这种特性使得FP-growth算法比Apriori算法速度快。
FP树是一种前缀树,由频繁项的前缀构成,具体细节会在频繁项集挖掘原理一节介绍。
挖掘出频繁项集后,可以从频繁项集中进一步挖掘关联规则。
4.2.关联规则简介
关联规则是在频繁项集的基础上得到的。
关联规则指由集合A,可以在某置信度下推出集合B。
通俗来说,就是如果A发生了,那么B也很有可能会发生。
举个例子,有关联规则如:
{'
鸡蛋'
'
面包'
}->
{'
牛奶'
},该规则的置信度是0.9,意味着在所有买了鸡蛋和面包的客户中,有90%的客户还买了牛奶。
关联规则可以用来发现很多有趣的规律。
这其中需要先阐明两个概念:
支持度和置信度。
4.2.1.支持度Support
支持度指某频繁项集在整个数据集中的比例。
假设数据集有10条记录,包含{'
}的有5条记录,那么{'
}的支持度就是5/10=0.5。
4.2.2.置信度Confidence
置信度是针对某个关联规则定义的。
有关联规则如{'
},它的置信度计算公式为{'
}的支持度/{'
}的支持度。
假设{'
}的支持度为0.45,{'
}的支持度为0.5,则{'
}的置信度为0.45/0.5=0.9。
关联规则用于发现if->
then这样的规则,并可以给出这条规则的可信度(即置信度)。
现实场景中可以用来发现很多规律,下面举个例子。
在信息安全领域,需要根据已有流量数据制定规则,来判断是否触发安全报警。
如规则{'
数据包大'
,'
多个ip地址同时发送数据'
异常'
},该规则的置信度为0.85。
这条规则表示,当流量数据包大,并有多个ip地址同时向目标ip发送数据时,则有85%的概率存在异常,需要触发报警。
4.3.频繁项集挖掘原理
频繁项集挖掘分为构建FP树,和从FP树中挖掘频繁项集两步。
本节用如下表所示的数据集作为例子展开,该示例数据集共四条数据。
表格1示例数据集
数据集
a,b,c
c,d,b,a
d,e,a
b,a
4.3.1.构建FP树
构建FP树时,首先统计数据集中各个元素出现的频数,将频数小于最小支持度的元素删除,然后将数据集中的各条记录按出现频数排序,剩下的这些元素称为频繁项;
接着,用更新后的数据集中的每条记录构建FP树,同时更新头指针表。
头指针表包含所有频繁项及它们的频数,还有每个频繁项指向下一个相同元素的指针,该指针主要在挖掘FP树时使用。
下面用上文提到的数据集展开说明,假设最小支持度为2。
首先,统计数据集中各元素出现的次数,得a出现4次,b出现3次,c出现2次,d出现2次,e出现1次。
接着,将出现次数小于最小支持度2的元素(即e)在数据集中删除,并将数据集按出现次数由高到低排序,得表格2。
表格2示例数据集
a,b,c,d
a,d
a,b
然后,用更新后的数据集中的记录创建FP树,并同时更新头指针表。
创建FP树时,当待添加的记录与FP树中的路径相同,则只需更新元素对应的频数;
如果待添加的记录与FP树存在不一致,则在不一致的地方分叉,创建新的结点。
如图6~图9所示。
注意,FP树的根节点是null。
图6向FP树添加第一条记录{a,b,c}
图7向FP树添加第二条记录{a,b,c,d}
图8向FP树添加第三条记录{a,d}
图9向FP树添加第四条记录{a,b}
4.3.2.挖掘频繁项集
得到FP树后,需要对每一个频繁项,逐个挖掘频繁项集。
具体过程为:
首先获得频繁项的前缀路径,然后将前缀路径作为新的数据集,以此构建前缀路径的条件FP树。
然后对条件FP树中的每个频繁项,获得前缀路径并以此构建新的条件FP树。
不断迭代,直到条件FP树中只包含一个频繁项为止。
下面以元素c为例,从上文图9创建好的FP树中挖掘频繁项集。
首先,获得以c元素的前缀路径{a:
2,b:
2},注意此处a和b的频数为2是因为c的频数为2,所以与c共同出现的a和b的频数就都为2。
接着,创建条件FP树,具体的创建过程和上一节创建FP树的过程一样,如图10所示。
图10c元素的前缀路径构成的条件FP树
注意此时头指针表中包含两个元素,所以对每个元素,需要获得前缀路径,并将前缀路径创建成条件FP树,直到条件FP树中只包含一个元素时返回。
1.对元素a,获得前缀路径为{},则频繁项集返回{c,a};
2.对元素b,获得前缀路径{a},则将前缀路径创建成条件FP树,如图11所示。
注意此时条件FP树中只包含一个元素,故返回频繁项集{c,b,a}。
由于元素b也是频繁项,所以{c,b}也是频繁项集。
再加上{c}本身就是频繁项集,所以c对应的频繁项集有:
{c}{c,a}{c,b}{c,b,a}。
图11b元素的前缀路径构成的条件FP树
将其他元素a,b,d同样按照上述对c的操作,得到表格3所示频繁项集。
表格3元素a,b,c,d对应的频繁项集
元素
频繁项集
a
{a}
b
{b}{b,a}
c
{c}{c,a}{c,b}{c,b,a}
d
{d}{d,a}
4.4.关联规则挖掘原理
关联规则挖掘首先需要对上文得到的频繁项集构建所有可能的规则,然后对每条规则逐个计算置信度,输出置信度大于最小置信度的所有规则。
以频繁项集{a,b,c}为例,构建所有可能的规则:
{b,c}->
{a},{a,c}->
{b},{a,b}->
{c},{c}->
{a,b},{b}->
{a,c},{a}->
{b,c}。
对每条规则计算置信度后,输出满足要求的规则即可。
5.NaiveBayes基本原理
朴素贝叶斯模型主要用来分类,但是与SVM模型不同的的是,朴素贝叶斯模型不需要针对目标变量建立模型,而是借助贝叶斯公式计算样本属于各个类别的概率,然后取概率值大的类别作为分类类别。
之所以称之为朴素,是因为朴素贝叶斯模型假设各属性之间是条件独立的,该假设极大得简化了运算,使得朴素贝叶斯模型变得非常简单。
朴素贝叶斯模型主要应用在文本分类方面。
这里需要用到向量空间模型,即将文本转换成词向量。
词向量的每一项是该词出现的频数。
在朴素贝叶斯中会将频数进一步转换成频率。
这样就完成了文本到数值上的转化,方便后期计算条件概率和先验概率。
朴素贝叶斯模型也有它的优缺点,优点是模型简单,计算快;
缺点是依赖于属性之间条件独立这一假设,但是现实场景下很多情况并不满足这一假设,使得朴素贝叶斯的准确率受到影响。
这种情况需要考虑半朴素贝叶斯,即放松属性之间条件独立这一假设,一定程度上考虑属性之间的依赖关系。
由于篇幅有限,对半朴素贝叶斯感兴趣的话可自行参照文末参考资源学习,本文重点介绍朴素贝叶斯的原理和实现。
5.1.朴素贝叶斯原理
朴素贝叶斯模型主要利用贝叶斯公式进行展开。
贝叶斯公式如下:
公式中P(C|X)表示X属于类别C的概率,P(X|C)表示类别C中X出现的概率,P(C)表示类别C出现的概率。
其中P(C)称为先验概率,P(X|C)是条件概率,P(C|X)称为后验概率,将后验概率最大的类作为X的类别输出。
假设有C0和C1两个类,由于P(X)都是一样的,所以不需要考虑P(X),只需考虑如下:
1.如果P(X|C0)*P(C0)>
P(X|C1)*P(C1),则P(C0|X)>
P(C1|X),可得X属于C0类;
2.如果P(X|C0)*P(C0)<
P(X|C1)*P(C1),则P(C0|X)<
P(C1|X),可得X属于C1类。
由上述可知,需要计算P(X|C)和P(C)。
朴素贝叶斯假设属性之间条件独立,可得:
P(X|C)=P(X0|C)*P(X1|C)*P(X2|C)*P(X3|C)*…*P(Xn|C)
令Dc表示训练集D中第C类样本组成的集合,可得:
P(Xi|C)=|Dc,xi|/|Dc,x|,表示类别为C的样本在第i个属性上频数总和除以类别为C的样本集合中所有属性频数总和。
为了避免P(Xi|C)为0造成P(X|C)为0而影响分类结果,在此引入拉普拉斯平滑,本文分别给分子和分母加上1和2,即P(Xi|C)=(|Dc,xi|+1)/(|Dc,x|+2)。
又有P(C)=|Dc|/|D|,表示类别为C的样本集合大小除以数据集D的样本集合大小。
至此,通过P(X|C0)*P(C0)和P(X|C1)*P(C1)的大小比较,可得X所属类别。
但是小数连乘会造成所得值几乎等于0的结果,从而无法比较大小。
鉴于此,往往在实际运算中,会借助log函数,比较log(P(X|C0)*P(C0))和log(P(X|C1)*P(C1))的大小来判断X所属类别。
从而得:
log(P(X|C0)*P(C0))=log(P(X|C0))+log(P(C0))=log(P(X0|C0))+log(P(X1|C0))+log(P(X2|C0))+…+log(P(Xn|C0))+log(P(C0)),
同理可得log(P(X|C1)*
P(C1))=log(P(X|C1))+log(P(C1))=log(P(X0|C1))+log(P(X1|C1))+log(P(X2|C1))+…+log(P(Xn|C1))+log(P(C1))。
5.2.