精华内容
参与话题
问答
  • 机器学习系列(七)——分类问题(classification)

    万次阅读 多人点赞 2018-08-19 19:28:41
    这一篇博客将介绍机器学习中另一个重要的任务——分类(classification),即找一个函数判断输入数据所属的类别,可以是二类别问题(是/不是),也可以是多类别问题(在多个类别中判断输入数据具体属于哪一个类别)...

    这一篇博客将介绍机器学习中另一个重要的任务——分类(classification),即找一个函数判断输入数据所属的类别,可以是二类别问题(是/不是),也可以是多类别问题(在多个类别中判断输入数据具体属于哪一个类别)。与回归问题(regression)相比,分类问题的输出不再是连续值,而是离散值,用来指定其属于哪个类别。分类问题在现实中应用非常广泛,比如垃圾邮件识别,手写数字识别,人脸识别,语音识别等。

    思考

    首先思考一个问题,能不能用回归问题的解法去求解分类问题呢?
    以二分类问题为例,对于类别1,我们假设其目标值为1,对于类别2,假设其目标值为-1。在回归问题中,我们需要找到一个函数,使得函数的预测值尽可能的接近目标值。如下图所示,为了方便可视化,假设每个样本只用两维特征表示。
    在这里插入图片描述

    上图中,蓝色的点目标值是1,代表类别1;红色的点目标值是-1,代表类别2。现在需要找到一个函数对这些点进行拟合,如图中绿线所代表的函数b+w1x1+w2x2=0b+w_1x_1+w_2x_2=0。对于一个样本点,如果其对应的函数值大于0,则认为其属于类别1,反之属于类别2。这么做看起来好像也是可以的,但现在我们考虑另外一种情况,如下图所示
    在这里插入图片描述

    此时,在类别1中加入了右下角这些点,如果仍然采用绿色那条线所代表的函数进行预测,这些新加入进来的点的误差将特别的大,为了缓解由此带来的误差,绿色的线将往右下角偏移,以此减少误差。但这么做明显是不符合常理的,误差虽然减少了,但也带来了更严重的分类类别错误问题。**造成这个问题的本质是损失函数定义的不恰当,回归问题种将损失函数定位为误差函数是因为回归的目标是尽可能拟合样本点,但分类问题的目标是尽可能将样本点分类到正确的类别中,仍然使用误差函数作为损失函数显然是不合适的。**会闹出这样的笑话:对于那些类别明显的点,回归问题求解的惩罚反而更加严重。另外对于多分类问题种,我们给每个类别指定一个对应的目标值,在机器看来这些目标值之间是有联系的,比如:类别1目标值指定为1,类别2目标值指定为2,类别3目标值指定为3……计算机在寻找样本之间的关系时,会默认类别2和类别3要比类别1和类别3更加有关联,因为3和2更加靠近。

    分类问题

    分类问题的求解过程同样可以分为三个步骤:
    1、确定一个模型f(x)f(x),输入样本数据xx,输出其类别;
    2、定义损失函数L(f)L(f),一个最简单的想法是计数分类错误的次数,L(f)=nδ(f(xn)y^n)L(f)=\sum_{n} \delta(f(x^n)\ne \hat{y}^n)
    3、找出使损失函数最小的那个最优函数。
    上面的做法中,我们寻找到的最优函数直接计算出了p(cx)p(c|x),即给出了样本xx属于每个类别cc的概率,这是一种解法。我们将其称作判别式(discrimination)方法,因为我们直接对样本所属类别进行了判断,相应的模型称作判别式模型。这一篇博客我们换一个角度思考,从另一个方向解决分类问题。下面以最简单的二分类为例,样本可以根据其类别标签被自然分为两类,那为什么我们不分别对每一类进行研究呢?是否可以发现每一类样本的特性呢?结合我们的研究目标:建模p(cx)p(c|x),借助概率论条件概率的知识,我们对其进行下转换:
    p(cx)=p(c,x)p(x)(1) p(c|x)=\frac{p(c,x)}{p(x)} \tag 1

    此时还需要求解联合概率分布p(c,x)p(c,x),基于贝叶斯定理,p(cx)p(c|x)可写为
    p(cx)=p(xc)p(c)p(x)(2) p(c|x)=\frac{p(x|c)p(c)}{p(x)} \tag 2

    对给定样本xxp(x)p(x)与类别无关,因此我们需要考虑的只剩下p(xc)p(x|c)p(c)p(c),惊讶的是,这两个分布不正是每一类样本的特性吗?因此下面就需要对这两个分布进行研究。
    p(c)p(c)是类先验(prior)概率,即在未知其他条件下对事件发生概率的表示,这个值是通过以往经验和分析(历史数据)得到的结果。根据大数定律,当训练样本中包含充足的独立同分布样本时,p(c)p(c)可通过各类样本的出现频率进行估计;与类先验概率相对应的是类后验(posterior)概率p(cx)p(c|x),即我们要建模的目标,表示在已知条件xx下事件发生的概率。
    p(xc)p(x|c)是类条件(class-conditional)概率,即在某个特定类别下,样本xx的发生概率。它是涉及关于样本xx所有属性的联合概率,如果xxdd个属性且取值均为二值,那么样本空间大小将是2d2^d,现实中训练样本的大小往往远小于这个值,因此通过频率估算p(xc)p(x|c)显然是不可行的,因为“未被观测到”不等于“出现概率为0”。

    高斯分布

    通常我们假定类条件概率p(xc)p(x|c)符合某种确定的概率分布,训练样本都是从这个分布中随机采样得到的,“未被采样到的点”也对应有一个发生概率。某种确定的概率分布通常被假设为高斯分布(Gaussian Distribution),现在我们需要做的就是根据训练样本确定高斯分布的参数。多元高斯分布的概率密度函数如下:
    fμ,Σ(x)=1(2π)k/21Σ1/2exp{12(xμ)TΣ1(xμ)} f_{\mu,\Sigma}(x)=\frac{1}{(2\pi)^{k/2}}\frac{1}{|\Sigma|^{1/2}}exp\{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)\}

    其中kkxx的维数,μ\mu是均值向量,Σ\Sigma是协方差矩阵,μ\mu决定了分布的最高点,Σ\Sigma决定了分布的形状,二维高斯分布概率密度函数如下:
    在这里插入图片描述

    下面两幅图分别展示了μ\mu不同,Σ\Sigma相同,和μ\mu相同,Σ\Sigma不同的分布对比。
    在这里插入图片描述
    在这里插入图片描述

    极大似然估计

    任何一个高斯分布都能采样出我们的训练样本,但是不同的分布采样出训练样本的可能性(likelihood)是不一样的,对给定μ\muΣ\Sigma采样出训练样本的likelihood可以写作:
    L(μ,Σ)=xDcpμ,Σ(x) L(\mu,\Sigma)=\prod_{x\in D_c}p_{\mu,\Sigma}(x)

    DcD_c表示训练样本中属于类别cc的样本数目。最大化上面的似然函数,找出的μ\muΣ\Sigma就是最佳参数。
    μ,Σ=argmaxμ,ΣL(μ,Σ) \mu^*,\Sigma^*=arg \max_{\mu,\Sigma}L(\mu,\Sigma)

    该方法称为最大似然估计(Maximum Likelihood Estimation,MLE),参数μ\muΣ\Sigma的最大似然估计为
    μ=1DcxDcxΣ=1DcxDc(xμ)(xμ)T \mu^*=\frac{1}{|D_c|}\sum_{x\in D_c}x \\ \Sigma^*=\frac{1}{|D_c|}\sum_{x\in D_c}(x-\mu^*)(x-\mu^*)^T

    也就是说,最佳μ\mu^*是样本均值,协方差矩阵是(xμ)(xμ)T(x-\mu^*)(x-\mu^*)^T的均值,这显然是一个符合直觉的结果。现在我们已经计算出每个类别的p(c)p(c)p(xc)p(x|c),就可以选择p(c)p(xc)p(c)p(x|c)较大的那个类别作为xx的类别。
    在实际应用中,对于不同的类别分别给予不同的μ\muΣ\Sigma是比较少见的,尤其是Σ\Sigma的大小是特征的平方,分别给予不同的参数将使得模型参数太多,容易过拟合,所以通常给予不同分布相同的Σ\Sigma,此时似然函数如下:
    L(μ1,μ2,Σ)=xDc1pμ1,Σ(x)xDc2pμ2,Σ(x) L(\mu^1,\mu^2,\Sigma)=\prod_{x\in D_{c_1}}p_{\mu^1,\Sigma}(x)\prod_{x\in D_{c_2}}p_{\mu^2,\Sigma}(x)

    μ1\mu^1μ2\mu^2的值不变,依旧是每一类样本的均值。Σ\Sigma的值稍有变化,等于每一类样本的Σ\Sigma的加权平均
    Σ=Dc1DΣ1+Dc2DΣ2 \Sigma=\frac{D_{c_1}}{D}\Sigma^1+\frac{D_{c_2}}{D}\Sigma^2

    朴素贝叶斯分类器

    上面的计算中,我们将大部分的精力都放在了求解类条件概率p(xc)p(x|c)上,因为p(xc)p(x|c)是关于所有属性的联合概率,难以从样本中直接估计得到。一个大胆的假设是认为描述样本的所有属性是相互独立的,因此p(xc)p(x|c)可以拆解成
    p(xc)=p(x1c)p(x2c)p(xnc)=i=1np(xic) p(x|c)=p(x_1|c)p(x_2|c)\cdots p(x_n|c)=\prod_{i=1}^np(x_i|c)

    其中,nn是属性数目,xix_i是第ii个属性。同样可以假设每一维属性上的概率分布仍然服从高斯分布,此时的高斯分布是一个一维高斯分布,Σ\Sigma对应一个实值,组成协方差矩阵也只在对角线位置有值,进一步减少了参数数目,得到了更简单的模型。这样的模型被称作朴素贝叶斯分类器(naive Bayes classifier,NB)。
    最后,对于样本分布不一定要选择高斯分布,例如如果是二值分布,我们可以假设符合伯努利分布,具体应用中要根据样本特点具体而定,但显示生活中确实有很多分布符合高斯分布。

    总结

    这一篇博客中,我们从另一个角度介绍了求解分类问题的一类新模型,与判别式模型直接建模p(cx)p(c|x)不同,这类模型首先对每一类别样本求解p(c)p(c)p(xc)p(x|c),然后再计算p(cx)p(c|x),我们将这一类模型称作生成式模型(generative models)。因为求解出p(c)p(c)p(xc)p(x|c)后,我们也就求出了联合概率p(x,c)p(x,c),也就求出了p(x)=p(x,c1)+p(x,c2)+p(x)=p(x,c_1)+p(x,c_2)+\cdots,有了p(x)我们就能采样生成每一个样本xx,所以被称为生成式模型。

    参考文献

    李宏毅机器学习2017秋

    展开全文
  • 常见分类方法

    万次阅读 2016-12-30 10:29:19
    本文只对几种常见的分类方法做简单介绍,详细的讲解和算法网上有很多资源,文中会给出推荐链接。 Content 1. 决策树分类(链接:http://blog.csdn.net/github_36299736/article/details/52749999) 2. 基于规则...

    本文只对几种常见的分类方法做简单介绍,详细的讲解和算法网上有很多资源,文中会给出推荐链接。

    Content

    1.      决策树分类(链接:http://blog.csdn.net/github_36299736/article/details/52749999

    2.      基于规则分类

    3.      最邻近分类(K-NN)

    4.      朴素贝叶斯分类器

    5.      人工神经网络

    6.      支持向量机(SVM)

     

    1. 基于规则的分类器

    简单来说,基于规则的分类器就是使用一组“if… then …”的组合来进行分类的技术。通常用R =( r1˅ r2 ˅ … ˅ rk)来表示,其中 ri 就是分类的规则。

    以上图为例,r1  类就可以用如下规则判断:

            If (胎生 = 否 & 飞行动物 = 是)then (类别 = 鸟类)

    度量分类规则的质量可以用覆盖率(coverage)和准确率(accuracy)。覆盖率就是满足规则的记录数占总记录数的比例,准确率就是使用该规则正确分类的比例。

    基于规则分类还有以下两个重要的规则:

            互斥规则(Mutually Exclusive Rule)和穷举规则(Exhaustive Rule)

    互斥规则:规则集中不存在两条规则被同一条记录触发。简单说就是保证同一条记录不会同时属于两个类别。

    穷举规则:对于属性值的任一组合,R中都存在一条规则加以覆盖。即每一条记录都保证能以其中一种规则加以分类。

    这两个性质就可以保证每条记录被且仅被一条规则覆盖。但是实际情况下,分类器可能无法满足这两条性质。对于不能穷举的规则集,我们可以通过设定一个默认规则来覆盖不能被分类的记录。对于不互斥的规则集,我们可以通过建立优先级或者为规则加权等方式来解决。

     

    2. 最邻近分类器

    最邻近分类器是一种简单且常用的分类器。也就是我们常说的K-NN分类算法。它的原理非常简单,即根据与测试数据最近的K个点的类别,采用多数表决方案来确定该测试数据的分类

    以上图为例,1-最邻近(图a)中可以看到与测试数据最近的一个点为负,所以该测试点被指派到负类。2-最邻近(图b)中,与测试数据最近的两点为一正一负,可以随机选择其中一个类别。3-最邻近(图c)中,最近的三个点为两正一负,根据多数表决方案,该点被指派为正。

    从上述例子中就可以看到该算法中k值的选取非常关键。K值太小,结果容易受到数据中噪声的影响从而产生过拟合。K值太大,容易导致误分类,因为结果可能会受到距离测试数据点非常远的数据的影响。(如下图)

    算法描述如下:

    也可以对不同距离的数据点进行加权,从而提高分类的准确率。

     

    3. 朴素贝叶斯分类器

    了解朴素贝叶斯分类,首先要知道贝叶斯定理,也就是我们比较熟悉的条件概率。参考:http://blog.csdn.net/github_36299736/article/details/52800394

    朴素贝叶斯分类器的工作原理就是计算测试数据被分给各个类别的条件概率(后验概率),并将该记录指派给概率最大的分类。

    让我们用之前在决策树分类中使用过的例子来分析:

    假定一个测试数据,该测试数据的属性集可以表示为:X= {有房=否,婚姻状况=已婚,年收入=120k},我们需要将该数据分类到两个类别之一,即 Y = {拖欠贷款=是,拖欠贷款=否}。那么我们需要做的就是分别计算两种分类情况下的后验概率 P (Y|X) 。 P1 = P (拖欠贷款 = 是|X) 和P2 = P (拖欠贷款 = 否|X) ,如果P1 >P2,则记录分类为拖欠贷款 = 是,反之分类为拖欠贷款 = 否。

    朴素贝叶斯分类器更通常的表示方法:给定类标号 y,朴素贝叶斯分类器在估计条件概率时假设属性之间条件独立,若每个属性集(数据)包含d个属性X = { X1,X2,…,Xd } ,那么每个类Y的后验概率计算公式为:

    由于P(X)是固定值,因此只要找出分子最大的类就可以了。

    对于连续属性的条件概率,可以用以下两种方法来估计它的类条件概率:

    1.      把连续的属性离散化,然后用相应区间来替代连续的属性值;

    2.      假设连续变量服从某种概率分布(例如:高斯分布),然后使用训练数据估计分布的参数。

     

    4. 人工神经网络(ANN)

    类似于人脑由神经元及轴突构成的结构,人工神经网络由相互连接的结点和有向链构成。最简单的ANN模型是感知器(perceptron)。

    以上图为例,b即为一个感知器,其中,x1, x2, x3 分别为三个输入结点,在本例中表示三个输入的布尔值,还有一个输出结点。结点通常叫做神经元或单元。感知器中,每个输入结点都通过一个加权链连接到输出结点。加权链就像神经元间连接的强度,训练一个感知器模型就相当于不断调整链的权值,直到能拟合训练数据的输入输出关系为止

    感知器对输入加权求和,再减去偏置因子 t,然后考察得到的结果,得到输出值 ŷ。

    上图中分类依据为如果三个输入值中至少两个0,y取-1,至少有两个1时,y取1. 它的感知器的输出计算公式如下:

    更通用的数学表达方式是:

    其中,w1, w2, …, wd 是输入链的权值,x1, x2, …, xd 是输入属性值。

    还可以写成更简洁的形式:

    其中,w0 = -t,x0 = 1. w · x 是权值向量 w 和输入属性向量 x 的点积。

     

    多层人工神经网络

    多层神经网络相比于感知器要复杂得多,首先,网络的输入层和输出层之间可能包含多个隐藏层,隐藏层中包含隐藏结点。这种结构就叫做多层神经网络。感知器就是一个单层的神经网络

    除此之外,网络还可以使用其他激活函数(如S型函数,双曲线正切函数,符号函数等)使得隐藏结点和输出结点的输出值和输入参数呈非线性关系。

    直观上,我们可以把每个隐藏结点看成一个感知器,而每个感知器可以构造出一个超平面用于分类。如下图a中所构造的两个超平面。

    ANN学习算法的目标函数是找出一组权值w,使得误差平方和最小:

     

    对于激活函数是线性函数的情况,可以将ŷ =w · x 带入上式将其变成参数的二次函数,就可以找出全局最小解。当输出是参数的非线性函数的时候,可以采用梯度下降法来优化。

    关于神经网络的更多内容,我推荐这一篇文章,来自知乎专栏,作者:YJango,链接:https://zhuanlan.zhihu.com/p/22888385

     

    5. 支持向量机(SVM)

    SVM是现在倍受关注的分类技术,可以很好地适用于高维数据。它的特点是,使用训练实例的一个子集来表示决策边界,该子集就是支持向量。那么为什么把一个决策边界叫做“向量”呢?首先从最大边缘超平面这个概念开始了解。

    假设这是一个数据集,其中包含两类数据,分别用方块和圆来表示。非常直观地看到,我们很容易在两组数据之间找到无限个超平面(本例中是一条直线),使得不同类的数据分别在这个超平面的两侧。

    但是,有一些超平面的选择在测试未知数据时的效果可能并不好,比如下图中的红色线:

    可以看到,只要测试数据稍稍偏离一点,就容易导致分类错误。因此,我们要在这无数条分界线中找到一条最优解,使它到两边的边距最大。(如下图)

    如果将这些数据点放在坐标系中,边缘的点可以以向量的形式来表示:

     

    其中,用红色圈起来的数据点就是support vector,这也就是SVM这个算法名称的由来。

    关于支持向量机,有一系列非常好的博客可以参考,作者:pluskid,链接:http://blog.pluskid.org/?page_id=683

     

    其实常用分类方法还有很多,例如AdaBoost,以及不同分类方法的组合。本文只是参考书中内容对几种常见分类算法做了入门级介绍,可以根据实际的学习和工作需要做深入研究并择优使用。 感谢阅读。

     

    参考:《数据挖掘导论》第五章 分类:其他技术

    展开全文
  • 数据挖掘——分类

    万次阅读 2018-10-10 21:52:21
    分类 基本概念 分类:一种数据分析形式,它提取刻画重要数据类的模型。这种模型叫分类器,进而预测分类的(离散的、无序的)类标号。 相关概念解释 训练集:由数据库元组和与它们相关联的类标号组成。 ...

    分类

    基本概念
    分类:一种数据分析形式,它提取刻画重要数据类的模型。这种模型叫分类器,进而预测分类的(离散的、无序的)类标号

    预测问题
    分类两个阶段
    相关概念解释

    • 训练集:由数据库元组和与它们相关联的类标号组成。
    • 元组X用n维属性向量x=(x1,x2,x3……xn)表示,分别描述元组在n维数据库中的n个属性值的集合。
    • 每个元组都可预先定义为一个,由一个称为类标号属性的数据库属性确定。
    • 类标号属性:是离散的无序的。它是分类的(标称的。标称属性的值仅仅只是不同的名字,以区分不同对象)。因为每个值充当一个类别或类。
    • 数据元组也称为:样本、记录、实例、对象、数据点。
    • 属性值也称:变量、特征、字段、维。
    • 属性的数量称为维度
    • 由训练集所得到的学习模型:可用分类规则决策树数学公式的形式表示。

    第一步 建立模型(可看作学习一个函数y=f(x),它可预测给定元组X的类标号y。)
    在这里插入图片描述
    第二步 检验模型并用于新的分类(由检验集评估分类器的准确率,再应用于新的数据进行分类)
    在这里插入图片描述
    如上图分类的预测任务,首先通过已有的数据集(训练集)进行训练学习,得到一个目标函数(学习模型或分类规则),再通过检验集的数据对该模型的准确度评估,若通过评估,则该规则应用于新的数据元组分类。

    • 分类器在给定检验集上的准确率是指分类器正确分类的检验元组所占的百分比。通过每个检验元组的类标号与学习模型对该元组的类预测进行比较。

    • 监督学习 (用于分类)
      即分类器的学习,是在已知每个训练元组的类别的“监督下”进行的。
    • 无监督学习(用于聚类)
      每个训练元组的类标号未知,并且学习的类的个数和集合也可能是事先未知的。

    在这里插入图片描述

    1. 什么是决策树?
    2. 类似于流程图的树结构
    3. 每个内部节点表示在一个属性上的测试
    4. 每个分枝代表一个测试输出
    5. 每个树叶节点存放一个类编号

    决策树:Buys_computer
    在这里插入图片描述

    1. 决策树是如何分类的?
      给定一个类标号未知的元组X,在决策树上测试元组的属性值,跟踪一条由根到叶节点的路径,叶节点存放该元组的类预测。
    2. 决策树的生成由两个阶段组成
      决策树构建
      1.) 使用属性选择度量来选择属性,使元组能最好的划分为不同的类。
      2.) 递归的通过选定属性,来划分样本(必须是离散值)。
      树剪枝
      1.) 决策树建立时,许多分枝反映的是训练数据中的噪声和离群点点,树剪枝试图识别并剪去这种分枝,以提高对未知数据分类的准确性。
    3. 决策树的基本算法
      在这里插入图片描述
      算法主要步骤:
    • 以训练样本的单个节点N开始;
    • 如果样本都在同一类,则该节点成为树叶,并用该类标记。
    • 否则,算法调用Attribute_selection_method(属性选择度量),选择能够最好的将样本分类的属性,确定“分裂准则”,指出“分裂点”或“分裂子集”;
    • 对测试属性每个已知的值,创建一个分支,并以此划分元组;
    • 算法使用同样的过程,递归的形成每个划分上的元组决策树。一旦一个属性出现在一个节点上,就在该节点的子节点上删除;

    递归划分步骤停止的条件

    • 情形(1):划分D(在N节点提供)的所有元组属于同一类
    • 情形(2):当前属性集为空,或所有样本在所有属性上取值相同,无法划分。
    • 情形(3):没有剩余的样本。
    • 给定分支没有元组,则以D中多数类创建一个树叶

    注:整个决策树建立的关键是:属性选择的度量,也是算法的核心


    1. 属性选择度量(分裂准则)

    问题: 如何选择元组的属性进行优先建树,使得将所有训练元组能最好的划分??(也即使决策树简单)。
    eg. 女生约会是否见男生。eg. 明天是否打球案例。
    在这里插入图片描述
    理想的划分是,使每个划分都是“纯”的,即落在给定划分内的元组都属于同一类。
    2. 常用的属性选择度量

    • 信息增益
    • 增益率
    • Gini指数

    3. 使用符号如下:
    设数据分区D为标记类元组的训练集,类标号属性具有m个不同值,定义了m个不同类Ci(i=1,2,3…,m),设Ci, D 是D中Ci类元组的集合,|D|和|Ci, D|分别是D和Ci, D中元组的个数。

    信息增益

    ID3算法使用信息增益作为属性选择度量。它是基于香农的信息论,对信息进行度量的方法。(可参考信息论的文章xxx)。
    设节点N存放分区D的元组,选择具有最高信息增益的属性作为节点N的分裂属性。该属性使最终的结果分区中对元组分类所需要的信息量最小。这种方法使得对一个元组进行分类的测试数目最小,并确保找到一颗简单的树。

    对D中元组分类所需要的期望信息由下式计算:

    其中,Pi是D中任意元组属于类Ci的非零概率,用|Ci, D|/|D|估计。用到信息论里面的自信息量公式,表示事件x发生前,事件发生的不确定性,或事件发生后,所得到信息量。在这里插入图片描述
    Info(D)是对D中所有元组分类所需要的期望信息(平均信息量)。也称为D的熵。是随机变量平均不确定度的度量,同时它也代表了消除随机变量不确定度所需获得的信息量。

    若我们对属性A进行划分元组D,其中A具有v个不同值{a1,a2,a3…,av},若A是离散值,则对应有v个输出,可以用属性A将D划分为v个分区或子集{D1,D2,D3,…Dv},Dj包含D中的元组,它们的属性值都为aj。为了得到准确分类,还需要多少信息量?由下式计算:
    在这里插入图片描述
    在这里插入图片描述
    是第j个分区的权重。在这里插入图片描述
    是基于按A划分对D的元组分类所需要的期望信息。

    信息增益:原来的信息需求与新的信息需求(对A划分后)之间的差。
    Gain(A)=Info(D)-InfoA(D),即对A划分后所获得的信息量。所以选择最高信息增益Gain(A)的属性A作为节点N的分裂属性。等价于在“能做最佳分类”的属性A上划分,使得完成剩余元组的划分所需要的信息量最小。

    例题:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 基于CNN的垃圾分类模型

    万次阅读 多人点赞 2018-01-10 15:44:21
    基于TensorFlow和Keras的垃圾分类模型 本篇博客主要介绍基于TensorFlow和Keras实现垃圾分类模型,目前是一篇占坑的博客,由于该项目目前用于参加比赛,因此暂时不能提供代码,感兴趣的可以私信我一起交流,识别...

    数据集代码下载地址:https://download.csdn.net/download/github_39611196/13103484

    前言

    识别结果如下所示:
    在这里插入图片描述

    国家大力推行垃圾分类可以实现环境保护,但是也对很多不熟悉垃圾分类的人造成了困扰,需要一种自动化的垃圾分类方法,以实现更加便捷的垃圾分类。
    在这里插入图片描述
    本文提出了基于卷积神经网络(Convolutional Neural Network,CNN)的垃圾分类方法,主要实现对6类生活垃圾进行分类,包括可回收垃圾(5类:硬纸板、铜制品、塑料瓶、玻璃瓶和废弃纸张)和不可回收垃圾。

    准备数据

    首先爬取图片数据,并从中每类挑选400张可用的图片,并将数据集按照9:1的比例划分为训练集和测试集。

    硬纸板
    在这里插入图片描述
    玻璃瓶
    在这里插入图片描述
    铜制品
    在这里插入图片描述
    废弃纸张
    在这里插入图片描述
    塑料瓶
    在这里插入图片描述
    不可回收垃圾
    在这里插入图片描述

    数据地址(个人整理的数据集,需要的可自行下载):

    https://www.kaggle.com/asdasdasasdas/garbage-classification

    搭建网络

    在准备完数据后,搭建6层CNN网络对数据集进行训练,最后进行测试,测试准确率为0.85。其中CNN网络包括4个卷积层、4个最大池化层和2个全连接层,前5层使用了ReLU激活函数,最后一层使用了SoftMax激活函数。

    训练和测试

    根据搭建的CNN网络对数据进行训练和测试。
    在这里插入图片描述

    完整代码

    prepare_image.py:用于对输入图像做预处理

    # encoding:utf-8
    '''
    对需要进行预测的图片进行预处理
    '''
    from keras.preprocessing.image import ImageDataGenerator
    from keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array
    from keras.applications.imagenet_utils import preprocess_input
    import numpy as np
    
    
    def prepare_image(img_path, model):
        # 加载图像
        img = load_img(img_path, target_size=(512, 384))        # x = np.array(img, dtype='float32')test
        # 图像预处理
        x = img_to_array(img)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        results = model.predict(x)
        print(results)
        return results
    

    train.py:用于训练垃圾分类模型

    # encoding:utf-8
    '''
    用于训练垃圾分类模型
    '''
    from keras.preprocessing.image import ImageDataGenerator
    from keras.models import Sequential
    from keras.layers import Conv2D, MaxPooling2D
    from keras.layers import Activation, Dropout, Flatten, Dense
    from keras.callbacks import ModelCheckpoint
    from keras import backend as K
    
    # dimensions of our images.
    img_width, img_height = 512, 384
    
    train_data_dir = 'data/train'
    validation_data_dir = 'data/validation'
    nb_train_samples = 2357
    nb_validation_samples = 170
    epochs = 30
    batch_size = 20
    
    if K.image_data_format() == 'channels_first':
        input_shape = (3, img_width, img_height)
    else:
        input_shape = (img_width, img_height, 3)
    
    model = Sequential()
    model.add(Conv2D(32, (3, 3), input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Conv2D(32, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    
    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(6))  # 6分类
    model.add(Activation('softmax'))  # 采用Softmax
    
    model.compile(loss='categorical_crossentropy',  # 多分类
                  optimizer='rmsprop',
                  metrics=['accuracy'])
    
    # this is the augmentation configuration we will use for training
    train_datagen = ImageDataGenerator(
        rescale=1. / 255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)
    
    # this is the augmentation configuration we will use for testing:
    # only rescaling
    test_datagen = ImageDataGenerator(rescale=1. / 255)
    
    train_generator = train_datagen.flow_from_directory(
        train_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical')  # 多分类
    
    validation_generator = test_datagen.flow_from_directory(
        validation_data_dir,
        target_size=(img_width, img_height),
        batch_size=batch_size,
        class_mode='categorical')  # 多分类
    
    filepath="weights-improvement-{epoch:02d}-{val_acc:.2f}.h5"
    checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
    callbacks_list = [checkpoint]
    
    model.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples // batch_size,
        epochs=epochs,
        callbacks=callbacks_list,
        validation_data=validation_generator,
        validation_steps=nb_validation_samples // batch_size)
    

    plot.py:用于显示图片预测结果

    # encoding:utf-8
    '''
    用于对预测结果图片进行显示
    '''
    import cv2
    import numpy as np
    
    # 根据预测结果显示对应的文字label
    classes_types = ['cardboard', 'glass', 'trash']
    
    
    def generate_result(result):
        for i in range(3):
            if(result[0][i] == 1):
                print(i)
                return classes_types[i]
    
    
    def show(img_path, results):
        # 对结果进行显示
        frame = cv2.imread(img_path)
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(frame, generate_result(results), (10, 140), font, 3, (255, 0, 0), 2, cv2.LINE_AA)
        cv2.imshow('img', frame)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    predict.py:用于对测试数据集进行测试

    # encoding:utf-8
    '''
    加载垃圾分类模型
    '''
    from keras.models import Sequential
    from keras.layers import Conv2D, MaxPooling2D
    from keras.layers import Activation, Dropout, Flatten, Dense
    from keras import backend as K
    
    
    def model():
        # dimensions of our images.
        img_width, img_height = 512, 384
        if K.image_data_format() == 'channels_first':
            input_shape = (3, img_width, img_height)
        else:
            input_shape = (img_width, img_height, 3)
    
        model = Sequential()
        model.add(Conv2D(32, (3, 3), input_shape=input_shape))
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
    
        model.add(Conv2D(32, (3, 3)))
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
    
        model.add(Conv2D(64, (3, 3)))
        model.add(Activation('relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
    
        model.add(Flatten())
        model.add(Dense(64))
        model.add(Activation('relu'))
        model.add(Dropout(0.5))
        model.add(Dense(3))  # 3分类
        model.add(Activation('softmax'))  # 采用Softmax
    
        model.compile(loss='categorical_crossentropy',  # 多分类
                      optimizer='rmsprop',
                      metrics=['accuracy'])
    
        model.load_weights("weights.h5")
        return model
    

    main.py:对各个模块进行调用,测试图片并显示最终结果

    # encoding:utf-8
    '''
    调用各个模块实现对图片的测试和显示结果
    '''
    from plot import show
    import predict
    from prepare_image import prepare_image
    
    
    def detect(img_path):
        model = predict.model()
        results = prepare_image(img_path=img_path, model=model)
        show(img_path=img_path, results=results)
    
    if __name__ == '__main__':
    
        detect("test/15.jpg")
    

    使用步骤

    训练
    调用train.py对训练数据集进行训练,得到weights.h5权值文件。
    测试
    调用main.py进行测试。

    分类的准确率不是很高,主要存在两个问题

    第一个问题:数据集过于杂乱,在选择不可回收垃圾数据集时,只要不属于前五类而且为不可回收垃圾,都放到了不可回收垃圾类别下,无法很好的进行特征的学习。

    第二个问题是,模型只有6层,较为简单,学习能力不够强。

    改进思路

    针对第一个问题,可以对数据集进行清洗,以便更好地对特征进行学习;针对第二个问题,可以选择一些比较成熟的模型架构,如VGG16或者ResNet,通过迁移学习进行改进。

    写在最后

    集中回答大家几个问题:
    1、数据集和代码在哪下载?
    根据文中链接进行下载。
    2、找不到weights.h5配置文件?
    weights.h5配置文件需要通过train.py文件训练生成,即在运行main.py文件之前需要运行train.py文件
    3、代码报错问题?
    由于代码是三年前写的了,因此可能由于TensorFlow和Keras的版本,会出现报错,需要大家自行查找解决方案。

    展开全文
  • 深度学习---之回归,分类

    万次阅读 2017-12-01 20:31:46
    一.回归:  什么是回归?如果有一个数据集x,它所对应的真实值y1,回归就是通过将这些数据集拟合出一个函数关系,使得y2=g(x),当然拟合不可能那么完美,所以就会有误差,这个误差就是y2-y1,即拟合出来的值,减去...
  • 机器学习中的分类问题基本思路

    千次阅读 2018-11-19 06:08:43
    分类 Classification and Representation Classification 我们来讨论下分类问题。我们主要讨论的分类算法是逻辑回归,即logistic regression,它是当今最流行也是应用最为广泛的学习模型。不过,虽然这个模型名字...
  • 分类——其他技术

    2019-04-03 22:01:52
    基于规则的分类器是使用一组“if…then…”规则来对记录进行分类的技术。 (2)规则提取方法 1.直接法:直接从数据中提取分类规则。 a. 顺序覆盖算法:决定提取类 y 的规则后,类 y 的所有训练记录被看做是正例,而...
  • 内部类的概念和分类

    2019-09-02 08:19:04
    分类 1.成员内部类 2.局部内部类(包含匿名内部类) 成员内部类的定义格式: 修饰符 class 外部类名称{ 修饰符 class 内部类名称{ } } 注意:内用外,随意访问。外用内,需要内部类对象 成员内部类的定义和使用 定义...
  • 各种分类网络

    2020-07-04 23:25:37
    20问--各种网络类LeNet各层参数1、Input层2、C1卷积层3、S2池化层(下采样层)4、C3卷积层5、S4池化层(下采样层)6、C5卷积层7、F6全连接层8、Output层-全连接层AlexNet网络亮点:Alexnet数据增强操作:局部相应...
  • 分类学习

    千次阅读 2018-12-21 12:38:53
    分类任务实质上可以使用多个二分类器来解决。这篇博客主要介绍三种使用二分类器解决多分类任务的方法。虽然softmax之后使用交叉熵损失也可以解决多分类任务,但这篇博客不介绍这种方法。这篇博客主要介绍以下三种...
  • 机器学习——几种分类算法的汇总

    千次阅读 2019-06-25 01:03:45
    https://www.cnblogs.com/Zhi-Z/p/8912396.html
  • 分类和多分类问题的评价指标总结

    万次阅读 多人点赞 2019-07-09 18:51:55
    分类评价指标 准确率(Accuracy) 评价分类问题的性能指标一般是分类准确率,即对于给定的数据,分类正确的样本数占总样本数的比例。 注意:准确率这一指标在Unbalanced数据集上的表现很差,因为如果我们的正负...
  • 分类,聚类及其回归的区别

    万次阅读 多人点赞 2018-05-06 19:38:06
    from:...由上图我们可以看到,机器学习分为四大块,分别是classification (分类),regression (回归),clustering (聚类),dimensionality reduction (降维...
  • 分类

    万次阅读 2018-09-21 21:23:10
    分类器的作用:常规任务是利用给定的类别、已知的训练数据来学习分类规则和分类器,然后对未知数据进行分类(或预测)。逻辑回归(logistics)、SVM等常用于解决二分类问题,对于多分类问题(multi-class ...
  • 基于支持向量机的图像分类(下篇:MATLAB实现)

    万次阅读 多人点赞 2018-04-11 00:19:20
    摘要:本文通过图文详细介绍如何利用支持向量机对图像进行分类,经过上篇文章对原理的介绍,这里介绍利用MATLAB编程实现。后续章节将介绍的主要部分有: 图片数据集整理 特征提取 SVM训练与测试 分类结果...
  • Java异常分类

    万次阅读 多人点赞 2012-11-27 15:46:48
    1 基本概念 java.lang.Throwable是所有异常的根 java.lang.Error是错误信息 java.lang.Exception是异常信息 ...一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不...
  • 带你搞懂朴素贝叶斯分类算法

    万次阅读 多人点赞 2017-04-14 16:19:33
    贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。这篇文章我尽可能用直白的话语总结一下我们学习会上讲到...
  • 遥感图像分类

    万次阅读 2019-01-28 21:36:02
    遥感图像分类 一、背景简介 遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的...
  • 夜深人静写算法(八)- 朴素贝叶斯分类

    万次阅读 多人点赞 2018-01-04 21:21:22
    朴素贝叶斯分类算法:基于概率的经典分类算法
  • BERT模型实战之多文本分类(附源码)

    万次阅读 多人点赞 2019-03-21 11:00:36
    写在前面 BERT模型也出来很久了,之前看了论文学习...这篇文章的内容还是以比较简单文本分类任务入手,数据集选取的是新浪新闻cnews,包括了[‘体育’, ‘财经’, ‘房产’, ‘家居’, ‘教育’, ‘科技’, ‘时尚’...

空空如也

1 2 3 4 5 ... 20
收藏数 1,593,913
精华内容 637,565
关键字:

分类