精华内容
下载资源
问答
  • 1) 根据作者查询作者著作参考文献; 2) 根据题目查询参考文献; 3) 根据关键字查询该关键字相关参考文献; 4) 根据研究领域查询该领域参考文献。 1.3 混合查询 根据作者、题目、关键词或研究领域混合查询相关参考...
  • 超好用的代码统计工具——cloc ...文章目录超好用的代码统计工具——cloccloc简介cloc特点cloc下载cloc使用参考文献 cloc简介 Cloc是一款使用Perl语言开发的开源代码统计工具,支持多平台使用、多语言识...

    超好用的代码统计工具——cloc

    因为申请软件著作权的时候需要进行代码统计,所以找了一圈代码统计工具。先找到了SourceCount,似乎不再更新了用不了。然后找到了cloc,操作有点繁琐,以下总结一下。

    cloc简介

    Cloc是一款使用Perl语言开发的开源代码统计工具,支持多平台使用、多语言识别,能够计算指定目标文件或文件夹中的文件数(files)、空白行数(blank)、注释行数(comment)和代码行数(code)。

    cloc特点

    Cloc具备很多特性以致于让它更方便于使用、完善、拓展和便携。

    1. 作为一个单一的独立形式存在的文件,Cloc只需要下载相应文件并运行这样最少的安装工作即可。 能够从源码文件中识别编程语言注释定义;
    2. 允许通过语言和项目来分开统计计算
    3. 能够以纯文本、SQL、XML、YAML、逗号分隔等多样化的格式生成统计结果;
    4. 能够统计诸如tar、Zip等格式的压缩文件中的代码数; 有许多排除式的指令
    5. 能够使用空格或者不常用的字符处理文件名和目录名;
    6. 不需要依赖外部标准的Perl语言配置; 支持多平台使用。

    cloc下载

    1、官方github
    2、我下好的存在网盘里了。cloc1.84最新版本
    提取码:cik1

    cloc使用

    如果官网下的,改名为cloc.exe (因为要在cmd中执行)

    放到工程所在目录,E:\Workspace\app,统计app文件夹内所有代码

    打开cmd窗口,cd E:\Workspace\app 到app目录下

    执行命令 cloc . 注意先空格再句号,代表当前目录示意图

    参考文献

    https://blog.csdn.net/hui1502/article/details/51191678
    https://www.jianshu.com/p/c83306e18b37

    展开全文
  • 参考文献4.Matlab代码 摘要:帝国主义竞争算法最初是由 Atashpaz-Gargari and Lucas 于 2007 年在对基于人口数量最优化算法的著作中提出。在算法中, 每一个个体都被定义为一个国家,同时,所有的国家被分类为两类,...

    智能优化算法:帝国主义竞争算法-附代码


    摘要:帝国主义竞争算法最初是由 Atashpaz-Gargari and Lucas 于 2007 年在对基于人口数量最优化算法的著作中提出。在算法中, 每一个个体都被定义为一个国家,同时,所有的国家被分类为两类,即帝国主义国家和殖民地。帝国主义国家为最初时人口数量最有优势的国家,而剩下的国家即为殖民地。每个国家的力量被用来指明它的
    健康程度。在该算法的反复使用过程中,帝国之间相互竞争以获得尽可能多的殖民地为目的。更有力量的帝国有更高的可能性去占领更多的殖民地,而力量薄弱的帝国将逐渐失去他们的殖民地。当所有的殖民地都被一个帝国占有时,该算法即为结束。在连续函数优化方面帝国主义竞争算法在效率和质量方面超过遗传算法和粒子群优化算法。

    1.算法原理

    1.1 帝国集团的初始化

    在一个NVARN_{VAR} 维的最优化问题中,一个国家即为一个 1NVAR1*N_{VAR}的矩阵。该矩阵定义如下:
    country=[p1,p2,...,pNvar] country = [p_1,p_2,...,p_{N_{var}}]
    此处,PiP_i为被优化的变量。这些在国家属性中的变量为浮点数。国家中的每个变量可以被理解为这个国家的社会政治属性。在算法中几时要求我们寻找到最小的成本值。每个国家的成本由变量所组成的函数ff决定:
    cost=f(country)=f(p1,p2,...,pNvar) cost = f(country)=f(p_1,p_2,...,p_{N_{var}})
    为了开始该最优化算法,必须初始化国家数量 NcountryN_{country} . 我们选择 NimpN _{imp}个最优力量的国家来形成帝国集团。剩下的 NcolN_{col}个最初国家作为这些帝国集团中的殖民地。
    为了形成最初的帝国集团,殖民地依据各帝国的力量情况决定。即:一个帝国集团最初拥有的殖民地数量应直接与其力量所占比例相关。为了能按比例分配殖民地,每个帝国的成本被定义为:
    Cn=cnmax{ci} C_n=c_n-max\{c_i\}
    在这里,CnC_n 为第 nn个帝国的成本。计算了所有帝国的成本后,帝国的相对力量定义为:
    pn=cni=1Nimpci p_n=|\frac{c_n}{\sum_{i=1}^{Nimp}}c_i|
    最初的殖民地的分配依赖于其所属的帝国集团的力量。从而最初的殖民地分配为:
    N.C.n=round{pn.Ncol} N.C._n=round\{p_n.N_{col}\}
    在这里,N.C.nN.C._n 为第 nn 个帝国所拥有的殖民地数量。如图 1 所示的初始化帝国集团,越大的帝国集团拥有更多的殖民地数量,同时,弱小的集团拥有较少的殖民地。在该图中,帝国 1 组成最有力量的帝国集团,于是它拥有最多的殖民地数量。

    在这里插入图片描述

    图1.初始化帝国集团:帝国拥有的殖民地越多,它所代表的五角星越大

    1.2 帝国集团内部调整

    为了实现吸收壮大的目的,帝国试图去吸收它们的殖民地并使其成为帝国的一部分。更准确的说,殖民地沿着坐标轴向着帝国移动。移动过程如图 2 所示。考虑一个二维最优化问题,殖民地在由文化和语言组成的坐标轴中被帝国吸收。殖民地将会不断地向帝国移动,最终将使殖民地完全被帝国吸收。
    在这里插入图片描述

    图2.殖民地向其相关帝国的移动

    在图 2 中,xx 为一个服从均匀分布的随机数xU(0,β×d)x\sim U(0, β×d), 在这里 $β 1为比 1 大的数,同时d为殖民地与帝国的距离。b>1$将使殖民地从两边都离帝国更近。帝国对殖民地的吸收并不直接导致殖民地向帝国的移动。即是说,殖民地并不一定依照向量所示方向向帝国移动。为了更好模型化这个事实,引入一个随机的角度作为移动的方向。

    革命是指在力量和组织结构的基础方面在相对短时间内发生变化。在 ICA 的术语中,革命使一个国家的社会政治特征突然产生变化。即是说,与帝国的吸收不同,殖民地是随机的在社会政治坐标轴中突然发生位置上的改变。图 2 和图 3 是在文化语言坐标轴中的革命过程。这种革命增加了该算法的搜索过程同时组织了国家形成早期的局部收敛。算法中的革命率显示的是每个殖民地随机改变它们位置的比例。一个较高的革命率会降低算法的搜索效果并降低收敛率。在我们的应用中,我们将革命率设定为 0.3. 即是指帝国集团中有 30% 的殖民地会随机改变它们的位置。

    在这里插入图片描述

    图3 一个国家社会政治特征的突然改变

    1.3 交换帝国和殖民地的位置

    当殖民地向帝国移动的过程中,殖民地可能会到达一个成本比帝国要低的点。在这种情况下,帝国和殖民地即交换它们的位置。而后,算法将由在新位置的帝国吸收新位置的殖民地过程继续下去。如图 4 所示为帝国和殖民地交换位置的过程。在改图中,最好的殖民地由深色表示,该殖民地比其帝国的成本要小。如图 5 所示为殖民地和帝国交换位置后的状态。
    在这里插入图片描述

    图4 交换殖民地和帝国的位置

    在这里插入图片描述

    图5 交换位置后的帝国和殖民地的状态

    在殖民地和帝国向着目标最小值移动的过程中,一些帝国可能会移动到相似的位置,如果两帝国之间的位置要小于初始位置,它们将会合并为一个新的帝国集团。原帝国集团的殖民地将会成为新帝国集团的殖民地,同时新帝国的位置将由原帝国中二者之一的位置所决定。图 6 和图 7显示的合并过程。
    在这里插入图片描述

    图6 合并前的帝国集团

    在这里插入图片描述

    图7 两帝国合并后的状态

    1.4 帝国集团竞争

    一个帝国集团的总力量主要由它的帝国力量所决定。可是殖民地的力量也对帝国集团的力量有影响。一个帝国集团的总成本由下式所决定:
    T.C.=Cost(imprialistn)+ξmean{Cost(coloniesofempiren)} T.C.=Cost(imprialist_n)+\xi mean\{Cost(coloniesofempire_n)\}
    此处,T.C.T.C. 为第 nn 个帝国集团的总成本。 ξξ 为一个较小的正数。 ξξ 越大会使殖民地对帝国集团的影响越大。在大部分的情况下 ξξ 取 0.1 被认为是最好的。

    每个帝国集团都试图占领并控制其他帝国集团的殖民地。帝国竞争过程中,强国将更强,弱国将更弱。帝国竞争一般先选出最弱帝国集团,并使其他帝国集团竞争去占领该集团。图 8显示帝国竞争。在这个过程中,基于各自的力量,每个集团都有占领最弱集团的可能性。从另一个方面来说,最弱国不一定确定被最强国家占领,但是越强的集团占领弱集团的可能性越大。

    在这里插入图片描述

    图8 帝国竞争:帝国越有力量,越有可能占领最弱帝国集团的殖民地

    为了开始这个竞争过程,首先最弱的帝国集团的一个殖民地将被选出来,并确定每个国家占领的可能性。占领可能性PpP_p 依据帝国集团的总力量所决定:
    N.T.C.n=T.C.nmax{T.C.i} N.T.C.n = T.C.n - max\{T.C.i\}
    此处,T.C.nT.C.nN.C.nN.C.n 为第 nn 个帝国集团的总成本和相对成本。依据相对成本,每个帝国的占领可能性由下式决定:
    Ppn=N.T.C.ni=1NimpN.T.C.i P_{pn}=|\frac{N.T.C.n}{\sum_{i=1}^{Nimp}}N.T.C.i|
    为了将在帝国集团中将上述的殖民地分类,我们引入如下向量PP
    P=[Pp1,Pp2,Pp3,...,PpNimp] P=[P_{p1},P_{p2},P_{p3},...,P_{pNimp}]
    向量 RR 是与向量 PP 具有相同规格的向量,其元素服从均匀分布:
    R=[r1,r2,...,rNimp],r1,r2,...,rNimpU(0,1) R=[r_1,r_2,...,r_{Nimp}],r1,r2,...,r_{Nimp}\sim U(0,1)
    向量 DD 由向量 PP 减去向量 RR 所得:
    D=PR=[pp1r1,...,ppNimprNimp] D = P-R = [p_{p1}-r1,...,p_{p_{Nimp}}-r_{Nimp}]
    向量 DD 中元素值最大的对应帝国集团即会占领上述的殖民地。这样选择帝国集团的过程与遗传算法中选择母类的轮盘赌过程相似。但是这里的选择方法比相关的轮盘赌过程要快。因为这个过程并不需要
    计算累积分布函数,并且选择过程仅仅基于可能性的值。因此,帝国集团的选择过程可以完全替换遗传算法中的轮盘赌,并增加执行速度。上述步骤将会持续下去直至实现国家收敛并且达到成本最小的目标。不同标准可用来结束该算法。一种思想是设定最大迭代次数。或者当仅剩一个帝国集团时即结束该算法。

    帝国主义算法流程描述如下:
    1)初始化帝国主义竞争算法的参数:NpopN_{pop} , NimpN_{imp}
    2)随机生成 NpopN_{pop} 作为国家的人口数量。选择NimpN_{imp} 最好的国家作为帝国并根据他们的能力规定他们的殖民地数量;

    3)如果终止条件未得到满足,则重复下列步骤;
    4)内部位置交换;
    5)帝国主义竞争;
    6)淘汰弱小的帝国;
    7)保留最终剩余的帝国,其适应度取值作为
    最优解。

    流程图如图所示:
    在这里插入图片描述

    2.算法结果

    在这里插入图片描述

    3.参考文献

    [1] Esmaeil Atashpaz-Gargari,Caro Lucas.ImperialistCompetitive Algorithm: An Algorithm for OptimizationInspired by Imperialistic Competition 1-4244-1340-0/07_c 2007 IEEE.

    [2]陈志楚,李聪,张超勇.基于帝国主义竞争算法的切削参数优化[J].制造业自动化,2012,34(24):10-15.

    4.Matlab代码

    https://mianbaoduo.com/o/bread/aJiYmJo=

    展开全文
  • 学习支持向量机时参考了很多大神的博客,和经典著作,从公式推导到代码实现,亲历亲为。 遇到很多疑惑,也是各种百度+Google,虽然最后也差不多都解决了,但终归是因为数学基础不...参考文献及完整代码在文末。 1....

    学习支持向量机时参考了很多大神的博客,和经典著作,从公式推导到代码实现,亲历亲为。

    遇到很多疑惑,也是各种百度+Google,虽然最后也差不多都解决了,但终归是因为数学基础不扎实。

    在这里做一个总结,以便以后复习。

    有些地方加入了我自己的理解,仅作参考。

    当然,如有疑问,请各位不吝赐教。

    线性不可分的情况和核函数的部分本文没有涉及。(主要是作者本人也不是很懂。。。

    参考文献及完整代码在文末。

    码字不易,不如点赞支持一下这个推公式推到头秃的博主?


    1. SVM解决的问题

    SVM解决的问题是经典的二元分类问题。给出一个分类标准使得样本集可以被最好地分类。在样本特征是二维的情况下,可以用下图表示

    在这里插入图片描述
    上图是我用Python实现的SVM分类器的最终结果图。

    中间的实线是我们最终需要的分割线,在三维及以上的情况下叫做划分超平面

    画圈的样本是距离分割线最近的样本,叫做支持向量,这也是支持向量机名字的由来。两条黄色的虚线之间的距离叫做间隔,显然,这个间隔越大,也就代表两边的样本离分割线越远,我们得到的分割线就越鲁棒。

    SVM的最终目的就是求出分割线的所有参数,在这个过程中还要确定样本中的支持向量是哪些。

    2. 目标函数

    我们的目的是找到使间隔最大的支持向量和分割平面,那么下面就要找到间隔的数学表达,也就是目标函数。

    首先,样本集表示为:
    D={(x1,yi),(x2,y2)...(xm,ym)}D=\{(\boldsymbol x_1,y_i), (\boldsymbol x_2, y_2)...(\boldsymbol x_m,y_m)\}
    其中,xiRn\boldsymbol x_i \in {\rm {R}}^n, yi{+1,1},i=1,2,...,my_i\in\{+1, -1\}, i=1,2,...,m.
    xi\boldsymbol x_i 是n维向量,为了便于可视化,我们以二维为例。
    划分超平面表示为:
    f(x)=wTx+bf(x) = \boldsymbol w^T\boldsymbol x + b
    我们将这个超平面标记为 (w,b)(\boldsymbol w,b)
    样本点到超平面的距离表示为:
    γ=wTx+bw\gamma=\frac{|\boldsymbol w^T\boldsymbol x+b|}{||\boldsymbol w||}
    假设超平面 (w,b)(\boldsymbol w, b) 可以将样本点正确分类,那么每个样本集中的点到超平面的距离 γi\gamma_i 应该都大于等于支持向量(假设表示为 x0\boldsymbol x_0)到超平面的距离 γ^\hat \gamma:
    wTxi+bwwTx0+bw,i=1,2,...m\frac{|\boldsymbol w^T\boldsymbol x_i+b|}{||\boldsymbol w||} \geq \frac{|\boldsymbol w^T\boldsymbol x_0+b|}{||\boldsymbol w||}, i=1,2,...m
    那么支持向量与超平面的间隔就是不等式右边的部分。但是它过于复杂,所以这里对(w,b)(\boldsymbol w,b) 进行缩放变换,使得 wTx0+b=1|\boldsymbol w^T\boldsymbol x_0+b| = 1。这样处理对结果不会有影响,原因如下:

    假设 wTx0+b=c,cR\boldsymbol w^T \boldsymbol x_0 + b = c, c \in R,因为支持向量不在分割超平面上,所以 c0c \neq 0。因此只要两边同除 cc 就可以了。

    变换之后的不等式为:
    wTxi+bw1w,i=1,2,...m\frac{|\boldsymbol w^T\boldsymbol x_i+b|}{||\boldsymbol w||} \geq \frac{1}{||\boldsymbol w||}, i=1,2,...m

    两个异类支持向量之间的间隔表示为:2/w{2}/{||\boldsymbol w||},就是目标函数。对上式两边同时乘以 w||\boldsymbol w|| 可得,对样本集 DD 的所有点满足:
    {wTxi+b+1,y=+1wTxi+b1,y=1 \begin{cases} \boldsymbol w^T \boldsymbol x_i + b \geq+1, y=+1 \\ \boldsymbol w^T \boldsymbol x_i + b \leq -1, y=-1 \end{cases}
    合并一下就是:yif(xi)=yi(wTxi+b)1y_if(x_i)=y_i(\boldsymbol w^T \boldsymbol x_i + b) \geq 1

    《机器学习》书中对这部分的描述如下:
    在这里插入图片描述
    目标函数的数学表达:
    maxw,b2w \max_{\boldsymbol w,b} \frac{2}{||\boldsymbol w||}

    为了方便计算,将上式取倒数,并对 w||\boldsymbol w|| 取平方,得到最终需要优化的目标函数:
    minw,b12w2s.t. yi(wTxi+b)1,i=1,2,...m \begin{aligned} & \min_{\boldsymbol w,b} \frac{1}{2}||\boldsymbol w||^2 \\[2ex] & \text{s.t. } y_i(\boldsymbol w^T \boldsymbol x_i + b) \geq 1, i=1,2,...m \end{aligned}

    3. 目标函数的优化

    如果没有约束条件,这就是一个简单的多项式求极值的问题,只需令一阶导数等于零,二阶导数小于零求出w\boldsymbol w的所有元素即可。
    但是有了约束条件就要使用些特殊方法,比如拉格朗日乘子法

    为什么要用拉格朗日乘子法?
    在特征维度低的线性问题中是可以不使用的,具体参考:https://www.zhihu.com/question/36694952

    3.1 拉格朗日乘子法(Lagrange Multiplier)

    这里简单介绍一下拉格朗日乘子法及KKT条件的原理和使用。
    对有一个等式约束的凸函数优化问题:
    minxf(x)s.t. h(x)=0 \begin{aligned} & \min_{\boldsymbol x} f(\boldsymbol x) \\[2ex] & \text{s.t. } h(\boldsymbol x)=0 \end{aligned}
    在三维的情况下,h(x)=0h(\boldsymbol x)=0 是一个曲面,这个曲面在坐标轴 x-y 平面上的投影是一条曲线,也就是,看起来和 x-y 平面 “垂直”。
    f(x)f(\boldsymbol x)是一个凸函数,其与h(x)h(\boldsymbol x)相交。
    在这里插入图片描述
    上图中红色代表f(x)f(\boldsymbol x)的等值线,蓝色线代表h(x)h(\boldsymbol x)在x-y平面上的投影。

    而两个曲面相交的部分是一条曲线,这条曲线在f(x)f(\boldsymbol x)曲面上的最低点(就是图中黄色的点)就是f(x)f(\boldsymbol x)取最小值的点。

    这个点一定与f(x)f(\boldsymbol x)的某一条等值线相切。且在切点处两函数的梯度共线(可以同向或反向)。即存在λ0\lambda \neq 0,使得在最小值点处:
    f(x)+λh(x)=0\nabla f(\boldsymbol x^*) + \lambda \nabla h(\boldsymbol x^*) = 0
    其中,x\boldsymbol x^*是最小值点。此时,令拉格朗日函数为:
    L(x,λ)=f(x)+λh(x)L(\boldsymbol x,\lambda)= f(\boldsymbol x) + \lambda h(\boldsymbol x)
    对该函数求导得:
    L(x,λ)=f(x)+λh(x)\nabla L(\boldsymbol x,\lambda)=\nabla f(\boldsymbol x) + \lambda \nabla h\boldsymbol (x)
    显然,当x=x\boldsymbol x=\boldsymbol x^*时,L(x,λ)=0\nabla L(\boldsymbol x,\lambda) = 0。也就是说,L(x,λ)L(\boldsymbol x,\lambda)f(x)f(\boldsymbol x)同时取得极小值。

    也就是说,带有等式约束的优化问题转化为了不带约束条件的优化问题。

    L(x,λ)L(\boldsymbol x, \lambda)x,λ\boldsymbol x,\lambda 的导数都为0就可以得到最小值。

    3.2 KKT条件

    以上方法适用于在约束为等式的情况。当约束为不等式时,即:
    minxf(x)s.t. g(x)0 \begin{aligned} & \min_{\boldsymbol x} f(\boldsymbol x) \\[2ex] & \text{s.t. } g(\boldsymbol x) \leq 0 \end{aligned}
    在这里插入图片描述
    极小值点的位置存在以下两种情况(以一个不等式约束为例):

    • 极小值点在 g(x)<0g(\boldsymbol x)<0 区域内,此时可以忽略约束条件直接对f(x)f(\boldsymbol x)求极小值即可,相当于把上节中的 λ\lambda 置零;
    • 极小值点在边界 g(x)=0g(\boldsymbol x)=0 上,此时与3.1节所述情况一样。唯一不同的是,在上图所示的极值点处,f(x)f(\boldsymbol x)g(x)g(\boldsymbol x) 的梯度方向一定相反。(如果它们梯度方向相同,就可以继续向两者减小的方向优化)

    将以上两种情况结合可得,存在μ0\mu \geq 0 使得:
    μg(x)=0\mu g(\boldsymbol x)=0
    由此引出f(x)f(\boldsymbol x) 取得极小值的充分必要条件,即KKT(Karush-Kuhn-Tucker)条件:
    {g(x)0μ0μg(x)=0 \begin{cases} g(\boldsymbol x) \leq 0 \\ \mu \geq 0 \\ \mu g(\boldsymbol x)=0 \end{cases}
    原函数 f(x)f(\boldsymbol x) 转化为与上节形式相同的拉格朗日函数。

    将这几种情况结合起来,推广到具有多个不等式或等式约束的优化问题上:

    对有有限个约束的最小化问题:
    minxf(x)s.t. hi(x)=0,i=1,,2,...mgj(x)0,j=1,,2,...n \begin{aligned} & \min_{\boldsymbol x} f(\boldsymbol x) \\[2ex] \text{s.t. }& h_i(\boldsymbol x)=0, i=1,,2,...m \\[2ex] & g_j(\boldsymbol x)\leq 0,j=1,,2,...n \\[2ex] \end{aligned}
    其拉格朗日函数为:
    L(x,λi)=f(x)+i=1mλihi(x)+j=1nμjgj(x) L(\boldsymbol x,\lambda_i)= f(\boldsymbol x) + \sum_{i=1}^m \lambda_i h_i (\boldsymbol x)+ \sum_{j=1}^n \mu_j g_j (\boldsymbol x)

    KKT条件为:
    {hi(x)=0gj(x)0λi,μj0μjgj(x)=0 \begin{cases} h_i(\boldsymbol x) =0 \\[2ex] g_j(\boldsymbol x) \leq 0 \\[2ex] \lambda_i, \mu_j \geq 0 \\[2ex] \mu_j g_j(\boldsymbol x)=0 \end{cases}

    3.3 对偶问题

    现在我们回到第2节末尾,再看这个优化问题:
    minw,b12w2s.t. yi(wTxi+b)1,i=1,2,...m \begin{aligned} & \min_{\boldsymbol w,b} \frac{1}{2}||\boldsymbol w||^2 \\[2ex] & \text{s.t. } y_i(\boldsymbol w^T \boldsymbol x_i + b) \geq 1, i=1,2,...m \end{aligned}
    这就是个适用于不等式约束的优化。拉格朗日函数如下:
    L(w,b,α)=12w2+i=1mαi(1yi(wTxi+b))αi0L(\boldsymbol w, b, \alpha) = \frac{1}{2}||\boldsymbol w||^2 + \sum_{i=1}^m{\alpha_i(1-y_i(\boldsymbol w^T \boldsymbol x_i + b))}, \alpha_i \geq 0
    若要求L(w,b,α)L(\boldsymbol w, b, \alpha) 的最小值则首先把 w,b\boldsymbol w, b 看作常量,对L(w,b,α)L(\boldsymbol w, b, \alpha)求关于α\alpha的最大值。因为 1yi(wTxi+b)1-y_i(\boldsymbol w^T \boldsymbol x_i + b) 是小于等于0的,在αi0\alpha_i \geq 0的前提下,其最大值就是:12w2\frac{1}{2}||\boldsymbol w||^2

    因此,原问题可写为:
    minw,bmaxαiL(w,b,α)\min_{\boldsymbol w, b}\max_{\alpha_i}L(\boldsymbol w, b, \alpha)
    直接对该问题求解比较困难,因此这里引入对偶问题。

    使用对偶问题求解的原因不止是为了计算方便,还是为线性不可分时核函数的引入作铺垫(本文不涉及这部分)。

    先上结论:
    minw,bmaxαiL(w,b,α)=maxαiminw,bL(w,b,α)\min_{\boldsymbol w, b}\max_{\alpha_i}L(\boldsymbol w, b, \alpha)=\max_{\alpha_i}\min_{\boldsymbol w, b}L(\boldsymbol w, b, \alpha)

    也就是求取最大最小值的顺序发生了变化。从先对α\alpha求最大值变为先对 w,b\boldsymbol w, b 求最小值。

    等式两边的问题互为对偶问题。

    当然两个对偶问题同时取得最优解是有条件的,具体证明可以参考:https://www.cnblogs.com/90zeng/p/Lagrange_duality.html

    转化为对偶问题后,令 w,b\boldsymbol w, b 的导数为0:
    {Lw=wi=1mαiyixi=0Lb=i=1mαiyi=0 \begin{cases} \cfrac{\partial L}{\partial \boldsymbol w}=\boldsymbol w-\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i=0 \\[2ex] \cfrac{\partial L}{\partial b}=-\sum_{i=1}^m\alpha_iy_i=0 \end{cases}
    将上式代入 L(w,b,α)L(\boldsymbol w, b, \alpha) 并化简可得:
    L(w,b,α)=i=1mαi12i=1mj=1mαiαjyiyjxiTxj L(\boldsymbol w, b, \alpha)=\sum_{i=1}^m\alpha_i-\frac12\sum_{i=1}^m\sum_{j=1}^m\alpha_i \alpha_jy_iy_j\boldsymbol x_i^T\boldsymbol x_j
    化简过程如下:(公式太多还是手写吧emmm…)
    在这里插入图片描述
    化简后就只用求 α\alpha 即可。这样问题的复杂度就从与样本的维度有关变为只与样本数量有关了。

    周志华的《机器学习》一书对这个最优解的几何意义有一段描述可以参考:
    在这里插入图片描述

    3.4 SMO(Sequential Minimal Optimazation)方法

    上节最后得到的关于 α\alpha 的式子是一个二次规划问题,使用通用算法开销比较大。SMO方法是1998年提出的,用于求取SVM中的拉格朗日乘子,比通用算法更加高效。

    其主要思想为,选取两个变量αi,αj\alpha_i, \alpha_j,固定其他参数,对这两个参数进行优化,然后重复这个过程。

    Note:选取αi,αj\alpha_i, \alpha_j的标准:
    在这里插入图片描述
    不过博主有点懒,所以直接随机选取了。。。。需要深入了解可以参考《机器学习》(文末有下载方法~)

    每次选取两个的原因是这些参数之间有约束 i=1mαiyi=0\sum_{i=1}^m\alpha_iy_i=0,只改变一个约束会被打破。

    为了表示方便,记选取的两个参数为α1,α2\alpha_1, \alpha_2,固定除α1,α2\alpha_1, \alpha_2以外的参数:
    α1y1+α2y2=i1,2αiyi=ξα1=y1(ξα2y2) \alpha_1y_1+ \alpha_2y_2 =- \sum_{i\neq 1,2}\alpha_i y_i=\xi \\[2ex] \alpha_1 = y_1(\xi-\alpha_2y_2)

    带入L(w,b,α)L(\boldsymbol w, b, \alpha)得:

    为简便表示,下式中,Kij=xiTxjK_{ij} =\boldsymbol x_i^T\boldsymbol x_j

    L(w,b,α)=i=1mαi12i=1mj=1mαiαjyiyjKij=i3mαi+y1ξα2y1y2+α212i3mj3mαiαjyiyjKij12(y1ξα2y1y2)2K11y2α2(ξα2y2)K1212α22K22i3m(ξα2y2)αiyiK1ii3mα2y2αiyiK2i=α2y1y2+α212(y1ξα2y1y2)2K11y2α2(α2y2)K1212α22K22i3m(ξα2y2)αiyiK1ii3mα2y2αiyiK2i+constant=α2y1y2+α212α22K11+α2y2ξK11α2y2ξK12+α22K1212α22K22+i3mα2y2αiyiK1ii3mα2y2αiyiK2i+constant \begin{aligned} &L(\boldsymbol w, b, \alpha) \\[2ex] =& \sum_{i=1}^m\alpha_i-\frac12\sum_{i=1}^m\sum_{j=1}^m\alpha_i \alpha_jy_iy_jK_{ij} \\[2ex] =& \sum_{i\geq 3}^m\alpha_i + y_1\xi-\alpha_2y_1y_2 + \alpha_2 - \cfrac12 \sum_{i\geq 3}^m\sum_{j\geq 3}^m\alpha_i \alpha_jy_iy_jK_{ij} - \cfrac12(y_1\xi-\alpha_2y_1y_2)^2K_{11}-y_2\alpha_2(\xi-\alpha_2y_2)K_{12}-\cfrac12 \alpha_2^2 K_{22} \\[2ex] & -\sum_{i\geq 3}^m(\xi-\alpha_2y_2)\alpha_iy_iK_{1i} - \sum_{i\geq 3}^m\alpha_2y_2\alpha_iy_iK_{2i} \\[2ex] =& -\alpha_2y_1y_2 + \alpha_2 - \cfrac12(y_1\xi-\alpha_2y_1y_2)^2K_{11}-y_2\alpha_2(-\alpha_2y_2)K_{12}-\cfrac12 \alpha_2^2 K_{22} \\[2ex] & -\sum_{i\geq 3}^m(\xi-\alpha_2y_2)\alpha_iy_iK_{1i} - \sum_{i\geq 3}^m\alpha_2y_2\alpha_iy_iK_{2i}+ constant \\[2ex] =& -\alpha_2y_1y_2 + \alpha_2 - \cfrac12\alpha_2^2K_{11} + \alpha_2y_2\xi K_{11} - \alpha_2y_2\xi K_{12} + \alpha_2^2K_{12}-\cfrac12 \alpha_2^2 K_{22} \\[2ex] & +\sum_{i\geq 3}^m\alpha_2y_2\alpha_iy_iK_{1i} - \sum_{i\geq 3}^m\alpha_2y_2\alpha_iy_iK_{2i} + constant \\[2ex] \end{aligned}
    因为我们的最终目的是让 L(w,b,α)L(\boldsymbol w, b, \alpha)α2\alpha_2 求导,而其他 α\alpha 已被固定,视为常数。且 x,yx, y 也都是已知常数,所以将上式中不含 α2\alpha_2 的常数项合并为 constantconstant

    下一步,令其 α2\alpha_2 的导数为0:

    L(w,b,α)α2=y1y2+1α2K11+y2ξK11y2ξK12+2α2K12α2K22+i3my2αiyiK1ii3my2αiyiK2i=0 \cfrac{\partial L(\boldsymbol w, b, \alpha)}{\partial \alpha_2} = -y_1y_2 + 1 - \alpha_2K_{11} + y_2\xi K_{11} - y_2\xi K_{12} + 2\alpha_2K_{12}- \alpha_2 K_{22} + \sum_{i\geq 3}^my_2\alpha_iy_iK_{1i} - \sum_{i\geq 3}^my_2\alpha_iy_iK_{2i}=0

    由上节可知:
    w=i=1mαiyixif(x1)=wTx1+b=i=1mαiyiK1i+bf(x2)=wTx2+b=i=1mαiyiK2i+b\boldsymbol w=\sum_{i=1}^m\alpha_iy_i\boldsymbol x_i \\[2ex] f(\boldsymbol x_1)=\boldsymbol w^Tx_1+b=\sum_{i=1}^m\alpha_iy_iK_{1i} + b \\[2ex] f(\boldsymbol x_2)=\boldsymbol w^Tx_2+b=\sum_{i=1}^m\alpha_iy_iK_{2i} + b \\[2ex]

    注意到这个形式和上面的最后两项很相似,所以可以带进去计算。

    但是需要注意的是这里的f(x)f(\boldsymbol x)是常量(否则带入一个变量并不利于求导结果的计算),所以这里的f(x)f(\boldsymbol x)中包含的 αi(i=1,2,...,m)\alpha_i(i=1,2,...,m) 是初始化时赋予的值,将其记作 α2old\alpha_2^{old};把其他的 α2\alpha_2 看作待更新的变量,记作 α2new\alpha_2^{new}

    L(w,b,α)α2=y1y2+1α2newK11+y2ξK11y2ξK12+2α2newK12α2newK22+y2[f(x1)(ξα2oldy2)K11α2oldy2K12b]y2[f(x2)(ξα2oldy2)K12α2oldy2K22b]=(K11K22+2K12)α2new+(K11+K222K12)α2old+1+y1y2+y2[f(x1)f(x2)]=0 \begin{aligned} \cfrac{\partial L(\boldsymbol w, b, \alpha)}{\partial \alpha_2} = & -y_1y_2 + 1 - \alpha_2^{new}K_{11} + y_2\xi K_{11} - y_2\xi K_{12} + 2\alpha_2^{new}K_{12}- \alpha_2^{new} K_{22} \\[2ex] & +y_2[f(x_1)-(\xi - \alpha_2^{old}y_2)K_{11}- \alpha_2^{old}y_2K_{12} - b] - y_2[f(x_2)-(\xi - \alpha_2^{old}y_2)K_{12}- \alpha_2^{old}y_2K_{22} - b] \\[2ex] = & (-K_{11}-K_{22}+2K_{12})\alpha_2^{new} + (K_{11}+K_{22}-2K_{12})\alpha_2^{old}+1+y_1y_2+y_2[f(x_1)-f(x_2)] \\[2ex] = & 0 \end{aligned}

    η=K11+K222K12\eta=K_{11}+K_{22}-2K_{12},得:
    L(w,b,α)α2=ηα2new+ηα2old+1+y1y2+y2[f(x1)f(x2)]=0α2new=α2old+1+y1y2+y2[f(x1)f(x2)]η \cfrac{\partial L(\boldsymbol w, b, \alpha)}{\partial \alpha_2} = -\eta\alpha_2^{new}+\eta\alpha_2^{old} +1+y_1y_2+y_2[f(\boldsymbol x_1)-f(\boldsymbol x_2)]=0 \\[2ex] \alpha_2^{new} = \alpha_2^{old}+\cfrac{1+y_1y_2+y_2[f(\boldsymbol x_1)-f(\boldsymbol x_2)]}{\eta}
    同时,因为需要求最大值,所以还要求对 α2\alpha_2 的二阶导小于零:

    2L(w,b,α)2α2=K11K22+2K120η=K11+K222K120 \cfrac{\partial^2 L(\boldsymbol w, b, \alpha)}{\partial^2 \alpha_2} = -K_{11}-K_{22}+2K_{12} \leq 0 \\[2ex] \eta = K_{11}+K_{22}-2K_{12} \geq 0

    到这里为止,α2\alpha_2 的更新已经完成,α1\alpha_1 可以通过两者之间的约束求得。
    α1newy1+α2newy2=α1oldy1+α2oldy2=ξ \alpha_1^{new}y_1 + \alpha_2^{new}y_2 = \alpha_1^{old}y_1 + \alpha_2^{old}y_2=\xi \\[2ex]
    最后一步,就是求解参数 bb
    在这里插入图片描述
    本文只采用了前一种方法,感兴趣的童鞋可以用(6.18)的方法试试,欢迎在评论区讨论~

    具体操作如下:

    假设更新过后的 α2new>0\alpha_2^{new} >0,即该 α2new\alpha_2^{new} 对应的样本为支持向量,则满足 y2fnew(x2)=1y_2f^{new}(\boldsymbol x_2)=1,结合更新之前的 f(x2)f(\boldsymbol x_2)

    {f(x2)=i3mαiyiK2i+α1oldy1K11+α2oldy2K12+boldy2(i3mαiyiK2i+α1newy1K11+α2newy2K12+bnew)=1 \begin{cases} f(\boldsymbol x_2) = \sum_{i \geq 3}^{m}\alpha_iy_iK_{2i} + \alpha_1^{old}y_1K_{11}+\alpha_2^{old}y_2K_{12} + b^{old} \\[2ex] y_2(\sum_{i \geq 3}^{m}\alpha_iy_iK_{2i} + \alpha_1^{new}y_1K_{11}+\alpha_2^{new}y_2K_{12} + b^{new}) = 1 \end{cases}
    解得:
    bnew=y2f(x2)(α1newα1old)y1K11+(α2newα2old)y2K12 b^{new}= y_2 - f(\boldsymbol x_2)-(\alpha_1^{new} - \alpha_1^{old})y_1K_{11} + (\alpha_2^{new} - \alpha_2^{old})y_2K_{12}

    4 软间隔

    由于不是所有的数据集都可以完美的用一条线分割开,在两个类别中间可能会有个别样本点超过分割平面,使得数据集不能被完美分开。即便可以被分开,也有可能是过拟合造成的。

    这时我们的算法需要对这些异常点进行容错,使其不影响数据集正常划分。

    异常点的表示就是其不满足约束条件:

    yi(wTxi+b)1 y_i(\boldsymbol w^T \boldsymbol x_i + b) \geq 1

    不过我们希望不满足约束的样本越少越好,因此将原问题改为:

    minw,bL(w,b)=minw,b12w2+Ci=1ml0/1(yi(wTxi+b)1)\min_{\boldsymbol w, b}L(\boldsymbol w, b) =\min_{\boldsymbol w, b} \frac{1}{2} || \boldsymbol w ||^2 +C \sum_{i=1}^m{l_{0/1}(y_i(\boldsymbol w^T \boldsymbol x_i + b ) - 1)}

    C>0C>0 是一个常数。当其取较大的值时,就迫使更多的样本趋于满足约束条件,取无穷大时就和原问题等价。

    l0/1l_{0/1}叫做“0/1损失函数”,数学表示为:

    l0/1(z)={1,if z<0 0,else l_{0/1}(z) = \begin{cases} 1, & \text{if $z<0$ } \\[2ex] 0, & \text{else} \end{cases}

    但是它数学性质不好,不连续,所以我们用合页损失函数(Hinge loss)代替:

    lhinge(z)=max(0,1z)l_{hinge}(z)=\max(0, 1-z)

    如下图(图片来自《机器学习》):
    在这里插入图片描述
    此时,优化目标变为:

    minw,b12w2+Ci=1mmax(0,1yi(wTxi+b))\min_{\boldsymbol w, b} \frac{1}{2}||\boldsymbol w||^2 +C \sum_{i=1}^m{\max(0, 1 - y_i (\boldsymbol w^T \boldsymbol x_i + b))}

    这里有一个问题,按照合页损失函数的定义,把前面式子中的求和项带入,得到的结果应该是: 1z=1(yi(wTxi+b)1)=2yi(wTxi+b)1-z=1-(y_i(\boldsymbol w^T \boldsymbol x_i + b ) - 1) = 2-y_i(\boldsymbol w^T \boldsymbol x_i+ b )
    个人理解是,根据我们要解决的问题对hinge损失函数做了改动:
    lhinge(z)=max(0,z)l_{hinge}(z)=\max(0, -z)

    优化目标里含有max(),显然不便于计算,所以这里引入“松弛变量(slack variables)” ξi0\xi_i \geq 0,表示每个样本不满足约束的程度。若样本 xix_i 满足约束,则对应的ξi=0\xi_i = 0;若不满足,则 1yi(wTxi+b)ξi1 - y_i (\boldsymbol w^T \boldsymbol x_i + b) \leq \xi_i。优化目标可以重新写为:
    minw,b12w2+Ci=1mξis.t. 1yi(wTxi+b)ξiξi0 \begin{aligned} &\min_{\boldsymbol w, b} \frac{1}{2}||\boldsymbol w||^2 +C \sum_{i=1}^m{\xi_i} \\[2ex] \text{s.t. } & 1 - y_i (\boldsymbol w^T \boldsymbol x_i + b) \leq \xi_i \\[2ex] & \xi_i \geq 0 \end{aligned}

    和前面一样,重新使用拉格朗日乘子法。拉格朗日函数:

    L(w,b,α,μ)=12w2+Ci=1mξi+i=1mαi(1yi(wTxi+b)ξi)i=1mμiξiαi,μi0L(\boldsymbol w, b, \alpha, \mu) = \frac{1}{2}||\boldsymbol w||^2 +C \sum_{i=1}^m{\xi_i} + \sum_{i=1}^m{\alpha_i(1-y_i(\boldsymbol w^T \boldsymbol x_i + b) - \xi_i)} - \sum_{i=1}^m\mu_i\xi_i,\\[2ex] \alpha_i,\mu_i \geq 0

    求解过程也和前面一样,贴个图:
    在这里插入图片描述在这里插入图片描述
    和前面得到的结果对比一下,唯一不同的地方在于 αi\alpha_i 的取值范围有了上界。这个上界来源于图片上的式(6.39),意义就是表示了算法对于样本点的容错程度。

    5 代码

    下面,我们将把以上的算法用Python程序实现。
    首先我们对上面的算法步骤作一个总结,帮助我们理清思路:

    整个SMO算法分为以下几个阶段:

    • 选择 α1,α2\alpha_1, \alpha_2
    • 判断 η=K11+K222K120\eta = K_{11}+K_{22}-2K_{12} \geq 0
    • 计算 α2new=α2old+1+y1y2+y2[f(x1)f(x2)]η\alpha_2^{new} = \alpha_2^{old}+\cfrac{1+y_1y_2+y_2[f(x_1)-f(x_2)]}{\eta}
    • α1,α2\alpha_1, \alpha_2 做上下界限定,范围为 [0,C][0, C]
    • 判断 α2\alpha_2 的改变量是否足够大,太小视为不变
    • 计算 α1new=α1old+α2oldy1y2α2newy1y2\alpha_1^{new} = \alpha_1^{old} + \alpha_2^{old}y_1y_2 - \alpha_2^{new}y_1y_2
    • 计算 bb
    • 重复以上步骤

    5.1 数据集生成及一些辅助函数

    写了一个简单的函数用来随机生成数据集。

    指定一条曲线 f(x)f(x),本例中是 f(x)=xf(x)=x,随机均匀生成100对数据,取值为[0, 10],标为两个类别并画图表示。(为了突出两数据集的间隔,这里舍弃与分割线垂直距离小于1的点)

    import matplotlib.pyplot as plt
    import numpy as np
    
    def generate_dataset():
        # np.random.seed(3)
        class1 = []; class2 = []
        label1 = []; label2 =[]
        # define decision line
        def f(x):
            return 1*x
        for _ in range(100):
            x = np.random.rand() * 10
            y = np.random.rand() * 10
            if y-f(x) > 1:
                class1.append([x, y])
                label1.append(1)
            elif y-f(x) < -1:
                class2.append([x, y])
                label2.append(-1)
        x1, y1 = zip(*[data for data in class1])
        x2, y2 = zip(*[data for data in class2])
        plt.plot(x1, y1, 'ro')
        plt.plot(x2, y2, 'bo')
        plt.axis([0,10,0,10])
        plt.show()
        return class1+class2, label1+label2
    

    随机选择第2个参数的下标:

    def select_j(i, m):
        j = i
        while(j == i):
            j = np.random.randint(0, m)
        return j
    

    限制 α\alpha 的上下界:

    def clip_alpha(aj, H: float, L:float):
        return min(max(L, aj), H)
    

    已知 α\alphaw\boldsymbol w

    def get_W(alphas, dataset, label):
        a, x, y = map(np.array, [alphas, dataset, label])
        W = np.dot(a * y, x)
        # transform W form np.array to Python List
        return W.tolist()
    

    5.2 主函数

    简化版的SMO算法:

    def smo_simple(dataset, labels, C, max_iter):
        data = np.array(dataset, dtype=np.float)
        label = np.array(labels, dtype=np.float)
        b = 0
        m, n = np.shape(data)
        alphas = np.zeros(m, dtype=np.float)
        iter = 0
        while iter < max_iter:
            alpha_pair_changed = 0
            for i in range(m):
                x_i, y_i = data[i], label[i]
                fx_i = np.dot(alphas*label, np.dot(data, x_i)) + b
                e_i = fx_i - y_i
                j = select_j(iter, m)
                x_j, y_j = data[j], label[j]
                fx_j = np.dot(alphas*label, np.dot(data, x_j)) + b
                e_j = fx_j - y_j
    
                # calculate a_j_new
                eta = np.dot(x_i, x_i) + np.dot(x_j, x_j) - 2*np.dot(x_i, x_j)
                if eta <= 0:
                    print("eta <= 0, continue")
                    continue
                a_i, a_j = alphas[i], alphas[j]
                a_j_new = a_j + y_j * (e_i - e_j) / eta
    
                # limit a_j_new to [0, C]
                if y_i == y_j:
                    L = max(0., a_i + a_j - C)
                    H = min(a_i + a_j, C)
                else:
                    L = max(0., a_j - a_i)
                    H = min(C - a_i + a_j, C)
                if L < H:
                    a_j_new = clip_alpha(a_j_new, H, L)
                else:
                    print("L >= H. (L, H) =", (L, H))
                    continue
    
                # judge if a_j moves an enough distance
                if abs(a_j_new - a_j) < 0.00001:
                    print("a_j has not moved enough, a_j_new - a_j = %f" % (a_j_new - a_j))
                    continue
    
                # calculate a_i_new and update a_i, a_j
                a_i_new = (a_j - a_j_new)*y_i*y_j + a_i
                alphas[i], alphas[j] = a_i_new, a_j_new
                alpha_pair_changed += 1
    
                #calculate b
                b_i = -e_i + (a_i - a_i_new)*y_i*np.dot(x_i, x_i) + (a_j - a_j_new)*y_j*np.dot(x_i, x_j) + b
                b_j = -e_j + (a_i - a_i_new)*y_i*np.dot(x_i, x_j) + (a_j - a_j_new)*y_j*np.dot(x_j, x_j) + b
                # b = b_i if b_i == b_j else (b_i + b_j)/2
                if 0 < a_i_new < C:
                    b = b_i
                elif 0 < a_j_new < C:
                    b = b_j
                else:
                    b = (b_i + b_j)/2
    
                print("(a_i, a_j) moved from (%f, %f) to (%f, %f)." % (a_i, a_j, a_i_new, a_j_new))
    
    
            if alpha_pair_changed == 0:
                print("Iteration %d of max_iter %d" % (iter+1, max_iter))
                iter += 1
            else:
                iter = 0
    
        return alphas, b
    

    main函数:

    dataset, label = generate_dataset()
    # print(label)
    alphas, b = smo_simple(dataset, label, C=6, max_iter=40)
    print(alphas)
    W = get_W(alphas, dataset, label)
    print(W, b)
    

    *5.3 使用matplotlib绘图

    如果想要可视化计算结果,可以在main函数后添加以下代码:

    class1, class2 = [], []
    for data in zip(dataset, label):
        if data[1] == 1.0:
            class1.append(data[0])
        elif data[1] == -1.0:
            class2.append(data[0])
    x11, x12 = zip(*class1)
    x21, x22 = zip(*class2)
    plt.plot(x11, x12, 'ro')
    plt.plot(x21, x22, 'bo')
    
    x = np.linspace(0, 10, 50)
    y = -(W[0]*x + b)/W[1]
    plt.plot(x, y)
    for i in range(len(dataset)):
        if alphas[i] > 1e-3:
            xi_1, xi_2 = dataset[i][0], dataset[i][1]
            plt.scatter(xi_1, xi_2, s=150, c='none', linewidths=1.5, edgecolors='#1f77b4')
            x = np.linspace(0, 10, 50)
            y = -W[0]/W[1] * x + (xi_2 + W[0]/W[1] * xi_1)
            plt.plot(x, y, 'y--')
    plt.show()
    

    6 github 地址

    https://github.com/chenyr0021/machine_learning_exercises

    7 参考文献

    1. 《机器学习》,周志华
    2. 《机器学习实战》,Peter Harrington
    3. 简易解说拉格朗日对偶(Lagrange duality)
    4. 支持向量机系列(5)——SMO算法解对偶问题
    5. SVM为什么能够求解对偶问题,求解对偶问题为什么和原问题一样?为什么要求解对偶问题?svm的公式是什么?如果线性不可分怎么办?
    6. 为什么支持向量机要用拉格朗日对偶算法来解最大化间隔问题?
    7. 机器学习算法实践-SVM中的SMO算法
    8. 支持向量机通俗导论(理解SVM的三层境界)

    都看到这里了,不点赞支持一下头秃博主吗


    知乎:@陈小白233
    公众号:一本正经的搬砖日常

    扫码关注公众号即可获赠《机器学习》、《机器学习实战》电子书~

    在这里插入图片描述

    展开全文
  • 然而,与开发新代码相比,修改代码更加令人生畏,而且长期以来缺乏文献和资料可供参考。 本书是继《重构》和《重构与模式》之后探讨修改代码技术的又一里程碑式的著作,而且从涵盖面和深度上都超过了前两部经典。书...
  • 大学文献检索资料 DOC

    2009-11-28 10:35:24
    德温特专利文献检索工具的符号体系及名词解释:专利权人代码后的“-”号,表示小公司。“/”号,表示个人。 “=”号,表示俄罗斯(或前苏联)的机构。无符号,表示大公司。 专利号前的“★ ”号,表示基本专利。 “=...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    1.9 参考文献 16 第2章 c++概览 19 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24...
  • 1.9 参考文献 16 第2章 c++概览 19 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24...
  • 重构,一言以蔽之,就是在不改变外部行为的前提下,... 13.7 参考文献 第14章 重构工具 14.1 使用工具进行重构 14.2 重构工具的技术标准 14.3 重构工具的实用标准 14.4 小结 第15章 总结 参考书目 要点列表 索引
  • 显著性目标检测模型评价指标(二)——PR曲线

    万次阅读 热门讨论 2018-03-19 22:19:42
    显著性目标检测模型评价指标 之 PR曲线原理与实现代码 目录 显著性目标检测模型评价指标 之...参考文献 一、PR曲线原理 在显著目标提取中(关于视觉显著性的简要介绍点此处链接),PR曲线是用来评...

    显著性目标检测模型评价指标 之 PR曲线原理与实现代码

    目录


    一、PR曲线原理

    在显著目标提取中(关于视觉显著性的简要介绍点此处链接),PR曲线是用来评估模型性能的重要指标之一,PR曲线中的P(Precision)和R(Recall)分布意为“查准率”和“查全率”。以“查准率”为纵坐标,“查全率”为横坐标所做的曲线即为PR曲线(如下图,来自南京大学周志华教授主编的《机器学习》第二章,p31)。
    PR曲线示意图

    计算方法

    我们将模型所提的显著性目标图谱S进行二值化得到M,然后通过下面公式逐像素对比M与Ground-truth来计算Precision值与Recall值[1]:
    这里写图片描述
    如下图所示,模型输出的显著性图片与Ground-truth图在一般情况下都不会完全相同,即我们模型所提取出的显著性图mask出了正确被分类的目标(TP)与背景(TN)外,会将一部分本应该是背景的区域划到目标区域(FP),将一部分本应该是目标的区域划为背景区域(FN)。
    PR曲线示意图
    通过统计我们获得TP、TN、FP、FN的数目,然后利用下式来计算Precision值与Recall值。
    这里写图片描述

    阈值选取

    将输出图片S进行二值化时,阈值选择为从0到255,每取一个阈值,即可对所有输出图S算得一组相对应的Precision值与Recall值。最后将所有图像在该阈值下的Precision值与Recall值分别求平均,最后将会得到256对P,R值,以Recall为横坐标,Precision为纵坐标绘制曲线图即可得到precision-recall (PR)曲线。

    二、Matlab代码

    代码块语法遵循标准markdown代码,例如:

    function PRcurveHanle
    %本程序的功能是对显著性特征提取的结果绘制PR曲线。
    %by hanlestudy@163.com
    clc
    clear
    close all
    %读取数据库
    imnames=dir(path_output);  
    imnames2=dir(path_target);  
    num=length(imnames);
    Precision=zeros(256,num);
    Recall=zeros(256,num);
    TP=zeros(256,num);
    FP=zeros(256,num);
    FN=zeros(256,num);
    MAES=zeros(num,1);
    for j=1:num
        Target=imread(imnames2(j).name);%读图
        Output=imread(imnames(j).name);
        target=rgb2gray(Target);        %二值化ground-truth
        target0=(target)>0;
        for i=0:255
            %以i为阈值二值化Output
            output0=(Output)>i;
            output1=output0*2;
            TFNP=zeros(256,256);
            x=1;
            TFNP(:,:)=output1(:,:,x)-target0;
            TP(i+1,j)=length(find(TFNP==1));
            FP(i+1,j)=length(find(TFNP==2));
            FN(i+1,j)=length(find(TFNP==-1));
            Precision(i+1,j)=TP(i+1,j)/(TP(i+1,j)+FP(i+1,j));
            Recall(i+1,j)=TP(i+1,j)/(TP(i+1,j)+FN(i+1,j));
        end
        j
    end
    P=mean(Precision,2);
    R=mean(Recall,2);
    figure,plot(R,P)  
    

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    参考文献

    [1]: A. Borji, M.-M. Cheng, H. Jiang, and J. Li. Salient object detection: A benchmark. IEEE TIP, 24(12):5706–5722, 2015.

    展开全文
  • 显著性目标检测模型评价指标(三)——F-measure

    万次阅读 热门讨论 2018-03-19 23:03:03
    显著性目标检测模型评价指标 之 F-measure原理与实现代码 目录 显著性目标检测模型评价指标 之 F-...参考文献 一、F-measure原理 上篇博客中,我们介绍了PR曲线,但是很多情况下,不管是查准率...
  • 包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都提供了大量的练习和参考文献。...
  • 本书是编译原理课程的经典教材,作者曾多次使用本书的内容...提供了大量的练习和参考文献。 本书可以作为高等院校计算机专业本科生和研究生编译原理与技术课程的 教材,也可以作为计算机技术人员必读的专业参考书之一。
  • 包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都提供了大量的练习和参考文献。...
  • 包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,每章都提供了大量的练习和参考文献。...
  • 欢迎访问 VSLAM_note !...参考文献 高翔, 张涛, 颜沁睿, 刘毅, 视觉SLAM十四讲:从理论到实践, 电子工业出版社, 2017 版权和许可 VSLAM_note 由 GNU General Public License v3.0 许可 提供 谢谢!
  • 参考文献 http://www.ccopyright.com/mobile/index.php?optionid=1368 (中国版权保护中心官网) http://www.jht868.com/a/2875447.html (个人版合作开发协议) https://www.66law.cn/contractmodel/28128.aspx ...
  • 在本书的最后,作者给出了许多经典的参考文献,并一一写出了评论。 第2卷是第1卷的继续深入。读者在学习这一卷时,应当先具备第1卷所阐述的关于TCP/IP的基本知识。本卷的特点是使用大量的源代码来讲述TCP/IP协议族中...
  • 《数字图像处理原理与实践:基于Visual C++开发》全面系统地讲述了在Visual C++环境下进行数字图像处理编程的技术和方法。全书共分成14章,针对数字图像处理领域中的核心话题,如色彩空间、图像文件格式、...参考文献
  • 内容提要: 本书是关于C和C++安全编码的著作。本书介绍了C和C++程序中已经导致危险的、破坏性的基本编程错误,包括在字符串、指针、动态内存管理、整数、格式化输出、文件I/O等中的漏洞或缺陷。本书还提供了对这些...
  • c++程序设计 谭浩强part1

    热门讨论 2010-02-23 20:07:09
    c++程序设计 谭浩强 本书是谭浩强教授的又一力作,依据C++标准进行介绍,引导学生学习标准C++,而不仅学习依赖于某一特定环境下的“方言化”的C++ ,教与学的新突破,学习“C++ 程序设计”从此变得容易。...参考文献
  • 1.9 参考文献 16 第2章 c++概览 19 2.1 为什么是c++ 19 2.2 程序设计范型 19 2.3 过程式程序设计 20 2.3.1 变量和算术 21 2.3.2 检测和循环 22 2.3.3 指针和数组 23 2.4 模块程序设计 23 2.4.1 分别编译 24...
  • 文本格式化时去掉文本中的摘要、目录、参考文献及非中文字符。 生成的查重报告为rtf格式。 引用的库 1、IKVM 2、Spire.Doc Free 3、pdfbox 开源合规 IKVM使用了GPLv2协议,受限于GPLv2的传染性,本项目源代码采用...
  • 《明解C语言 第3版 入门篇》是日本的C语言经典教材,自出版以来不断重印、修订,被誉为“C语言圣经”。 《明解C语言 第3版 入门篇》图文并茂,示例丰富,第3版从190段代码和164幅图表增加到205段代码和...参考文献 405
  • 本书介绍了构建更优雅、更有效的软件的更省时技术、算法和技巧。这些方法都非常实用,而且很有趣,有时候会让人觉得意想不到,就像在解好玩的谜题一样。相信任何想要得到提高的程序员都能从本书中...参考文献 412
  • TCP/IP的世界经典教材就是他们所著,他们的著作已誉满全球,我国多家出版社也引进了其多部著作的版权。他们的TCP/IP网络互联技术卷1、卷2、卷3在我国都有影印版本。  Douglas E.Comer博士从20世纪70年代开始从事...
  • 附录e 参考文献 附录f 函数和宏定义索引表 附录g 结构定义索引表 附录h 中英文词汇对照表 ↑折 叠 译者序  译者直到去年9月中旬才惊悉本书作者W.Richard Stevens博士已逝世的恶耗。在此之前译者只是奇怪有相当长...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

参考文献著作代码