机器学习中的分类算法
机器学习,模式识别中很重要的一环,就是分类,因为计算机其实无法深层次地理解文字图片目标的意思,只能回答是或者不是。当然现在卷积神经网络正在希望计算机能够看懂东西,这次我们先来看一些一些简单的分类算法。
朴素贝叶斯
说到朴素贝叶斯,先说一下贝叶斯定理,首先要解释的就是条件概率,非常简单,P(A|B)表示事件B发生的情况下,事件A发生的概率,
贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
直接给出贝叶斯定理:
朴素贝叶斯的原理和流程
先通俗地解释一下原理,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
朴素贝叶斯的定义如下:
1. 设
x={a1,a2,a3,a4,a5,....am}
为一个代分类项,而每个a为x的一个属性
2. 类别集合
C={y1,y2,y3,y4,...yn}
3. 计算
P(y1|x),P(y2|x),...P(yn|x)
4. 如果
P(yk)=maxP(y1|x),P(y2|x),...P(yn|x)
那么x就属于
yk
这些过程都非常简单,现在就需要计算第三步的各个条件概率,这其实也是一个训练过程
1. 找到一个训练样本,也就是一个已知分类的待分类项集合
2. 统计计算在各个类别下各个特征属性的条件概率估计
3. 如果各个特征属性是条件独立的,根据贝叶斯定理
因为P(x)是常数,所以我们只需要计算P(x|yi)P(yi),
特征值是连续的情况的条件概率
整个朴素贝叶斯的分类过程中,计算P(a|y)是一个关键一步,当特征属性为离散值时,只要很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),下面重点讨论特征属性是连续值的情况。
当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。 因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,就可以得到相应的概率。
另一个需要讨论的问题就是当P(a|y)=0怎么办,当某个类别下某个特征项划分没有出现时,就是产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别(概率为0的类别)下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
朴素贝叶斯的优缺点
- 朴素贝叶斯的优点:对小规模的数据表现很好,适合多分类任务,适合增量式训练。
- 朴素贝叶斯的缺点:对输入数据的表达形式很敏感。
决策树
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析;2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。
决策树ID3算法,该算法是一信息为基础,以信息熵和信息增益度为衡量标准,从而实现对数据的归纳分类。
C4.5 算法一种分类决策树算法 , 其核心算法是 ID3 算法。C4.5 算法继承了 ID3 算法的优点,并在以下几方面对 ID3 算法进行了改进:
- 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值- 多的属性的不足;
- 在树构造过程中进行剪枝;
- 能够完成对连续属性的离散化处理;
- 能够对不完整数据进行处理。
C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效
- 下面这篇博客把决策树介绍的非常清楚
http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html
Logistic Regression(LR)
Logistic Regression别看它名字里带了回归,但是它其实是一种分类的方法,用于两分类的问题。
基本原理过程
- 找一个合适的预测函数(Andrew Ng的公开课中称为hypothesis),一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。
- 构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
- 显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。
过程详解
- 既然这种分类方法就叫Logistic Regression,那么Logistic肯定是一个重要的东西,没错有个函数就叫Logistic函数(也叫Sigmoid函数)
g(z)=11+e−z
它的导数形式
g′(z)=g(z)(1−g(z)) - Logistic回归方法是用最大似然估计来进行学习的,单个样本的后验概率是
P(y|x;θ)=(hθ(x))y(1−hθ(x))1−y,y={0,1}
那么整个样本的后验概率
似然函数:L(θ)=∏(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
where
P(y=1|x;θ)=hθ(x)
P(y=0|x;θ)=1−hθ(x)
再进行求对数
l(θ)=∑i=1my(i)logh(x(i))+(1−y(i))log(1−h(x(i))) - 上面求得的就是cost function,要求它的最小值可以用梯度下降法,对
l(θ)
求微分,可得
ddθjl(θ)=∑i=1m(y−hθ(x))xj
θj:=θj+α∑i=1m(y(i)−hθ(x(i)))x(i)j,j={0,1...n}
Logistic Regression的优缺点
- Logistic回归优点:1、实现简单;2、分类时计算量非常小,速度很快,存储资源低;
- 缺点:1、容易欠拟合,一般准确度不太高;2、只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
KNN算法
K Nearest Neighbor算法,又称K近邻算法。
1. 计算训练样本和测试样本中每个样本点的距离(常见的距离度量有欧式距离,马氏距离等);
2. 对上面所有的距离值进行排序;
3. 选前k个最小距离的样本;
4. 根据这k个样本的标签进行投票,得到最后的分类类别;
如何选择一个最佳的K值,这取决于数据。一般情况下,在分类时较大的K值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的K值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使K近邻算法的准确性减小。
近邻算法具有较强的一致性结果。随着数据趋于无限,算法保证错误率不会超过贝叶斯算法错误率的两倍。对于一些好的K值,K近邻保证错误率不会超过贝叶斯理论误差率。
注:马氏距离一定要先给出样本集的统计性质,比如均值向量,协方差矩阵等。
KNN算法的优缺点
- KNN算法的优点:1. 思想简单,理论成熟,既可以用来做分类也可以用来做回归;2. 可用于非线性分类;3. 训练时间复杂度为O(n);4. 准确度高,对数据没有假设,对outlier不敏感
- 缺点:1. 计算量大;2. 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);3. 需要大量的内存;
SVM
SVM最基本的应用就是分类,求解一个最优的分类面,用于分类。
最优分类面的定义:存在一个分类面,使得两个点集到此平面的最小距离最大,两个个点集中的边缘点到此平面的距离最大,也就是样本中到平面最近的点的距离最远
为什么这样定义呢?如果一个平面离样本太近,那么它就会对噪声敏感,所以它需要离所有的样本点都尽量的远,并且它到它最近的训练样本的距离要大。
对于线性可分,总能找到样本正确的划分界面,而且有无穷多个,哪个是最优?必须寻找一种最优的分界准则,是两类模式分开的间隔最大。
推导
两分类的问题的线性判别函数的一般表达方式为:
g(x)=wTx+b
。其中方程
g(x)=0
定义了一个超平面H,把两类的训练样本完全分开。
设有N个样本:
(x1,y1),(x2,y2),...,(xN,yn),xi∈Rn,yi∈{+1,−1}
,则有分类规则:
由于训练样本线性可分,改变权向量的模,进行归一化,可写成:
本来想根据自己的对支持向量机的理解继续写的,但来发现有两篇文章写的非常号,第一篇对SVM的整体把握非常好,第二篇对数学推导讲的比较详细
- http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html
- http://blog.csdn.net/jinshengtao/article/details/40900865
优缺点
- SVM算法优点:可用于线性/非线性分类,也可以用于回归;低泛化误差;容易解释;计算复杂度较低
- 缺点:对参数和核函数的选择比较敏感;原始的SVM只比较擅长处理二分类问题(后来我们可以多训练一些分类器来解决这个问题)
Boosting
因为本人只学习了adboost,所以就以来看Boosting吧。
首先adaboost这个算法和以上的算法,思路都不太一样,上面的那些方法都是提高自身的性能,让自己变成强分类器,但是adaboost的思路却是,这个分类器较弱,这里想插一句,分类器弱,一般是这个分类器适应能力不行,就是我只在一些特定的情况,或者特征下表现比较好,但一旦情况复杂,数据量大的时候,这些分类器的表现就不好了,然后adaboost就想了一个方法,我多找一些分类器,它们各自都能在一些情况下表现良好,把它们组合起来,那么最终不就变成一个强分类器了吗。
那么adaBoost要做的就是怎样找到这些分类器的擅长区域,或者说他们的分类能力,也就表现是在adaboost中各个分类器的权值、比例。
算法流程
- 为第一个弱分类器的所有训练样例初始化权重,都设为1/N。
迭代M次,亦即训练M个弱分类器:
训练当前弱分类器,使得训练样例的加权误差 Jm 最小。
求得当前弱分类器的加权误差率ε,如果ε>0.5,则当前分类器效果太差,算法终止,否则计算 α=1/2ln((1−ε)/ε) , α 就是该分类器的权重。
对于所有被当前弱分类器分错类的训练样例,增大其权重,以便在训练下一个弱分类器时重视这些被分错类的训练样例
Dt+1i=DtieαSum(D)如果样本正确,就减小该样本的权重Dt+1i=Dtie−αSum(D)
最终得到的强分类器利用M个弱分类器的分类结果的加权和作为测试训练样例的分类结果。
优缺点
- 优点:容易实现,分类准确率较高,没有太多参数可以调;不会过拟合
- 缺点:对outlier比较敏感;
这次机器学习分类算法的笔记主要参考了下面一篇博客http://www.cnblogs.com/tornadomeet/p/3395593.html