分类目录:《深入理解机器学习》总目录


对学习器的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(Performance Measure)。性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。在预测任务中,给定样例集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } D=\{(x_1, y_1), (x_2, y_2), \cdots, (x_m, y_m)\} D={(x1​,y1​),(x2​,y2​),⋯,(xm​,ym​)},其中 y i y_i yi​是示例 x i x_i xi​的真实标记。要评估学习器 f f f的性能,就要把学习器预测结果 f ( x ) f(x) f(x)与真实标记 y y y进行比较。

回归任务的性能度量

回归任务最常用的性能度量是“均方误差”(Mean Squared Error, MSE):
E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f;D)=\frac{1}{m}\sum_{i=1}^m(f(x_i)-y_i)^2 E(f;D)=m1​i=1∑m​(f(xi​)−yi​)2

更一般的,对于数据分布 D D D和概率密度函数 p ( ⋅ ) p(\cdot) p(⋅),均方误差可描述为:
E ( f ; D ) = ∫ x ∼ D ( f ( x i ) − y i ) 2 p ( x ) d x E(f;D)=\int_{x\sim D}(f(x_i)-y_i)^2p(x)\text{d}x E(f;D)=∫x∼D​(f(xi​)−yi​)2p(x)dx

分类任务的性能度量

错误率与准确率

《机器学习模型数据集的划分与模型评估方法》中提到了错误率和准确率,这是分类任务中最常用的两种性能度量既适用于二分类任务,也适用于多分类任务。错误率是分类错误的样本数占样本总数的比例,准确率则是分类正确的样本数占样本总数的比例。对样例集 D D D,分类错误率定义为:
E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) E(f;D)=\frac{1}{m}\sum_{i=1}^m\mathbb I(f(x_i)\neq y_i) E(f;D)=m1​i=1∑m​I(f(xi​)​=yi​)

则准确率定义为:
Accuracy ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) \text{Accuracy}(f;D)=\frac{1}{m}\sum_{i=1}^m\mathbb{I}(f(x_i)= y_i)=1-E(f;D) Accuracy(f;D)=m1​i=1∑m​I(f(xi​)=yi​)=1−E(f;D)

精度/查准率、召回率/查全率与F1度量

错误率和准确率虽常用,但并不能满足所有任务需求。错误率衡量了有多少比例的样本被判别错误,但是若我们关心的是“判定为正例的样本中有多少是正例”,或者“所有正例中有多少比例被判定出来”,那么错误率和准确率显然就不够用了,这时需要使用其他的性能度量类似的需求在信息检索、Web搜索等应用中经常出现,例如在信息检索中,我们经常会关心“检索出的信息中有多少比例是用户感兴趣的”“用户感兴趣的信息中有多少被检索出来了”,精度/查准率(Precision)与召回率/查全率(Recall)是更为适用于此类需求的性能度量。

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(True Positive, TP)、假正例(False Positive, FP)、真反例(True Negative, TN)与假反例(False Negative, FN)四种情形,令TP、FP、TN、FN分别表示其对应的样例数,则显然有TP+FP+TN+FN=样例总数。分类结果的“混淆矩阵”(Confusion Matrix)如下图所示:

则精度/查准率(Precision)与召回率/查全率(Recall)被定义为:
Precision = T P T P + F P Recall = T P T P + F N \text{Precision}=\frac{TP}{TP+FP}\\\quad\\\text{Recall}=\frac{TP}{TP+FN} Precision=TP+FPTP​Recall=TP+FNTP​

精度/查准率和召回率/查全率是一对矛盾的度量。一般来说,精度/查准率高时,召回率/查全率往往偏低;而召回率/查全率高时,精度/查准率往往偏低。例如,若希望将正例尽可能多地选出来,则可通过增加选择样本的数量来实现,如果将所有样本都选上,那么所有的正例也必然都被选上了,但这样精度/查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的样本,但这样就难免会漏掉不少正例,使得召回率/查全率较低。通常只有在一些简单任务中,才可能使召回率/查全率和精度/查准率都很高。

在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的召回率/查全率、精度/查准率。以精度/查准率为纵轴、召回率/查全率为横轴作图,就得到了精度/查准率召回率/查全率曲线,简称“PR曲线”,显示该曲线的图称为“P-R图”,下图给出了一个示意图:

PR图直观地显示出学习器在样本总体上的召回率/查全率、精度/查准率在进行比较时,若一个学习器的PR曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,例如上图中学习器A的性能优于学习器C;如果两个学习器的PR曲线发生了交叉,例如上图中的A与B,则难以一般性地断言两者孰优孰劣,只能在具体的精度/查准率或召回率/查全率条件下进行比较。然而,在很多情形下,人们往往仍希望把学习器A与B比出个高低。这时一个比较合理的判据是比较P-R曲线下面积的大小,它在一定程度上表征了学习器在精度/查准率和召回率/查全率上取得相对“双高”的比例。但这个值不太容易估算,因此,人们设计了一些综合考虑精度/查准率、召回率/查全率的性能度量“平衡点”(Break-Event Point,简称BEP)就是这样一个度量,它是“精度/查准率=召回率/查全率”时的取值,例如上图中学习器C的BEP是0.64,而基于BEP的比较,可认为学习器A优于B。

但BEP还是过于简化了些,更常用的是 F 1 F1 F1度量:
F 1 = 2 × Precision × Recall Precision + Recall = 2 × T P 样例总数 + T P − T N F1=\frac{2\times\text{Precision}\times\text{Recall}}{\text{Precision}+\text{Recall}}=\frac{2\times TP}{\text{样例总数}+TP-TN} F1=Precision+Recall2×Precision×Recall​=样例总数+TP−TN2×TP​

在一些应用中,对精度/查准率和召回率/查全率的重视程度有所不同。例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容确是用户感兴趣的,此时精度/查准率更重要;而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时召回率/查全率更重要。 F 1 F1 F1度量的一般形式是 F β F_\beta Fβ​,能让我们表达出对精度/查准率/召回率/查全率的不同偏好,它定义为:
F β = ( 1 + β 2 ) × Precision × Recall ( β 2 × Precision ) + Recall ) F_\beta=\frac{(1+\beta^2)\times\text{Precision}\times\text{Recall}}{(\beta^2\times\text{Precision})+\text{Recall})} Fβ​=(β2×Precision)+Recall)(1+β2)×Precision×Recall​

其中 β > 0 \beta>0 β>0度量了召回率/查全率对精度/查准率的相对重要性。 β = 1 \beta=1 β=1时退化为标准的 F 1 F1 F1; β > 1 \beta>1 β>1时召回率/查全率有更大影响; β < 1 \beta<1 β<1时精度/查准率有更大影响。

很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的“全局”性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵等等。总之,我们希望在 n n n个二分类混淆矩阵上综合考察精度/查准率和召回率/查全率。

一种直接的做法是先在各混淆矩阵上分别计算出精度/查准率和召回率/查全率,记为 ( P 1 , R 1 ) , ( P 2 , R 2 ) , ⋯ , ( P n , R n ) , (P_1, R_1), (P_2, R_2), \cdots,(P_n, R_n), (P1​,R1​),(P2​,R2​),⋯,(Pn​,Rn​),,再计算平均值,这样就得到宏精度/查准率(Macro-Precision)、宏召回率/查全率(Macro-Recall),以及相应的宏 F 1 F1 F1(Macro- F 1 F1 F1):

Macro-Precision = 1 n ∑ i = 1 n P i Macro-Recall = 1 n ∑ i = 1 n R i Macro- F 1 = 2 × Macro-Precision × Macro-Recall Macro-Precision + Macro-Recall \text{Macro-Precision}=\frac{1}{n}\sum_{i=1}^nP_i \\\quad\\ \text{Macro-Recall}=\frac{1}{n}\sum_{i=1}^nR_i \\\quad\\ \text{Macro-}F1=\frac{2\times\text{Macro-Precision}\times\text{Macro-Recall}}{\text{Macro-Precision}+\text{Macro-Recall}} Macro-Precision=n1​i=1∑n​Pi​Macro-Recall=n1​i=1∑n​Ri​Macro-F1=Macro-Precision+Macro-Recall2×Macro-Precision×Macro-Recall​

还可先将各混淆矩阵的对应元素进行平均,得到TP、FP、TN、FN的平均值,分别记为 T P ‾ \overline{TP} TP、 F P ‾ \overline{FP} FP、 T N ‾ \overline{TN} TN、 F N ‾ \overline{FN} FN,再基于这些平均值计算出微精度/查准率(Micro-Precision)、微召回率/查全率(Micro-Recall)和微 F 1 F1 F1(Micro- F 1 F1 F1):
Micro-Precision = T P ‾ T P ‾ + F P ‾ Macro-Recall = T P ‾ T P ‾ + F N ‾ Macro- F 1 = 2 × Micro-Precision × Micro-Recall Micro-Precision + Micro-Recall \text{Micro-Precision}=\frac{\overline{TP}}{\overline{TP}+\overline{FP}} \\\quad\\ \text{Macro-Recall}=\frac{\overline{TP}}{\overline{TP}+\overline{FN}} \\\quad\\ \text{Macro-}F1=\frac{2\times\text{Micro-Precision}\times\text{Micro-Recall}}{\text{Micro-Precision}+\text{Micro-Recall}} Micro-Precision=TP+FPTP​Macro-Recall=TP+FNTP​Macro-F1=Micro-Precision+Micro-Recall2×Micro-Precision×Micro-Recall​

ROC(Receiver Operating Characteristic)与AUC(Area Under ROC Curve)

很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。例如,神经网络在一般情形下是对每个测试样本预测出一个 [ 0 , 1 ] [0, 1] [0,1]之间的实值然后将这个值与0.5进行比较,大于0.5则判为正例,否则为反例。这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力。实际上,根据这个实值或概率预测结果,我们可将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个“截断点”将样本分为两部分,前一部分判作正例,后一部分则判作反例。

在不同的应用任务中,我们可根据任务需求来采用不同的截断点,例如若我们更重视精度/查准率,则可选择排序中靠前的位置进行截断;若更重视召回率/查全率,则可选择靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说“一般情况下泛化性能的好坏。ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具。

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,它源于“二战”中用于敌机检测的雷达信号分析技术,二十世纪六七十年代开始被用于一些心理学、医学检测应用中,此后被引入机器学习领域,与上文中介绍的P-R曲线相似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了“ROC曲线”。与PR曲线使用精度/查准率、召回率/查全率为纵、横轴不同,ROC曲线的纵轴是“真正例率”(True Positive Rate,简称TPR),横轴是“假正例率”(False Positive Rate,简称FPR),基于前文中的符号,两者分别定义为:
T P R = T P T P + F N F P R = F P T N + F P TPR=\frac{TP}{TP+FN}\\\quad\\FPR=\frac{FP}{TN+FP} TPR=TP+FNTP​FPR=TN+FPFP​

显示ROC曲线的图称为“ROC图”,下图给出了一个示意图,显然对角线对应于“随机猜测”模型,而点 ( 0 , 1 ) (0, 1) (0,1)则对应于将所有正例排在所有反例之前的“理想模型”:

现实任务中通常是利用有限个测试样例来绘制ROC图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生上图(a)中的光滑ROC曲线,只能绘制出如上图(b)所示的近似ROC曲线。绘图过程很简单:给定 m + m^+ m+个正例和 m − m^- m−个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为0,在坐标(0,0)处标记一个点。然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为 ( x , y ) (x, y) (x,y),当前若为真正例,则对应标记点的坐标为 ( x , y + 1 m + ) (x, y+\frac{1}{m^+}) (x,y+m+1​);当前若为假正例,则对应标记点的坐标为 ( x + 1 m − , y ) (x+\frac{1}{m^-}, y) (x+m−1​,y),然后用线段连接相邻点即得。

进行学习器的比较时,与PR图相似,若一个学习器的ROC曲线被另个学习器的曲线完全“包住”,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者孰优孰劣。此时如果一定要进行比较,则较为合理的判据是比较ROC曲线下的面积,即AUC(Area Under ROC Curve),如上图所示。

从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。假定ROC曲线是由坐标为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) } \{(x_1, y_1), (x_2, y_2), \cdots, (x_m, y_m)\} {(x1​,y1​),(x2​,y2​),⋯,(xm​,ym​)}的点按序连接而形成,参见上图(b),则AUC可估算为:
AUC = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) × ( y i + y i + 1 ) \text{AUC}=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_i)\times(y_i+y_{i+1}) AUC=21​i=1∑m−1​(xi+1​−xi​)×(yi​+yi+1​)

形式化地看,AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。给定 m + m^+ m+个正例和 m − m^- m−个反例,令 D + D^+ D+和 D − D^- D−分别表示正、反例集合,则排序“损失”定义为:
l rank = 1 m + m − ∑ x + ∈ D + ∑ x − ∈ D − ( I ( f ( x + ) < f ( x − ) ) + 1 2 ( I ( f ( x + ) = f ( x − ) ) ) l_{\text{rank}}=\frac{1}{m^+m^-}\sum_{x^+\in D^+}\sum_{x^-\in D^-}(\mathbb{I}(f(x^+)<f(x^-))+\frac{1}{2}(\mathbb{I}(f(x^+)=f(x^-))) lrank​=m+m−1​x+∈D+∑​x−∈D−∑​(I(f(x+)<f(x−))+21​(I(f(x+)=f(x−)))

即考虑每一对正、反例,若正例的预测值小于反例,则记一个“罚分”,若相等,则记0.5个“罚分”。容易看出, l rank l_{\text{rank}} lrank​对应的是ROC曲线之上的面积:若一个正例在ROC曲线上对应标记点的坐标为 ( x , y ) (x, y) (x,y),则 x x x恰是排序在其之前的反例所占的比例,即假正例率。因此有:
AUC = 1 − l rank \text{AUC}=1-l_{\text{rank}} AUC=1−lrank​

代价敏感错误率与代价曲线

在现实任务中常会遇到这样的情况:不同类型的错误所造成的后果不同,例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了“一次错误”,但后者的影响是增加了进一步检查的麻烦,前者的后果却可能是丧失了拯救生命的最佳时机;再如,门禁系统错误地把可通行人员拦在门外,将使得用户体验不佳,但错误地把陌生人放进门内,则会造成严重的安全事故。为权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”。

以二分类任务为例,我们可根据任务的领域知识设定一个“代价矩阵”,如下图所示,其中 cost i j \text{cost}_{ij} costij​表示将第 i i i类样本预测为第 j j j类样本的代价。一般来说, cost i i = 0 \text{cost}_{ii}=0 costii​=0;若将第0类判别为第1类所造成的损失更大,则 cost 01 > cost 10 \text{cost}_{01}>\text{cost}_{10} cost01​>cost10​;损失程度相差越大, cost 01 \text{cost}_{01} cost01​与 cost 10 \text{cost}_{10} cost10​值的差别越大。

直接计算“错误次数”,并没有考虑不同错误会造成不同的后果。在非均等代价下,我们所希望的不再是简单地最小化错误次数,而是希望最小化总体代价。若将上图中的第0类作为正类、第1类作为反类,令 D + D^+ D+与 D − D^- D−分别代表样例集 D D D的正例子集和反例子集,则“代价敏感”(cost-sensitive)错误率为:
E ( f ; D ; cost ) = 1 m ( ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × cost 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × cost 10 ) E(f;D;\text{cost})=\frac{1}{m}(\sum_{x_i\in D^+}\mathbb{I}(f(x_i)\neq y_i)\times\text{cost}_{01}+\sum_{x_i\in D^-}\mathbb{I}(f(x_i)\neq y_i)\times\text{cost}_{10}) E(f;D;cost)=m1​(xi​∈D+∑​I(f(xi​)​=yi​)×cost01​+xi​∈D−∑​I(f(xi​)​=yi​)×cost10​)

类似的,可给出基于分布定义的代价敏感错误率,以及其他一些性能度量如精度的代价敏感版本。若令 cost i j \text{cost}_{ij} costij​中的 i i i、 j j j取值不限于 { 0 , 1 } \{0, 1\} {0,1},则可定义出多分类任务的代价敏感性能度量在非均等代价下,ROC曲线不能直接反映出学习器的期望总体代价,而“代价曲线”则可达到该目的。代价曲线图的横轴是取值为 [ 0 , 1 ] [0, 1] [0,1]的正例概率代价:
cost P ( + ) = p × cost 01 p × cost 01 + ( 1 − p ) × cost 10 \text{cost}_{P(+)}=\frac{p\times\text{cost}_{01}}{p\times\text{cost}_{01}+(1-p)\times\text{cost}_{10}} costP(+)​=p×cost01​+(1−p)×cost10​p×cost01​​

其中 p p p是样例为正例的概率;纵轴是取值为 [ 0 , 1 ] [0, 1] [0,1]的归一化代价:
cost norm = F N R × p × cost 01 + F P R × ( 1 − p ) × cost 10 p × cost 01 + ( 1 − p ) × cost 10 \text{cost}_{\text{norm}}=\frac{FNR\times p\times\text{cost}_{01}+FPR\times(1-p)\times\text{cost}_{10}}{p\times\text{cost}_{01}+(1-p)\times\text{cost}_{10}} costnorm​=p×cost01​+(1−p)×cost10​FNR×p×cost01​+FPR×(1−p)×cost10​​

其中 F P R FPR FPR是假正例率, F N R = 1 − T P R FNR=1-TPR FNR=1−TPR是假反例率。代价曲线的绘制很简单:ROC曲线上每一点对应了代价平面上的一条线段,设ROC曲线上点的坐标为 ( T P R , F P R ) (TPR,FPR) (TPR,FPR),则可相应计算出 F N R FNR FNR,然后在代价平面上绘制一条从 ( 0 , F P R ) (0, FPR) (0,FPR)到 ( 1 , F N R ) (1, FNR) (1,FNR)的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如下图所示:

深入理解机器学习——机器学习模型的性能度量相关推荐

  1. 机器学习之常见的性能度量

    文章目录 1.简介 2.性能度量总结 3.参考文献 1.简介 本文是对论文<The Impact of Automated Parameter Optimization on Defect Pr ...

  2. 机器学习-02 模型的评估与选择

    2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error).定义: 在训练集上的误差称为训练误差(training error)或经验误差(empirica ...

  3. 【进阶版】机器学习之模型性能度量及比较检验和偏差与方差总结(02)

    目录 欢迎订阅本专栏,持续更新中~ 本专栏前期文章介绍! 机器学习配套资源推送 进阶版机器学习文章更新~ 点击下方下载高清版学习知识图册 性能度量 最常见的性能度量 查准率/查全率/F1 ROC与AU ...

  4. 如何评估机器学习模型的性能

    您可以整天训练有监督的机器学习模型,但是除非您评估其性能,否则您永远无法知道模型是否有用.这个详细的讨论回顾了您必须考虑的各种性能指标,并对它们的含义和工作方式提供了直观的解释. 为什么需要评估? 让 ...

  5. 机器学习知识点(三十六)分类器性能度量指标f1-score

    在用python机器学习库scikit-learn训练模型时,常用f1-score来度量模型性能,下面回顾和学习下这个指标. 内容概要¶ 模型评估的目的及一般评估流程 分类准确率的用处及其限制 混淆矩 ...

  6. 机器学习 模型性能评估_如何评估机器学习模型的性能

    机器学习 模型性能评估 Table of contents: 目录: Why evaluation is necessary?为什么需要评估? Confusion Matrix混淆矩阵 Accurac ...

  7. 机器学习之性能度量指标

    机器学习的模型性能度量指标 在机器学习中,衡量,评估和选择一个模型好坏是通过一些常见指标实现的,称之为性能指标(Metrics). 对于一个二分类问题,我们首先给出如下基本指标基于这些指标可以推导出其 ...

  8. 机器学习性能度量(1):P-R曲线与ROC曲线,python sklearn实现

    最近做实验要用到性能度量的东西,之前学习过现在重新学习并且实现一下. 衡量模型泛化能力的评价标准,这就是性能度量.性能度量反应了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判 ...

  9. 机器学习分类与性能度量

    机器学习分类与性能度量 数据集:训练集(Training Set).验证集(Validation Set)和测试集(Test Set) 1. 当模型无需人为设定超参数,所用参数都通过学习得到,则不需要 ...

最新文章

  1. 极品:蓝丽网 - Vml图像画板.2003 web上的PhotoShop
  2. matlab模块 python,Matlab 和Python结合使用
  3. codeforces 261 D
  4. OKR与影响地图,别再傻傻分不清
  5. iphone 开发设置tableview 初始位置。
  6. 排序的概念及分类实现
  7. 磁带库Scalar i6000界面基本操作步骤
  8. ipad端网页屏幕变小了
  9. do vis是什么意思_餐前酒和餐后酒有什么区别
  10. HTC手机傻瓜式安装Google Play服务
  11. 认认真真写博客,踏踏实实编代码
  12. [附源码]Node.js计算机毕业设计高校心理咨询管理系统Express
  13. 全国计算机小学知识竞赛,关于计算机知识竞赛试题
  14. Java在线租车系统
  15. RNA 1. SCI 文章中读取 GEO 数据
  16. mybasit执行sql语句报类型转换失败java.lang.NumberFormatException
  17. 软件开发工期估算系列(5)——規模見積もりの王様「LOC見積もり」 ~見積もりの基本技法 その2
  18. Python第三方库tabulate简单使用说明
  19. Halcon边缘检测Sobel、Laplace和Canny算子
  20. vue自定义组件中再嵌套其他组件

热门文章

  1. nubia z5s mini 安卓4.2.2 google 服务包
  2. 企业架构中常见的十种软件架构模式
  3. C语言中生成随机数函数
  4. 基于ATmgea8单片机设计的加热控制系统(转)
  5. C语言 汉诺塔(hanoi)
  6. wireshark:什么是wireshark
  7. 【私有云盘】搭建PHP轻量文件管理器 - TinyFileManager「公网远程访问」
  8. 微信小程序认证网络准入认证配置
  9. 基于JAVAEE的停车场管理系统(论文+PPT+源码
  10. php word,下载与安装 · PHPword新版开发指南 · 看云