-
基于顺序启发的管材一维下料算法
2018-05-18 20:46:56利用顺序启发原理实现管材一维下料,文件包含三个测试文件,分别为管材长度,需求长度和需求量。 -
求一个一维下料算法的Java实现
2017-08-17 16:00:13条件:为多源线材,能够限定每根线材最多几种零件种类 例如:木材料长度有10,12,13 要切割成的零件有 3, 4, 5, 6 每种零件需求为 15, 16, 18, 20 每种母材上只能有2种零件(这个数字可变) ... -
解一维下料问题的遗传算法.
2015-07-06 19:56:00基于一维算法的一维下料问题模型计算,仅供参考。不谢 -
matlab 遗传算法 一维下料问题
2011-08-25 14:02:31matlab 遗传算法 一维下料问题 非常不错 希望对各位有用 -
论文研究-基于改进文化算法的一维下料问题 .pdf
2019-08-21 00:00:32基于改进文化算法的一维下料问题,吴迪,张剑飞,一维优化下料问题是工程应用中普遍存在的一种组合优化问题,属于NP完备问题。针对一维下料问题,本文将混沌算法,博弈论和遗传算� -
蜂群遗传算法在一维下料问题中的应用
2020-10-18 21:20:08针对一维下料优化问题,根据企业的实际生产情况,考虑能够满足和不满足生产两种情况,建立一个新的优化模型,并使用蜂群遗传算法求解方案。用各零件长度的一个排列作为一个染色体,每个零件的长度作为染色体的一个... -
一维下料问题的改进自适应遗传算法
2011-11-24 12:49:42用改进的遗传算法求解工业应用中的一维下料问题 -
单纯型算法解决一维下料
2011-09-10 12:45:47铁塔用角钢材料的下料问题研究,用delphi语言,改进型单纯型算法 -
分支定界算法优化一维下料问题
2011-08-21 10:29:48可以用分支定界法求解出一维的下料问题。有利于解决NP问题。 -
人工鱼群算法及其在一维下料问题中的运用.ppt
2020-01-26 11:54:20数值试验 算法中使人工鱼逃逸局部极值实现全局寻优的因素主要有以下几种 觅食行为中try_number的次数较少时为人工鱼提供了随机游动的机 会从而能跳出局部极值的邻域; 随机步长的采用使得在前往局部极值的途中有可能... -
论文研究-解决二维下料问题的顺序启发式算法.pdf
2019-09-11 08:39:28针对一类状态和状态时滞具有不确定性的时滞系统,研究了该系统基于T-S模糊模型的鲁棒H∞控制器的设计问题。采用线性矩阵不等式LMI的方法,设计一个包含状态变量导数的模糊控制器,得到了系统鲁棒镇定且满足H∞性能... -
将遗传算法用于二维下料问题的一些结果
2007-08-14 17:48:00二维下料问题是说,在固定宽度的板材上切割下一些要求大小的目标物,使得消耗的板材长度最小。对于这个问题,可以把他抽象为这样的数学模型:每一个目标物设置一个id号,这样一组id号就构成了一个切割顺序。显然,在...最近做了这方面的事情。把自己的一些经验跟大家分享一下。
遗传算法是一种优化算法,所以可以应用在很多地方。尤其是对于比较复杂或者难于求出精确解的问题,该方法给出了比较好的解决方案。
二维下料问题是说,在固定宽度的板材上切割下一些要求大小的目标物,使得消耗的板材长度最小。
对于这个问题,可以把他抽象为这样的数学模型:每一个目标物设置一个id号,这样一组id号就构成了一个切割顺序。显然,在这样的模型下,切割顺序和切割方式对于最终的结果有比较大的影响。
略去切割方式,本文在一种切割方式下,集中对切割顺序作一个小小的分析。
我选择的切割方法是:将进入的目标物从下到上,从左到右地在板材上找空闲位置,找到后将板材上的该区域标记;重复上述过程直到没有目标物进入为止。
在上述切割方式下,我的目标转化为找到一个合适的序列使得切割后使用的板材长度尽可能地小。
对于这个序列,我使用了遗传算法。遗传算法控制参数很多,尤其是初始种群的选取对于该算法有较大影响。我选择了从大到小排列目标物,然后象挤牙膏那样生成一组新的序列。用这样的序列进行进化。基本上对于较小数目的目标物,很快能给出次优序列。从本人实验的结果看,优化率((直接切割所需长度-优化后所需长度)/直接切割所需长度)平均为11%,有时甚至高达28%。可见,优化和不优化还是有很大差别的。
最近就做了遗传算法这方面的一点事情。希望对您能有用。 -
论文研究-多尺寸圆木二维下料问题研究.pdf
2019-09-06 16:25:02圆木二维下料问题是木材企业中常见问题,针对一些头部与尾部直径相差不大的木材,可以将这些木材看作是圆柱体,下料时将其切成和圆木长度相等的多个长方体毛坯,该问题可转化为二维下料问题。采用顺序价值校正框架和... -
二维激光连续切割移动材料路径算法及约束
2021-02-05 04:35:31提出了一种逐行获取信息的阅读文档(RW)模型,并利用该模型...并且通过Pro/E运动仿真模拟和单位时间切割效率验证,所提出的G(t)符合恒速体连续切割路径算法,且满足约束限制下,一个周期内可实现两段材料的连续剪切。 -
基于交货期的多目标一维优化下料模型研究
2020-10-18 02:24:22根据目前对优化下料问题新特性的研究,指出优化下料问题呈现多目标和复杂约束状态,建立了以原料消耗最少和不同交货期的惩罚最小为目标函数的优化下料问题的数学模型。利用多目标智能优化算法求解模型,并结合算例... -
论文研究-基于EPFF算法的下料问题模型.pdf
2019-09-12 08:43:33研究一维单一原料下料问题,将最优化模型和EPFF算法相结合,建立了混合型模型,即先采用EPFF算法得到下料方式阵,再将其代入线性规划模型中,加上了加工时间以及最大加工能力的限制;最后确定了满足要求的实用下料... -
lisp最小外接矩形算法_干货 | 二维矩形剪裁算法介绍
2020-12-17 10:40:33背景下料问题(Cutting Stock Problem)是把固定形状的一种或多种(少量)材料切分加工为若干(多种)不同大小规格的零件的问题。下料问题广泛存在于制造业中,尤其是其中的生产加工工艺流程,大到机加工的零件切分、航空...背景
下料问题(Cutting Stock Problem)是把固定形状的一种或多种(少量)材料切分加工为若干(多种)不同大小规格的零件的问题。下料问题广泛存在于制造业中,尤其是其中的生产加工工艺流程,大到机加工的零件切分、航空复合材料的切分、造船业的板类剪裁,小到家装家具木料剪裁、服装布料剪裁、铝制门窗的材料切割、金属管道的切割等等。
制造业中,压缩成本,提高利润率一直是一个永恒课题,而在下料场景中,如何最大化利用原材料,提高材料利用率,减少废品率在该课题下显得尤为重要。研究下料问题,设计一套完备的下料引擎,不仅可以提高生产中材料利用率,还可以极大程度降低材料管理的人力成本,提高管理效率。
下料问题按原材料和零件的维度,可以分为一维、二维和三维下料问题。其中一维下料问题指原材料是柱形或棒形材料的下料,二维下料问题主要指板型材料的下料,三维下料问题指材料在长宽高均有要求的下料。雪浪云下料引擎对3种下料场景均有完整的解决方案,未来也会针对每种算法进行专门的讲述。
下料问题中,二维下料问题最为常见。这里根据切分后物体的形状,又可分为矩形二维下料和异形二维下料,本文则重点介绍在矩形二维下料的算法和实际应用。
算法介绍和对比
二维矩形材料的下料剪裁问题指的是如何在标准板上规划并且剪裁一定数量的不同长宽的零件,并同时最小化标准板的使用数量来节约生产成本的切割问题。这个问题在很多材料加工的行业中都是很关键的一个步骤。在零件数量和种类相对较少的情况下,人工排版基本上能在较短的时间内排出合理的剪裁方案。但是当订单数量增多,合单后的零件数量较多的情况下,人工排版就会显得相对低效。而二维下料剪裁算法,则可以根据用户需求,在极短的时间内完成对大订单的零件排版,同时将材料的损耗降到最低。
而在二维下料剪裁算法中,又分断头台算法(Guillotine)和非断头台算法(Maximal-Rectangle)。两者的区别从结果上看,前者的排版在每次被切割的时候,都能找到横向或者纵向一刀切的位置,这在很多行业(航空、建筑等)的材料加工中都是非常常见的;后者的排版则不具备这个属性,这种方法相对而言会比前者增加板材的利用率,但是同时对加工设备的要求也更高(需要能随时转向的切割工具)。
图1a)
图1b)
图1a)和1b)为断头台算法在10x6的标准板上的排版
图2 非断头台算法在同样的标准板上对同一批零件进行的排版
可以看到的是,非断头算法将所有零件都排在了一块标准板上而断头台算法因为要满足横纵一刀的切割模式,无法将零件统一排在一块标准板上。下文将讲述两种算法所使用的一些启发函数,以及两者在排版过程中最大的不同。
步骤1:整理输入的零件参数(长、宽),并将其按排序规则排序(面积降序、最长边降序、最短边降序等)并确定板材规格(长、宽)
步骤2.1:将零件依据排好的顺序从从可用板材中选出最适合该零件放入的板材,并将该零件从该板材的最左下角置入
步骤2.2-a(断头台算法):每当一个板材中被置入一个零件,剩下的空间则会根据一定分裂规则分裂成两个小材料。如图3所示原来的R1在置入了P1以后,剩余的空间在R1的较短边方向截成了R2与R3,所生成的新R2与R3则成了新的可用板材。
步骤2.2-b(非断头台算法):相较于2.2-a,在非断头台算法中,这个步骤在进行对剩余面积的分裂的过程中,不会将R1拆分成独立的R2与R3,而是生成两个拥有交叉面积的R2与R3(如下图)并放入可用板材列表中,这部分的区别就是造成断头台和非断头台之间的主要差异的原因(下面会有一个案例分析简介)。
步骤3:当某零件无法放入剩余的所有可用板材时(包括之前分裂出来的类似R2与R3板材),将零件放入一个全新的板材;并重复步骤2-3直到所有零件都已经被排入板材中。
下图概括了整个算法的流程:
断头台与非断头台算法的案例解析:
由上图可见,在断头台算法的限制下,P5无法放入原来所有的任何材料内(标红),而非断头算法则正好有一个足够的空间可以容下P5。
总结
二维矩形下料,在实际生产中非常常见,且下料方案的优劣直接影响对原材料的利用率,因此大部分企业会增派专门人手甚至部门,设计最优的下料方案。当订单量和订单复杂度非常高时,人工排料的质量和速度则无法保证,该情况下,人力很难在短时间内快速生成非常优秀的下料方案。设计一套完整高可用的下料算法引擎,有三方面的意义:
提高原材料利用率,最大程度降低废料率
减少人力成本,无需花费大量人力和精力用于计算最优排料方案
方便生产管理,采用该系统辅助优化,能够与生产或业务系统对接,及时了解和管理生产进度,跟踪原料的使用情况
目前,雪浪云下料系统已经成功应用在家具行业木料剪裁,服装行业布料剪裁,和一些大型制造业的材料切割系统中。在各种规模的场景下,均能够快速得到可执行程度高的下料切割方案,大大提高了原材料利用率。
同时,在一些特殊复杂加工场景(如立体物体的热处理、喷漆等),雪浪云运筹学团队将下料算法、复杂排产算法、产销量预估等多种技术结合,辅助企业完成全链路生产优化。
目前,雪浪云的下料引擎基础版已发布,旨在帮助用户在下料场景中,能够以极低的成本快速完成精准下料方案。雪浪云将秉承普惠机器智能理念,为企业输出越来越多廉价、可用的智能解决方案,帮助企业完成工业智能化升级。
扫码关注,欢迎更多家具下料相关技术交流与合作
↓ ↓ ↓
-
论文研究-改进非支配排序进化算法在下料问题中的应用.pdf
2019-09-13 12:35:41针对一维下料问题,提出了减少废料、减少下料设置时间和减少可回收余料的三目标优化模型,用改进的非支配排序进化算法求出问题的Pareto最优解集,运用逼近理想解方法从解集中选出一个满意解作为下料方案,各优化目标... -
基于图像跟踪的低维材料实时应变测量方法
2021-02-10 04:08:23然后分级施加荷载,不仅实时跟踪到目标,而且得到低维材料在相应载荷下的实时应变值,为研究低维材料动态力学特性提供了一种实验方法。通过实验,验证了数字图像跟踪技术完全可以应用于低维材料的实时应变测量,并且适用... -
论文研究-基于速度约束算法的动态布料模拟.pdf
2019-09-06 21:37:20针对传统的二维线性判别方法提取出的人脸特征系数维数大的问题,提出一个改进的双向二维线性判别分析方法GB2DLDA。双向压缩类内和类间散布矩阵,用压缩后的散布矩阵构成两个Fisher鉴别准则函数,求出两个投影矩阵,... -
支持向量机SVM算法学习(一)
2016-04-07 22:31:31最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很...【转载请注明出处】http://www.cnblogs.com/jerrylead
1 简介
支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的。这份材料从前几节讲的logistic回归出发,引出了SVM,既揭示了模型间的联系,也让人觉得过渡更自然。
2 重新审视logistic回归
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
形式化表示就是
假设函数
其中x是n维特征向量,函数g就是logistic函数。
可以看到,将无穷映射到了(0,1)。
而假设函数就是特征属于y=1的概率。
当我们要判别一个新来的特征属于哪个类时,只需求
,若大于0.5就是y=1的类,反之属于y=0类。
再审视一下
,发现
只和
有关,
>0,那么
,g(z)只不过是用来映射,真实的类别决定权还在
。还有当
时,
=1,反之
=0。如果我们只从
出发,希望模型达到的目标无非就是让训练数据中y=1的特征
,而是y=0的特征
。Logistic回归就是要学习得到
,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练实例上达到这个目标。
图形化表示如下:
中间那条线是
,logistic回顾强调所有点尽可能地远离中间那条线。学习出的结果也就中间那条线。考虑上面3个点A、B和C。从图中我们可以确定A是×类别的,然而C我们是不太确定的,B还算能够确定。这样我们可以得出结论,我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优。因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。我想这就是支持向量机的思路和logistic回归的不同点,一个考虑局部(不关心已经确定远离的点),一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)。这是我的个人直观理解。
3 形式化表示
我们这次使用的结果标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。同时将
替换成w和b。以前的
,其中认为
。现在我们替换
为b,后面替换
为
(即
)。这样,我们让
,进一步
。也就是说除了y由y=0变为y=-1,只是标记不同外,与logistic回归的形式化表示没区别。再明确下假设函数
上一节提到过我们只需考虑
的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:
4 函数间隔(functional margin)和几何间隔(geometric margin)
给定一个训练样本
,x是特征,y是结果标签。i表示第i个样本。我们定义函数间隔如下:
可想而知,当
时,在我们的g(z)定义中,
,
的值实际上就是
。反之亦然。为了使函数间隔最大(更大的信心确定该例是正例还是反例),当
时,
应该是个大正数,反之是个大负数。因此函数间隔代表了我们认为特征是正例还是反例的确信度。
继续考虑w和b,如果同时加大w和b,比如在
前面乘个系数比如2,那么所有点的函数间隔都会增大二倍,这个对求解问题来说不应该有影响,因为我们要求解的是
,同时扩大w和b对结果是无影响的。这样,我们为了限制w和b,可能需要加入归一化条件,毕竟求解的目标是确定唯一一个w和b,而不是多组线性相关的向量。这个归一化一会再考虑。
刚刚我们定义的函数间隔是针对某一个样本的,现在我们定义全局样本上的函数间隔
说白了就是在训练样本上分类正例和负例确信度最小那个函数间隔。
接下来定义几何间隔,先看图
假设我们有了B点所在的
分割面。任何其他一点,比如A到该面的距离以
表示,假设B就是A在分割面上的投影。我们知道向量BA的方向是
(分割面的梯度),单位向量是
。A点是
,所以B点是x=
(利用初中的几何知识),带入
得,
进一步得到
再换种更加优雅的写法:
当
时,不就是函数间隔吗?是的,前面提到的函数间隔归一化结果就是几何间隔。他们为什么会一样呢?因为函数间隔是我们定义的,在定义的时候就有几何间隔的色彩。同样,同时扩大w和b,w扩大几倍,
就扩大几倍,结果无影响。同样定义全局的几何间隔
5 最优间隔分类器(optimal margin classifier)
回想前面我们提到我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。形象的说,我们将上面的图看作是一张纸,我们要找一条折线,按照这条折线折叠后,离折线最近的点的间距比其他折线都要大。形式化表示为:
到此,我们已经将模型定义出来了。如果求得了w和b,那么来一个特征x,我们就能够分类了,称为最优间隔分类器。接下的问题就是如何求解w和b的问题了。
由于
不是凸函数,我们想先处理转化一下,考虑几何间隔和函数间隔的关系,
,我们改写一下上面的式子:
这时候其实我们求的最大值仍然是几何间隔,只不过此时的w不受
的约束了。然而这个时候目标函数仍然不是凸函数,没法直接代入优化软件里计算。我们还要改写。前面说到同时扩大w和b对结果没有影响,但我们最后要求的仍然是w和b的确定值,不是他们的一组倍数值,因此,我们需要对
做一些限制,以保证我们解是唯一的。这里为了简便我们取
。这样的意义是将全局的函数间隔定义为1,也即是将离超平面最近的点的距离定义为
。由于求
的最大值相当于求
的最小值,因此改写后结果为:
这下好了,只有线性约束了,而且是个典型的二次规划问题(目标函数是自变量的二次函数)。代入优化软件可解。
到这里发现,这个讲义虽然没有像其他讲义一样先画好图,画好分类超平面,在图上标示出间隔那么直观,但每一步推导有理有据,依靠思路的流畅性来推导出目标函数和约束。
接下来介绍的是手工求解的方法了,一种更优的求解方法。
-
SVM算法详解
2015-12-24 21:23:13最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很...转载注明出处:转载处
重点是介绍了松弛变量的含义
1 简介
支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的。这份材料从前几节讲的logistic回归出发,引出了SVM,既揭示了模型间的联系,也让人觉得过渡更自然。
2 重新审视logistic回归
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
形式化表示就是
假设函数
其中x是n维特征向量,函数g就是logistic函数。
可以看到,将无穷映射到了(0,1)。
而假设函数就是特征属于y=1的概率。
当我们要判别一个新来的特征属于哪个类时,只需求
,若大于0.5就是y=1的类,反之属于y=0类。
再审视一下
,发现
只和
有关,
>0,那么
,g(z)只不过是用来映射,真实的类别决定权还在
。还有当
时,
=1,反之
=0。如果我们只从
出发,希望模型达到的目标无非就是让训练数据中y=1的特征
,而是y=0的特征
。Logistic回归就是要学习得到
,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练实例上达到这个目标。
图形化表示如下:
中间那条线是
,logistic回顾强调所有点尽可能地远离中间那条线。学习出的结果也就中间那条线。考虑上面3个点A、B和C。从图中我们可以确定A是×类别的,然而C我们是不太确定的,B还算能够确定。这样我们可以得出结论,我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优。因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。我想这就是支持向量机的思路和logistic回归的不同点,一个考虑局部(不关心已经确定远离的点),一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)。这是我的个人直观理解。
3 形式化表示
我们这次使用的结果标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。同时将
替换成w和b。以前的
,其中认为
。现在我们替换
为b,后面替换
为
(即
)。这样,我们让
,进一步
。也就是说除了y由y=0变为y=-1,只是标记不同外,与logistic回归的形式化表示没区别。再明确下假设函数
上一节提到过我们只需考虑
的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:
4 函数间隔(functional margin)和几何间隔(geometric margin)
给定一个训练样本
,x是特征,y是结果标签。i表示第i个样本。我们定义函数间隔如下:
可想而知,当
时,在我们的g(z)定义中,
,
的值实际上就是
。反之亦然。为了使函数间隔最大(更大的信心确定该例是正例还是反例),当
时,
应该是个大正数,反之是个大负数。因此函数间隔代表了我们认为特征是正例还是反例的确信度。
继续考虑w和b,如果同时加大w和b,比如在
前面乘个系数比如2,那么所有点的函数间隔都会增大二倍,这个对求解问题来说不应该有影响,因为我们要求解的是
,同时扩大w和b对结果是无影响的。这样,我们为了限制w和b,可能需要加入归一化条件,毕竟求解的目标是确定唯一一个w和b,而不是多组线性相关的向量。这个归一化一会再考虑。
刚刚我们定义的函数间隔是针对某一个样本的,现在我们定义全局样本上的函数间隔
说白了就是在训练样本上分类正例和负例确信度最小那个函数间隔。
接下来定义几何间隔,先看图
假设我们有了B点所在的
分割面。任何其他一点,比如A到该面的距离以
表示,假设B就是A在分割面上的投影。我们知道向量BA的方向是
(分割面的梯度),单位向量是
。A点是
,所以B点是x=
(利用初中的几何知识),带入
得,
进一步得到
再换种更加优雅的写法:
当
时,不就是函数间隔吗?是的,前面提到的函数间隔归一化结果就是几何间隔。他们为什么会一样呢?因为函数间隔是我们定义的,在定义的时候就有几何间隔的色彩。同样,同时扩大w和b,w扩大几倍,
就扩大几倍,结果无影响。同样定义全局的几何间隔
5 最优间隔分类器(optimal margin classifier)
回想前面我们提到我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。形象的说,我们将上面的图看作是一张纸,我们要找一条折线,按照这条折线折叠后,离折线最近的点的间距比其他折线都要大。形式化表示为:
到此,我们已经将模型定义出来了。如果求得了w和b,那么来一个特征x,我们就能够分类了,称为最优间隔分类器。接下的问题就是如何求解w和b的问题了。
由于
不是凸函数,我们想先处理转化一下,考虑几何间隔和函数间隔的关系,
,我们改写一下上面的式子:
这时候其实我们求的最大值仍然是几何间隔,只不过此时的w不受
的约束了。然而这个时候目标函数仍然不是凸函数,没法直接代入优化软件里计算。我们还要改写。前面说到同时扩大w和b对结果没有影响,但我们最后要求的仍然是w和b的确定值,不是他们的一组倍数值,因此,我们需要对
做一些限制,以保证我们解是唯一的。这里为了简便我们取
。这样的意义是将全局的函数间隔定义为1,也即是将离超平面最近的点的距离定义为
。由于求
的最大值相当于求
的最小值,因此改写后结果为:
这下好了,只有线性约束了,而且是个典型的二次规划问题(目标函数是自变量的二次函数)。代入优化软件可解。
到这里发现,这个讲义虽然没有像其他讲义一样先画好图,画好分类超平面,在图上标示出间隔那么直观,但每一步推导有理有据,依靠思路的流畅性来推导出目标函数和约束。
接下来介绍的是手工求解的方法了,一种更优的求解方法。
6 拉格朗日对偶(Lagrange duality)
先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法,比如下面的最优化问题:
目标函数是f(w),下面是等式约束。通常解法是引入拉格朗日算子,这里使用
来表示算子,得到拉格朗日公式为
L是等式约束的个数。
然后分别对w和
求偏导,使得偏导数等于0,然后解出w和
。至于为什么引入拉格朗日算子可以求出极值,原因是f(w)的dw变化方向受其他不等式的约束,dw的变化方向与f(w)的梯度垂直时才能获得极值,而且在极值处,f(w)的梯度与其他等式梯度的线性组合平行,因此他们之间存在线性关系。(参考《最优化与KKT条件》)
然后我们探讨有不等式约束的极值问题求法,问题如下:
我们定义一般化的拉格朗日公式
这里的
和
都是拉格朗日算子。如果按这个公式求解,会出现问题,因为我们求解的是最小值,而这里的
已经不是0了,我们可以将
调整成很大的正值,来使最后的函数结果是负无穷。因此我们需要排除这种情况,我们定义下面的函数:
这里的P代表primal。假设
或者
,那么我们总是可以调整
和
来使得
有最大值为正无穷。而只有g和h满足约束时,
为f(w)。这个函数的精妙之处在于
,而且求极大值。
因此我们可以写作
我们使用
来表示
。如果直接求解,首先面对的是两个参数,而
也是不等式约束,然后再在w上求最小值。这个过程不容易做,那么怎么办呢?
D的意思是对偶,
将问题转化为先求拉格朗日关于w的最小值,将
和
看作是固定值。之后在
求最大值的话:
这个问题是原问题的对偶问题,相对于原问题只是更换了min和max的顺序,而一般更换顺序的结果是Max Min(X) <= MinMax(X)。然而在这里两者相等。用
来表示对偶问题如下:
下面解释在什么条件下两者会等价。假设f和g都是凸函数,h是仿射的(affine,
)。并且存在w使得对于所有的i,
。在这种假设下,一定存在
使得
是原问题的解,
是对偶问题的解。还有
另外,
满足库恩-塔克条件(Karush-Kuhn-Tucker, KKT condition),该条件如下:
所以如果
满足了库恩-塔克条件,那么他们就是原问题和对偶问题的解。让我们再次审视公式(5),这个条件称作是KKT dual complementarity条件。这个条件隐含了如果
,那么
。也就是说,
时,w处于可行域的边界上,这时才是起作用的约束。而其他位于可行域内部(
的)点都是不起作用的约束,其
。这个KKT双重补足条件会用来解释支持向量和SMO的收敛测试。
这部分内容思路比较凌乱,还需要先研究下《非线性规划》中的约束极值问题,再回头看看。KKT的总体思想是将极值会在可行域边界上取得,也就是不等式为0或等式约束里取得,而最优下降方向一般是这些等式的线性组合,其中每个元素要么是不等式为0的约束,要么是等式约束。对于在可行域边界内的点,对最优解不起作用,因此前面的系数为0。
7 最优间隔分类器(optimal margin classifier)
重新回到SVM的优化问题:
我们将约束条件改写为:
从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数
,也就是说这些约束式
,对于其他的不在线上的点(
),极值不会在他们所在的范围内取得,因此前面的系数
.注意每一个约束式实际就是一个训练样本。
看下面的图:
实线是最大间隔超平面,假设×号的是正例,圆圈的是负例。在虚线上的点就是函数间隔是1的点,那么他们前面的系数
,其他点都是
。这三个点称作支持向量。构造拉格朗日函数如下:
注意到这里只有
没有
是因为原问题中没有等式约束,只有不等式约束。
下面我们按照对偶问题的求解步骤来一步步进行,
首先求解
的最小值,对于固定的
,
的最小值只与w和b有关。对w和b分别求偏导数。
并得到
将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)
代入后,化简过程如下:
最后得到
由于最后一项是0,因此简化为
此时的拉格朗日函数只包含了变量
。然而我们求出了
才能得到w和b。
前面提到过对偶问题和原问题满足的几个条件,首先由于目标函数和线性约束都是凸函数,而且这里不存在等式约束h。存在w使得对于所有的i,
。因此,一定存在
使得
是原问题的解,
是对偶问题的解。在这里,求
就是求
了。
即可求出b。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
关于上面的对偶问题如何求解,将留给下一篇中的SMO算法来阐明。
这里考虑另外一个问题,由于前面求解中得到
我们通篇考虑问题的出发点是
,根据求解得到的
,我们代入前式得到
也就是说,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于0还是小于0,来判断正例还是负例。现在有了
,我们不需要求出w,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的
,其他情况
。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。这种写法为下面要提到的核函数(kernel)做了很好的铺垫。这是上篇,先写这么多了。
7 核函数(Kernels)
考虑我们最初在“线性回归”中提出的问题,特征是房子的面积x,这里的x是实数,结果y是房子的价格。假设我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维
,然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。映射函数称作
,在这个例子中
我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。这样,我们需要将前面
公式中的内积从
,映射到
。
至于为什么需要映射后的特征而不是最初的特征来参与计算,上面提到的(为了更好地拟合)是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。(在《数据挖掘导论》Pang-Ning Tan等人著的《支持向量机》那一章有个很好的例子说明)
将核函数形式化定义,如果原始特征内积是
,映射后为
,那么定义核函数(Kernel)为
到这里,我们可以得出结论,如果要实现该节开头的效果,只需先计算
,然后计算
即可,然而这种计算方式是非常低效的。比如最初的特征是n维的,我们将其映射到
维,然后再计算,这样需要
的时间。那么我们能不能想办法减少计算时间呢?
先看一个例子,假设x和z都是n维的,
展开后,得
这个时候发现我们可以只计算原始特征x和z内积的平方(时间复杂度是O(n)),就等价与计算映射后特征的内积。也就是说我们不需要花
时间了。
现在看一下映射函数(n=3时),根据上面的公式,得到
也就是说核函数
只能在选择这样的
作为映射函数时才能够等价于映射后特征的内积。
再看一个核函数
对应的映射函数(n=3时)是
更一般地,核函数
对应的映射后特征维度为
。(求解方法参见http://zhidao.baidu.com/question/16706714.html)。
由于计算的是内积,我们可以想到IR中的余弦相似度,如果x和z向量夹角越小,那么核函数值越大,反之,越小。因此,核函数值是
和
的相似度。
再看另外一个核函数
这时,如果x和z很相近(
),那么核函数值为1,如果x和z相差很大(
),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。
既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。
下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。
来自Eric Xing的slides
注意,使用核函数后,怎么分类新来的样本呢?线性的时候我们使用SVM学习出w和b,新来样本x的话,我们使用
来判断,如果值大于等于1,那么是正类,小于等于是负类。在两者之间,认为无法确定。如果使用了核函数后,
就变成了
,是否先要找到
,然后再预测?答案肯定不是了,找
很麻烦,回想我们之前说过的
8 核函数有效性判定
问题:给定一个函数K,我们能否使用K来替代计算
,也就说,是否能够找出一个
,使得对于所有的x和z,都有
?
下面来解决这个问题,给定m个训练样本
,每一个
对应一个特征向量。那么,我们可以将任意两个
和
带入K中,计算得到
。I可以从1到m,j可以从1到m,这样可以计算出m*m的核函数矩阵(Kernel Matrix)。为了方便,我们将核函数矩阵和
都使用K来表示。
如果假设K是有效地核函数,那么根据核函数定义
可见,矩阵K应该是个对称阵。让我们得出一个更强的结论,首先使用符号
来表示映射函数
的第k维属性值。那么对于任意向量z,得
最后一步和前面计算
时类似。从这个公式我们可以看出,如果K是个有效的核函数(即
和
等价),那么,在训练集上得到的核函数矩阵K应该是半正定的(
)
这样我们得到一个核函数的必要条件:
K是有效的核函数 ==> 核函数矩阵K是对称半正定的。
可幸的是,这个条件也是充分的,由Mercer定理来表达。
Mercer定理:
如果函数K是
上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例
,其相应的核函数矩阵是对称半正定的。
Mercer定理表明为了证明K是有效的核函数,那么我们不用去寻找
,而只需要在训练集上求出各个
,然后判断矩阵K是否是半正定(使用左上角主子式大于等于零等方法)即可。
许多其他的教科书在Mercer定理证明过程中使用了
范数和再生希尔伯特空间等概念,但在特征是n维的情况下,这里给出的证明是等价的。
核函数不仅仅用在SVM上,但凡在一个模型后算法中出现了
,我们都可以常使用
去替换,这可能能够很好地改善我们的算法。
9规则化和不可分情况处理(Regularizationand the non-separable case)
我们之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。
看下面两张图:
可以看到一个离群点(可能是噪声)可以造成超平面的移动,间隔缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分了。
这时候我们应该允许一些点游离并在在模型中违背限制条件(函数间隔大于1)。我们设计得到新的模型如下(也称软间隔):
引入非负参数后(称为松弛变量),就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。而放松限制条件后,我们需要重新调整目标函数,以对离群点进行处罚,目标函数后面加上的就表示离群点越多,目标函数值越大,而我们要求的是尽可能小的目标函数值。这里的C是离群点的权重,C越大表明离群点对目标函数影响越大,也就是越不希望看到离群点。我们看到,目标函数控制了离群点的数目和程度,使大部分样本点仍然遵守限制条件。
模型修改后,拉格朗日公式也要修改如下:
这里的和都是拉格朗日乘子,回想我们在拉格朗日对偶中提到的求法,先写出拉格朗日公式(如上),然后将其看作是变量w和b的函数,分别对其求偏导,得到w和b的表达式。然后代入公式中,求带入后公式的极大值。整个推导过程类似以前的模型,这里只写出最后结果如下:
此时,我们发现没有了参数,与之前模型唯一不同在于又多了的限制条件。需要提醒的是,b的求值公式也发生了改变,改变结果在SMO算法里面介绍。先看看KKT条件的变化:
第一个式子表明在两条间隔线外的样本点前面的系数为0,离群样本点前面的系数为C,而支持向量(也就是在超平面两边的最大间隔线上)的样本点前面系数在(0,C)上。通过KKT条件可知,某些在最大间隔线上的样本点也不是支持向量,相反也可能是离群点。
10坐标上升法(Coordinateascent)
在最后讨论的求解之前,我们先看看坐标上升法的基本原理。假设要求解下面的优化问题:
这里W是向量的函数。之前我们在回归中提到过两种求最优解的方法,一种是梯度下降法,另外一种是牛顿法。现在我们再讲一种方法称为坐标上升法(求解最小值问题时,称作坐标下降法,原理一样)。
方法过程:
最里面语句的意思是固定除之外的所有,这时W可看作只是关于的函数,那么直接对求导优化即可。这里我们进行最大化求导的顺序i是从1到m,可以通过更改优化顺序来使W能够更快地增加并收敛。如果W在内循环中能够很快地达到最优,那么坐标上升法会是一个很高效的求极值方法。
下面通过一张图来展示:
椭圆代表了二次函数的各个等高线,变量数为2,起始坐标是(2,-2)。图中的直线式迭代优化的路径,可以看到每一步都会向最优值前进一步,而且前进路线是平行于坐标轴的,因为每一步只优化一个变量。
11SMO优化算法(Sequentialminimal optimization)
SMO算法由MicrosoftResearch的JohnC.Platt在1998年提出,并成为最快的二次规划优化算法,特别针对线性SVM和数据稀疏时性能更优。关于SMO最好的资料就是他本人写的《SequentialMinimal Optimization A Fast Algorithm for Training Support VectorMachines》了。
我拜读了一下,下面先说讲义上对此方法的总结。
首先回到我们前面一直悬而未解的问题,对偶函数最后的优化问题:
要解决的是在参数上求最大值W的问题,至于和都是已知数。C由我们预先设定,也是已知数。
按照坐标上升的思路,我们首先固定除以外的所有参数,然后在上求极值。等一下,这个思路有问题,因为如果固定以外的所有参数,那么将不再是变量(可以由其他值推出),因为问题中规定了
因此,我们需要一次选取两个参数做优化,比如和,此时可以由和其他参数表示出来。这样回带到W中,W就只是关于的函数了,可解。
这样,SMO的主要步骤如下:
意思是,第一步选取一对和,选取方法使用启发式方法(后面讲)。第二步,固定除和之外的其他参数,确定W极值条件下的,由表示。
SMO之所以高效就是因为在固定其他参数后,对一个参数优化过程很高效。
下面讨论具体方法:
假设我们选取了初始值满足了问题中的约束条件。接下来,我们固定,这样W就是和的函数。并且和满足条件:
由于都是已知固定值,因此为了方面,可将等式右边标记成实数值。
当和异号时,也就是一个为1,一个为-1时,他们可以表示成一条直线,斜率为1。如下图:
横轴是,纵轴是,和既要在矩形方框内,也要在直线上,因此
,
同理,当和同号时,
,
然后我们打算将用表示:
然后反代入W中,得
展开后W可以表示成。其中a,b,c是固定值。这样,通过对W进行求导可以得到,然而要保证满足,我们使用表示求导求出来的,然而最后的,要根据下面情况得到:
这样得到后,我们可以得到的新值。
下面进入Platt的文章,来找到启发式搜索的方法和求b值的公式。
这边文章使用的符号表示有点不太一样,不过实质是一样的,先来熟悉一下文章中符号的表示。
文章中定义特征到结果的输出函数为
与我们之前的实质是一致的。
原始的优化问题为:
求导得到:
经过对偶后为:
s.t.
这里与W函数是一样的,只是符号求反后,变成求最小值了。和是一样的,都表示第i个样本的输出结果(1或-1)。
经过加入松弛变量后,模型修改为:
由公式(7)代入(1)中可知,
这个过程和之前对偶过程一样。
重新整理我们要求的问题为:
与之对应的KKT条件为:
这个KKT条件说明,在两条间隔线外面的点,对应前面的系数为0,在两条间隔线里面的对应为C,在两条间隔线上的对应的系数在0和C之间。
将我们之前得到L和H重新拿过来:
之前我们将问题进行到这里,然后说将用表示后代入W中,这里将代入中,得
其中
这里的和代表某次迭代前的原始值,因此是常数,而和是变量,待求。公式(24)中的最后一项是常数。
由于和满足以下公式
因为的值是固定值,在迭代前后不会变。
那么用s表示,上式两边乘以时,变为:
其中
代入(24)中,得
这时候只有是变量了,求导
如果的二阶导数大于0(凹函数),那么一阶导数为0时,就是极小值了。
假设其二阶导数为0(一般成立),那么上式化简为:
将w和v代入后,继续化简推导,得(推导了六七行推出来了)
我们使用来表示:
通常情况下目标函数是正定的,也就是说,能够在直线约束方向上求得最小值,并且。
那么我们在(30)两边都除以可以得到
这里我们使用表示优化后的值,是迭代前的值,。
与之前提到的一样不是最终迭代后的值,需要进行约束:
那么
在特殊情况下,可能不为正,如果核函数K不满足Mercer定理,那么目标函数可能变得非正定,可能出现负值。即使K是有效的核函数,如果训练样本中出现相同的特征x,那么仍有可能为0。SMO算法在不为正值的情况下仍有效。为保证有效性,我们可以推导出就是的二阶导数,,没有极小值,最小值在边缘处取到(类比),时更是单调函数了,最小值也在边缘处取得,而的边缘就是L和H。这样将和分别代入中即可求得的最小值,相应的还是也可以知道了。具体计算公式如下:
至此,迭代关系式出了b的推导式以外,都已经推出。
b每一步都要更新,因为前面的KKT条件指出了和的关系,而和b有关,在每一步计算出后,根据KKT条件来调整b。
b的更新有几种情况:
来自罗林开的ppt
这里的界内指,界上就是等于0或者C了。
前面两个的公式推导可以根据
和对于有的KKT条件推出。
这样全部参数的更新公式都已经介绍完毕,附加一点,如果使用的是线性核函数,我们就可以继续使用w了,这样不用扫描整个样本库来作内积了。
w值的更新方法为:
根据前面的
公式推导出。
12SMO中拉格朗日乘子的启发式选择方法
终于到了最后一个问题了,所谓的启发式选择方法主要思想是每次选择拉格朗日乘子的时候,优先选择样本前面系数的作优化(论文中称为无界样例),因为在界上(为0或C)的样例对应的系数一般不会更改。
这条启发式搜索方法是选择第一个拉格朗日乘子用的,比如前面的。那么这样选择的话,是否最后会收敛。可幸的是Osuna定理告诉我们只要选择出来的两个中有一个违背了KKT条件,那么目标函数在一步迭代后值会减小。违背KKT条件不代表,在界上也有可能会违背。是的,因此在给定初始值=0后,先对所有样例进行循环,循环中碰到违背KKT条件的(不管界上还是界内)都进行迭代更新。等这轮过后,如果没有收敛,第二轮就只针对的样例进行迭代更新。
在第一个乘子选择后,第二个乘子也使用启发式方法选择,第二个乘子的迭代步长大致正比于,选择第二个乘子能够最大化。即当为正时选择负的绝对值最大的,反之,选择正值最大的。
最后的收敛条件是在界内()的样例都能够遵循KKT条件,且其对应的只在极小的范围内变动。
至于如何写具体的程序,请参考JohnC. Platt在论文中给出的伪代码。
13总结
这份SVM的讲义重点概括了SVM的基本概念和基本推导,中规中矩却又让人醍醐灌顶。起初让我最头疼的是拉格朗日对偶和SMO,后来逐渐明白拉格朗日对偶的重要作用是将w的计算提前并消除w,使得优化函数变为拉格朗日乘子的单一参数优化问题。而SMO里面迭代公式的推导也着实让我花费了不少时间。
对比这么复杂的推导过程,SVM的思想确实那么简单。它不再像logistic回归一样企图去拟合样本点(中间加了一层sigmoid函数变换),而是就在样本中去找分隔线,为了评判哪条分界线更好,引入了几何间隔最大化的目标。
之后所有的推导都是去解决目标函数的最优化上了。在解决最优化的过程中,发现了w可以由特征向量内积来表示,进而发现了核函数,仅需要调整核函数就可以将特征进行低维到高维的变换,在低维上进行计算,实质结果表现在高维上。由于并不是所有的样本都可分,为了保证SVM的通用性,进行了软间隔的处理,导致的结果就是将优化问题变得更加复杂,然而惊奇的是松弛变量没有出现在最后的目标函数中。最后的优化求解问题,也被拉格朗日对偶和SMO算法化解,使SVM趋向于完美。
另外,其他很多议题如SVM背后的学习理论、参数选择问题、二值分类到多值分类等等还没有涉及到,以后有时间再学吧。其实朴素贝叶斯在分类二值分类问题时,如果使用对数比,那么也算作线性分类器。
-
[MATLAB智能算法30个案例分析].史峰
2014-08-14 11:51:33TSP (旅行商问题—Traveling Salesman Problem),是典型的NP完全问题,即其最坏情况下的时间复杂性随着问题规模的增大按指数方式增长,到目前为止不能找到一个多项式时间的有效算法。遗传算法是一种进化算法,其基本... -
数据结构 之 Prim算法的应用 之 MST(最小生成树)
2018-03-26 11:10:14算法:Prim 应用:对一个带权无向图生成 (权值)最小生成树 (程序来自《天勤 数据结构 高分笔记》) 今日一签,赠给奋斗的自己和你们:人生不能像做菜,把所有的材料都准备好了才下锅。——李安《饮食男女》 ... -
双层层压材料中激光超声检测方法的应用
2021-02-12 07:48:47为了充分利用不同时刻和不同频率下的波场信息,减弱时间和频率选取对损伤成像产生的影响,采用了一种波数滤波损伤成像算法,通过对不同时刻的波场进行波数分析,根据不同波数所占的权值不同,采用波数域内加窗的方法... -
基于六方氮化硼材料的光栅型中红外线吸收器
2021-01-26 17:32:43该吸收器是由截断的金字塔型单元结构构成的一维光栅,其吸收机制是磁激元共振效应和法布里-珀罗谐振腔共振效应。运用有限元算法分析该吸收器的结构参数、工作波长及入射角度对其吸收性能的影响。结果表明:在优化的... -
支持向量机SVM原理(一)
2018-08-17 15:27:43最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很... -
超短脉冲激光烧蚀金属薄膜材料的热效应分析
2021-02-26 11:08:50基于双曲双温两步热传导模型,利用具有人工粘性和自适应步长的有限差分算法,对超短脉冲激光辐照金膜时的温度场进行了一维数值模拟计算。讨论了不同能量密度和脉冲宽度条件下金膜表面温度场的分布情况; 分析了电子-... -
关于矩形排样问题(一)
2015-05-04 11:34:01最近看到几个比较有意思的软件:极致下料、Cutlogic 2D、新易优化板材切割等软件,都围绕一个共同的话题,即板材切割,主要是针对二维的。对于上述软件,下载安装测试了一下,极致下料还算可以吧。让我好奇的是整个...
-
mysql-5.7.32-winx64.zip
-
opencv.zip
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
2021-2-28日学习总结
-
2021年 系统分析师 系列课
-
深入分析 http.RoundTripper
-
2021年中国新跨境出口B2B电商行业研究报告.pdf
-
linux基础(3)----文件系统管理
-
MySQL 高可用工具 heartbeat 实战部署详解
-
【布道者】Linux极速入门
-
Android12新特性
-
常见的抽奖-根据指定概率抽奖(改进)
-
中文分词词典UserDict.txt
-
用DatetimeIndex的属性分组
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
基于Hypervisor虚拟化技术的Hadoop云平台管理方案的研究.docx
-
com.termux_102.apk
-
EaUS Video Editor(视频剪辑软件)官方中文版V1.6.8.53
-
MySQL 性能优化(思路拓展及实操)
-
使用 Linux 平台充当 Router 路由器