精华内容
下载资源
问答
  • ROC曲线学习总结

    万次阅读 多人点赞 2019-08-19 15:22:38
    文章目录ROC曲线学习总结1. ROC曲线(Receiver Operating Characteristic)的概念和绘制2. 利用ROC曲线评价模型性能——AUC(Area Under Curve)3. 利用ROC曲线选择最佳模型3.1 不同模型之间选择最优模型3.2 同一模型中...

    ROC曲线学习总结

    最近在学习机器学习基础知识部分的时候,看到了用于评估模型性能的ROC曲线,想起来之前上课的时候听老师提起过,当时没有认真去看,所以这次大体上了解了一下,来谈谈自己的看法,并做些总结。

    1. ROC曲线(Receiver Operating Characteristic)的概念和绘制

    ​ ROC的全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,首先是由二战中的电子工程师和雷达工程师发明的,用来侦测战场上的敌军载具(飞机、船舰),也就是信号检测理论。之后很快就被引入了心理学来进行信号的知觉检测。此后被引入机器学习领域,用来评判分类、检测结果的好坏。因此,ROC曲线是非常重要和常见的统计分析方法。

    首先介绍一下在模型评估上的一些基本概念:

    真实情况 预测结果 含义 统计量
    正例 反例
    正例 TP(将正例正确预测为正例) FN(将正例错误预测为负例) TP + FN 表示实际数据集中正样本的数量 召回率Recall / 灵敏度Sensitivity / TPR = TP/(TP+FN), 漏诊率 = 1 - 灵敏度
    反例 FP(将负例错误的预测为正例) TN(将负例正确的预测为负例) FP + TN 表示实际数据集中负样本的数量 FPR = FP/(FP+TN), 特异度(Specificity) = 1 - FPR = TN/(FP+TN)
    加和含义 TP + FP 表示预测的正类样本数 FN + TN 表示预测的负类样本数 TP + FN + FP + TN 表示样本总数
    统计量 精确率Precision = TP/(TP+FP) 正确率Accuracy = (TP+TN)/(TP+TN+FP+FN), 错误率 = (FP+FN)/(TP+TN+FP+FN), F-measure = 2*(Precision*Recall)/(Precision+Recall)

    其中最重要的两个公式如下:

    TPR=TPTP+FN,FPR=FPFP+TN TPR = \frac{TP}{TP+FN} ,FPR = \frac{FP}{FP+TN}

    在ROC曲线图中,每个点以对应的FPRFPR值为横坐标,以TPRTPR值为纵坐标

    ROC曲线的绘制步骤如下:

    1. 假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
    2. 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
    3. 每次选取一个不同的threshold,得到一组FPR和TPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点。
    4. 根据3中的每个坐标点,画图。

    ROC曲线绘制实例

    1、分析数据
    y_true = [0, 0, 1, 1];scores = [0.1, 0.4, 0.35, 0.8];
    2、列表

    样本 预测属于P的概率(score) 真实类别
    y[0] 0.1 N
    y[1] 0.4 N
    y[2] 0.35 P
    y[3] 0.8 P

    3、将截断点依次取为score值,计算TPR和FPR。
    当截断点为0.1时:
    说明只要score>=0.1,它的预测类别就是正例。 因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [1, 1, 1, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=2 FN=0
    反例 FP=2 TN=0

    由此可得:
    TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 1;

    当截断点为0.35时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 1, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=2 FN=0
    反例 FP=1 TN=1

    由此可得:
    TPR = TP/(TP+FN) = 1; FPR = FP/(TN+FP) = 0.5;

    当截断点为0.4时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 1, 0, 1];
    正例与反例信息如下:

    正例 反例
    正例 TP=1 FN=1
    反例 FP=1 TN=1

    由此可得:
    TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0.5;

    当截断点为0.8时:
    scores = [0.1, 0.4, 0.35, 0.8];y_true = [0, 0, 1, 1];y_pred = [0, 0, 0, 1];

    正例与反例信息如下:

    正例 反例
    正例 TP=1 FN=1
    反例 FP=0 TN=2

    由此可得:
    TPR = TP/(TP+FN) = 0.5; FPR = FP/(TN+FP) = 0;

    4、根据TPR、FPR值,以FPR为横轴,TPR为纵轴画图。

    2. 利用ROC曲线评价模型性能——AUC(Area Under Curve)

    ​ AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏。AUC是衡量二分类模型优劣的一种评价指标,表示正例排在负例前面的概率。一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。

    之所以采用AUC来评价,主要还是考虑到ROC曲线本身并不能直观的说明一个分类器性能的好坏,而AUC值作为一个数量值,具有可比较性,可以进行定量的比较。

    AUC值的计算方法

    • 将坐标点按照横坐标FPR排序 。
    • 计算第ii个坐标点和第i+1i+1个坐标点的间距dxdx
    • 获取第ii或者i+1i+1个坐标点的纵坐标y。
    • 计算面积微元ds=ydxds=ydx
    • 对面积微元进行累加,得到AUC。

    AUC值对模型性能的判断标准

    1. AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
    2. 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
    3. AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
    4. AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

    3. 利用ROC曲线选择最佳模型

    首先了解一下ROC曲线图上很重要的四个点:

    1. 第一个点(0,1)(0,1),即FPR=0, TPR=1,这意味着FN(False Negative)=0,并且FP(False Positive)=0。意味着这是一个完美的分类器,它将所有的样本都正确分类。
    2. 第二个点(1,0)(1,0),即FPR=1,TPR=0,意味着这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
    3. 第三个点(0,0)(0,0),即FPR=TPR=0,即FP(False Positive)=TP(True Positive)=0,可以发现该分类器预测所有的样本都为负样本(Negative)。
    4. 第四个点(1,1)(1,1),即FPR=TPR=1,分类器实际上预测所有的样本都为正样本。

    从上面给出的四个点可以发现,==ROC曲线图中,越靠近(0,1)的点对应的模型分类性能越好。==而且可以明确的一点是,ROC曲线图中的点对应的模型,它们的不同之处仅仅是在分类时选用的阈值(Threshold)不同,每个点所选用的阈值都对应某个样本被预测为正类的概率值。

    那么我们如何根据ROC曲线图定量的找到当前最优的分类模型呢?

    3.1 不同模型之间选择最优模型

    ​ 当然最直观的比较方式就是基于AUC值,不同的模型对应的ROC曲线中,AUC值大的模型性能自然相对较好。而当AUC值近似相等时,有两种情况:第一种是ROC曲线之间没有交点;第二种是ROC曲线之间存在交点。在两个模型AUC值相等时,并不代表两个模型的分类性能也相等。

    ROC曲线之间没有交点

    ​ 如下图所示,A,B,C三个模型对应的ROC曲线之间交点,且AUC值是不相等的,此时明显更靠近(0,1)(0,1)点的A模型的分类性能会更好。

    ROC曲线之间存在交点

    ​ 如下图所示,模型A、B对应的ROC曲线相交却AUC值相等,此时就需要具体问题具体分析:当需要高Sensitivity值时,A模型好过B;当需要高Specificity值时,B模型好过A。

    在这里插入图片描述

    3.2 同一模型中选择最优点对应的最优模型

    ​ 根据前面的内容,我们可以知道,在同一条ROC曲线上,越靠近(0,1)(0,1)的坐标点对应的模型性能越好,因为此时模型具有较高的真正率和较低的假正率。那么我们如何定量的从一条ROC曲线上找到这个最优的点呢?通常需要借助ISO精度线来找到这个最优的点

    ISO精度线(ISO Accuracy Lines)

    ​ ISO精度线实际上一类斜率确定而截距不确定的直线,设ISO精度线的方程为y=ax+by=ax+b,其中aa为直线的斜率,bb为直线的截距。

    a=NEGPOSa = \frac{NEG}{POS}

    ​ 其中,NEGNEG为数据集中负样本的数目,POSPOS为数据集中正样本的数目

    ​ 如下图所示,当a=0.5a=0.5时,图中的红线都可以作为ISO精度线

    在这里插入图片描述

    根据ISO精度线确定最优点

    ​ 因为ROC曲线上的点都是在同一模型下改变分类阈值得到的,所以在同一条ROC曲线上确定最优点的过程,其实就是确定最佳分类阈值的过程,这个阈值能够让模型在高真正率和低假正率之间取得最好的平衡,即模型的分类性能最好。

    根据ISO精度线确定最优点的步骤:

    1. 首先得到ISO精度线的斜率 a=NEGPOSa = \frac{NEG}{POS}

    2. 初始化截距b=0b=0,即此时的直线方程为y=axy=ax

    3. 逐渐增大截距,即把直线向左上角移动,直到直线与ROC曲线只有一个交点,则这个交点即为我们要找的最优点,这个最优点对应的分类阈值即为使得当前模型性能最优的分类阈值(本来刚开始考虑这个点应该是切点,不过后来想想应该不是,因为ROC图本身是不连续的,相邻节点间都是通过直线连接的)

    3.3 当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变

    ​ 之所以把ROC曲线的这个特性特意提出来讲,是因为我觉得这是ROC曲线和AUC这个评价标准最大的优势所在。其他的如正确率、精确率、召回率和F值都会受到样本分布的影响,即对于同一模型,采用这些指标进行性能评估的话,如果输入的样本中正负样本分布发生变化,则最终的正确率等参数也会变化,这种最终结果会被输入样本分布影响的特性,显然使得这些指标在评估某个样本性能时会对输入样本产生依赖,不能很客观的反应模型的性能(所以这也是为什么一个可信数据集非常重要的原因,因为数据集不仅影响对模型的训练,也会直接影响对模型性能的评估。基于这两点,我们就可以断言,对于同一个模型,更可信的数据集肯定能够取得更好的效果。)

    ​ 而对应于同一个模型,当其中的正负样本分布发生变化时,ROC曲线能够基本保持不变,这就保证至少在模型评估阶段,样本分布不会对这一过程产生太大的影响。

    ​ 那么如何理解这种不变性呢?网上找了很多博客都没有人解释过,我也只能简要的谈谈我的想法,日后如果看到了比较权威的解释再来补充吧。

    ​ 首先,ROC曲线每个点都是以某个阈值对应的TPR为纵坐标,以对应FPR为横坐标,所以不变性肯定是反映在样本分布改变时,ROC曲线图中的点随着阈值变化横纵坐标的变化保持一致。

    ​ 举个例子,当一个数据集中有PP个正样本和NN个负样本时,对应于某个阈值ThresholdThreshold,其TPRTPRFPRFPR计算公式如下:

    TPR=TPTP+FN,FPR=FPFP+TN TPR = \frac{TP}{TP+FN} ,FPR = \frac{FP}{FP+TN}

    ​ 当我们将负样本的数目增加十倍,即此时数据集中有PP个正样本和10N10*N个负样本,根据上面的计算公式可知,在负样本数量增加十倍之后,

    1. TPRTPR值的取值范围是不变,因为TP+FNTP+FN不变,同时TPTP的取值为[0,P][0,P]之间的整数,所以TPRTPR的离散取值区间在负样本增加的情况下是不变的。
    2. TPRTPR值不变的条件下,此时对应的ThresholdThreshold阈值基本不变(如果变化,则TPRTPR值不可能不变),其对应的FPRFPR值的取值范围也是不变的。根据样本独立同分布的假设,负样本数目改变,但负样本的预测概率分布是不变的,即当ThresholdThreshold不变时,FPFP值和FP+TNFP+TN值应该是等比例变化的,此时FPRFPR值不变。

    综上,我们可以从感性认识上证明当样本的分布发生变化时,ROC曲线能够基本保持不变。

    接下来给出一个实例,对比ROC曲线和PR(Precision-Recall)曲线在样本分布变化时的不同。下图中,(a)和(b)分别为从初始测试集中得到的ROC曲线和PR曲线,©和(d)分别为负样本增加十倍之后得到的ROC曲线和PR曲线。由图中可知,当样本分布变化时,ROC曲线基本没有变化,而PR曲线则变化很大,这充分说明了ROC曲线在模型性能评估上的优势。

    在这里插入图片描述

    ROC曲线在多分类问题上的推广

    ​ 经典的ROC曲线适用于对二分类问题进行模型评估,通常将它推广到多分类问题的方式有两种:

    1. 对于每种类别,分别计算其将所有样本点的预测概率作为阈值所得到的TPRTPRFPRFPR值(是这种类别为正,其他类别为负),最后将每个取定的阈值下,对应所有类别的TPRTPR值和FPRFPR值分别求平均,得到最终对应这个阈值的TPRTPRFPRFPR
    2. 首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。

    ​ 上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为’macro’和’micro’的情况。

    展开全文
  • 算法系列之二十一:实验数据与曲线拟合

    万次阅读 多人点赞 2013-10-16 22:17:15
    曲线拟合(Curve Fitting)的数学定义是指用连续曲线近似地刻画或比拟平面上一组离散点所表示的坐标之间的函数关系,是一种用解析表达式逼近离散数据的方法。曲线拟合通俗的说法就是“拉曲线”,也就是将现有数据透过...

    12.1 曲线拟合

    12.1.1 曲线拟合的定义

            曲线拟合(Curve Fitting)的数学定义是指用连续曲线近似地刻画或比拟平面上一组离散点所表示的坐标之间的函数关系,是一种用解析表达式逼近离散数据的方法。曲线拟合通俗的说法就是“拉曲线”,也就是将现有数据透过数学方法来代入一条数学方程式的表示方法。科学和工程遇到的很多问题,往往只能通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,如果能够找到一个连续的函数(也就是曲线)或者更加密集的离散方程,使得实验数据与方程的曲线能够在最大程度上近似吻合,就可以根据曲线方程对数据进行数学计算,对实验结果进行理论分析,甚至对某些不具备测量条件的位置的结果进行估算。

    12.1.2 简单线性数据拟合的例子

            回想一下中学物理课的“速度与加速度”实验:假设某物体正在做加速运动,加速度未知,某实验人员从时间t0 = 3秒时刻开始,以1秒时间间隔对这个物体连续进行了12次测速,得到一组速度和时间的离散数据,请根据实验结果推算该物体的加速度。

    时间 (秒)

    3

    4

    5

    6

    7

    8

    9

    10

    速度(米/秒)

    8.41

    9.94

    11.58

    13.02

    14.33

    15.92

    17.54

    19.22

    时间 (秒)

    11

    12

    13

    14

     

     

     

     

    速度(米/秒)

    20.49

    22.01

    23.53

    24.47

     

     

     

     

    表 12 – 1 物体速度和时间的测量关系表

            在选择了合适的坐标刻度之后,我们就可以在坐标纸上画出这些点。如图12–1所示,排除偏差明显偏大的测量值后,可以看出测量结果呈现典型的线性特征。沿着该线性特征画一条直线,使尽量多的测量点能够位于直线上,或与直线的偏差尽量小,这条直线就是我们根据测量结果拟合的速度与时间的函数关系。最后在坐标纸上测量出直线的斜率K,K就是被测物体的加速度,经过测量,我们实验测到的物体加速度值是1.48米/秒2。

     

    图 12 – 1 实验法测量加速度的过程

     

    12.2 最小二乘法曲线拟合

            使用数学分析进行曲线拟合有很多常用的方法,这一节我们先介绍一下最简单的最小二乘法,并给出使用最小二乘法解决上一节给出的速度与加速度实验问题。

     

    12.2.1 最小二乘法原理

            最小二乘法(又称最小平方法)通过最小化误差的平方和寻找数据的最佳函数匹配,利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小,当然,做为一种插值方法使用时,最小二乘法也可以用于曲线拟合。使用最小二乘法进行曲线拟合是曲线拟合种早期的一种常用方法,不过,最小二乘法理论简单,计算量小,即便是在使用三次样条曲线或RBF(Radial Basis Function)进行曲线拟合大行其道的今天,最小二乘法在多项式曲线或直线的拟合问题上,仍然得到广泛地应用。使用最小二乘法,选取的匹配函数的模式非常重要,如果离散数据呈现的是指数变化规律,则应该选择指数形式的匹配函数模式,如果是多项式变化规律,则应该选择多项式匹配模式,如果选择的模式不对,拟合的效果就会很差,这也是使用最小二乘法进行曲线拟合时需要特别注意的一个地方。

            下面以多项式模式为例,介绍一下使用最小二乘法进行曲线拟合的完整步骤。假设选择的拟合多项式模式是:

    这m个等式相当于m个方程,a0,a1,…am是m个未知量,因此这m个方程组成的方程组是可解的,最小二乘法的第二步处理就是将其整理为针对a0,a1,…am的正规方程组。最终整理的方程组如下:

    最小二乘法的第三步处理就是求解这个多元一次方程组,得到多项式的系数a0,a1,…am,,就可以得到曲线的拟合多项式函数。求解多元一次方程组的方法很多,高斯消元法是最常用的一种方法,下一节就简单介绍一下最小二乘算法实现所用的高斯消元法算法。

    12.2.2 高斯消元法求解方程组

            在数学上,高斯消元法是线性代数中的一个算法,可用来求解多元一次线性方程组,也可以用来求矩阵的秩,以及求可逆方阵的逆矩阵。高斯消元法虽然以数学家高斯的名字命名,但是最早出现在文献资料中应该是中国的《九章算术》。

            高斯消元法的主要思想是通过对系数矩阵进行行变换,将方程组的系数矩阵由对称矩阵变为三角矩阵,从而达到消元的目的,最后通过回代逐个获得方程组的解。在消元的过程中,如果某一行的对角线元素的值太小,在计算过程中就会出现很大的数除以很小的数的情况,有除法溢出的可能,因此在消元的过程中,通常都会增加一个主元选择的步骤,通过行交换操作,将当前列绝对值最大的行交换到当前行位置,避免了除法溢出问题,增加了算法的稳定性。

            高斯消元法算法实现简单,主要有两个步骤组成,第一个步骤就是通过选择主元,逐行消元,最终行程方程组系数矩阵的三角矩阵形式,第二个步骤就是逐步回代的过程,最终矩阵的对角线上的元素就是方程组的解。下面就给出高斯消元法的一个算法实现:

     76 /*带列主元的高斯消去法解方程组,最后的解在matrixA的对角线上*/

     77 bool GuassEquation::Resolve(std::vector<double>& xValue)

     78 {

     79     assert(xValue.size() == m_DIM);

     80 

     81     /*消元,得到上三角阵*/

     82     for(int i = 0; i < m_DIM - 1; i++)

     83     {

     84         /*按列选主元*/

     85         int pivotRow = SelectPivotalElement(i);

     86         if(pivotRow != i)/*如果有必要,交换行*/

     87         {

     88             SwapRow(i, pivotRow);

     89         }

     90         if(IsPrecisionZero(m_matrixA[i * m_DIM + i])) /*主元是0? 不存在唯一解*/

     91         {

     92             return false;

     93         }

     94         /*对系数归一化处理,使行第一个系数是1.0*/

     95         SimplePivotalRow(i, i);

     96         /*逐行进行消元*/

     97         for(int j = i + 1; j < m_DIM; j++)

     98         {

     99             RowElimination(i, j, i);

    100         }

    101     }

    102     /*回代求解*/

    103     m_matrixA[(m_DIM - 1) * m_DIM + m_DIM - 1] = m_bVal[m_DIM - 1] / m_matrixA[(m_DIM - 1) * m_DIM + m_DIM - 1];

    104     for(int i = m_DIM - 2; i >= 0; i--)

    105     {

    106         double totalCof = 0.0;

    107         for(int j = i + 1; j < m_DIM; j++)

    108         {

    109             totalCof += m_matrixA[i * m_DIM + j] * m_matrixA[j * m_DIM + j];

    110         }

    111         m_matrixA[i * m_DIM + i] = (m_bVal[i] - totalCof) / m_matrixA[i * m_DIM + i];

    112     }

    113 

    114     /*将对角线元素的解逐个存入解向量*/

    115     for(int i = 0; i < m_DIM; i++)

    116     {

    117         xValue[i] = m_matrixA[i * m_DIM + i];

    118     }

    119 

    120     return true;

    121 }

     

            GuassEquation::Resolve()函数中m_matrixA是以一维数组形式存放的系数矩阵,m_DIM是矩阵的维数,SelectPivotalElement()函数从系数矩阵的第i列中选择绝对值最大的那个值所在的行,并返回行号,SwapRow()函数负责交换系数矩阵两个行的所有值,SimplePivotalRow()函数是归一化处理函数,通过除法操作将指定的行的对角线元素变换为1.0,以便简化随后的消元操作。

    12.2.3 最小二乘法解决“速度与加速度”实验

            根据12.2.1节对最小二乘法原理的分析,用程序实现最小二乘法曲线拟合的算法主要由两个步骤组成,第一个步骤就是根据给出的测量值生成关于拟合多项式系数的方程组,第二个步骤就是解这个方程组,求出拟合多项式的各个系数。根据对上文最终整理的正规方程组的分析,可以看出其系数有一定的关系,就是每一个方程式都比前一个方程式多乘了一个xi。因此,只需要完整计算出第一个方程式的系数,其他方程式的系数只是将前一个方程式的系数依次左移一位,然后单独计算出最后一个系数就可以了,此方法可以减少很多无谓的计算。求解多元一次方程组的方法就使用12.2.2节介绍的高斯消元法,其算法上一节已经给出。

            这里给出一个最小二乘算法的完整实现,以12.1.2节的数据为例,因为数据结果明显呈现线性方程的特征,因此选择拟合多项式为v = v0 + at,v0和a就是要求解的拟合多项式系数。

     99 bool LeastSquare(const std::vector<double>& x_value, const std::vector<double>& y_value,

    100                  int M, std::vector<double>& a_value)

    101 {

    102     assert(x_value.size() == y_value.size());

    103     assert(a_value.size() == M);

    104 

    105     double *matrix = new double[M * M];

    106     double *b= new double[M];

    107 

    108     std::vector<double> x_m(x_value.size(), 1.0);

    109     std::vector<double> y_i(y_value.size(), 0.0);

    110     for(int i = 0; i < M; i++)

    111     {

    112         matrix[ARR_INDEX(0, i, M)] = std::accumulate(x_m.begin(), x_m.end(), 0.0);

    113         for(int j = 0; j < static_cast<int>(y_value.size()); j++)

    114         {

    115             y_i[j] = x_m[j] * y_value[j];

    116         }

    117         b[i] = std::accumulate(y_i.begin(), y_i.end(), 0.0);

    118         for(int k = 0; k < static_cast<int>(x_m.size()); k++)

    119         {

    120             x_m[k] *= x_value[k];

    121         }

    122     }

    123     for(int row = 1; row < M; row++)

    124     {

    125         for(int i = 0; i < M - 1; i++)

    126         {

    127             matrix[ARR_INDEX(row, i, M)] = matrix[ARR_INDEX(row - 1, i + 1, M)];

    128         }

    129         matrix[ARR_INDEX(row, M - 1, M)] = std::accumulate(x_m.begin(), x_m.end(), 0.0);

    130         for(int k = 0; k < static_cast<int>(x_m.size()); k++)

    131         {

    132             x_m[k] *= x_value[k];

    133         }

    134     }

    135 

    136     GuassEquation equation(M, matrix, b);

    137     delete[] matrix;

    138     delete[] b;

    139 

    140     return equation.Resolve(a_value);

    141 }

     

            将表12-1的数据带入算法,计算得到v0 = 4.05545455,a = 1.48818182,比作图法得到的结果更精确。以上算法是根据最小二乘法的理论推导系数方程,并求解系数方程得到拟合多项式的系数的一种实现方法,除此之外,还可以利用预先计算好的最小二乘解析理论直接求得拟合多项式的系数,读者可自行学习相关的实现算法。

     

     

    12.3 三次样条曲线拟合

            曲线拟合基本上就是一个插值计算的过程,除了最小二乘法,其他插值方法也可以被用于曲线拟合。常用的曲线拟合方法还有基于RBF(Radial Basis Function)的曲线拟合和三次样条曲线拟合。最小二乘法方法简单,便于实现,但是如果拟合模式选择不当,会产生较大的偏差,特别是对于复杂曲线的拟合,如果选错了模式,拟合的效果就很差。基于RBF(Radial Basis Function)的曲线拟合方法需要高深的数学基础,涉及多维空间理论,将低维的模式输入数据转换到高维空间中,使得低维空间内的线性不可分问题在高维空间内变得线性可分,这种数学分析方法非常强大,但是这种方法不宜得到拟合函数,因此在需要求解拟合函数的情况下使用起来不是很方便。

            样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。使用三次样条曲线进行曲线拟合可以得到非常高精度的拟合结果,并且很容易得到拟合函数,本节的内容将重点介绍三次样条曲线拟合的原理和算法实现,并通过一个具体的例子将三次样条函数拟合的曲线与原始曲线对比显示,体会一下三次样条曲线拟合的惊人效果。

     

     

    12.3.1 插值函数

            前文提到过,曲线拟合的实质就是各种插值计算,因此,插值函数的选择决定了曲线拟合的效果。那么插值函数的数学定义是什么呢?若在[a, b]上给出n + 1个点a ≤ x0 < x1 < ⋯ < xn ≤ b,f(x) 是[a, b]上的实值函数, 要求一个具有n + 1个参量的函数s(x; a0,...,an) 使它满足

            s(xi; a0,..., an) = f(xi) , i = 0, 1, ⋯, n                          (3.5)

    则称s(x)为f(x) 在[a, b]上的插值函数. 若s(x) 关于参量a0, a1,...,an是线性关系, 即:

            s(x) = a0s0(x) + a1s1(x) + ⋯ + ansn(x)                                (3.6)

    s(x)就是多项式插值函数,如果si(x)是三角函数,则s(x)就是三角插值函数。

            比较常用的多项式插值函数是牛顿插值多项式和拉格朗日插值多项式,但是在多项式的次数比较高的情况下,插值点数n过多会导致多项式插值在收敛性和稳定性上失去保证,因此,当插值点数n较大的情况下,一般不使用多项式插值,而采用样条插值或次数较低的最小二乘法插值。

    12.3.2 样条函数的定义

            在所有能够保证收敛性和稳定性的插值函数中,最常用的,也是最重要的插值函数就是样条插值函数。采用样条函数计算出的插值曲线和曲面在飞机、轮船和汽车等精密机械设计中都得到了广泛的应用。样条插值函数的数学定义是这样的:

    设区间[a, b]上选取n - 1个节点(包括区间端点a和b共n + 1个节点),将其划分为n个子区间 a = x0 < x1 < ⋯ < xn = b, 如果存在函数s(x),使得s(x)满足以下两个条件:

    (1) s(x) 在整个区间[a, b]上具有m - 1阶连续导数;

    (2) s(x)在每个子区间[xi-1, xi], i= 1, 2, ⋯, n 上是m 次代数多项式(最高次数为m次);

    则称s(x)是区间[a, b]上的m 次样条函数。假如区间[a, b]上存在实值函数f(x),使得每个节点处的值f(xi)与s(xi)相等,即

            s(xi) = f(xi), i = 0, 1, …, n                                          (3.7)

    则称s(x)是实值函数f(x)的m 次样条插值函数。

            当m = 1时,样条插值函数就是分段线性插值, 此时虽然s(x)是属于区间[a, b]上的函数, 但它不光滑(连一阶连续导数性质都不具备),不能满足工程设计要求。工程设计通常使用较多的是m = 3时的三次样条插值函数,此时样条函数具有二阶连续导数性质。

            根据三次样条函数的定义,s(x)在每个子区间上的样条函数si(x)都是一个三次多项式,也就是说,三次样条函数s(x)由n个区间上的n个三次多项式组成,每个三次多项式可描述为以下形式:

            si(x) = aix3 + bix2 + cix + di      i = 1, 2, …, n                      (3.8)

    因此,要确定完整的样条函数s(x)需要确定ai、bi、ci和di公4n个系数。根据样条函数的定义,s(x)在区间内的n - 1个节点处都是连续的,并且其一阶导数si‘(x)和二阶导数si“(x)都是连续的,根据连续函数的性质(xi的左右导数相等),我们可以得到3(n - 1)个条件:

            si(xi - 0) = si+1(xi + 0)    i = 1, 2, …, n-1

            si‘(xi - 0) = si+1‘(xi + 0)    i = 1, 2, …, n-1

            si“(xi - 0) = si+1“(xi + 0)    i = 1, 2, …, n-1                          (3.9)

     

    再加上插值函数在包括区间端点a(就是x0),b(就是xn)在内的n + 1个节点处满足s(xi) = f(xi),又可以得到n + 1个条件,这样就具备了4n – 2个条件。

    12.3.3 边界条件

            为了解决4n个系数组成的方程组,最终确定的s(x),需要再补充两个边界条件使之满足4n个条件。常用的边界条件有以下几种:

            第一类边界条件,即满足s‘(x0) = f’(x0),s‘(xn) = f’(xn)两个条件,其中f(x)是实值函数。

            第二类边界条件,即满足s”(x0) = f”(x0),s”(xn) = f”(xn)两个条件,其中f(x)是实值函数。特别情况下,当f”(x0) = f”(xn) = 0的时候,也就是s”(x0) = s”(xn) = 0的情况下,第二类边界条件又被称为自然边界条件。

            当样条函数的实值函数f(x)是以[a, b]为周期的周期函数时,三次样条函数s(x)在两个端点处满足s‘(x0 - 0) = s‘(xn + 0)和s”(x0 - 0) = s”(xn + 0),这种情况又被成为第三类边界条件。

            工程技术中常用的是第一类边界条件和第二类边界条件,以及第二类边界条件的特殊情况自然边界条件。理想情况下,也就是实值函数已知的情况下,可以通过实值函数直接计算出边界条件的值,否则的话,就只能通过测量和计算得到边界条件的值,有时候甚至只能给出经验估计值,工程技术中通常根据实际情况灵活使用各类边界条件。

    12.3.4 推导三次样条函数

            求三次样条插值函数s(x)的方法很多,其基本原理都是首先求出由待定系数组成的s(x),以及其一阶导数s’(x)和二阶导数s”(x),然后将其带入到12.3.2和12.3.3节列举的4n个条件中,得到关于待定系数的方程组,最后求解方程组得到待定系数,并最终确定插值函数s(x)。

            求三次样条插值函数s(x)常用的方法是“三转角法”和“三弯矩法”。根据三次样条函数的性质,s(x)的一阶导数s’(x)是二次多项式, 二阶导数s”(x)是一次多项式(线性函数), “三转角法”和“三弯矩法”的主要区别是利用这两个特性推导插值函数s(x)、s’(x)和s”(x)的方式不同。“三转角法”利用s(x)的一阶导数s’(x)是二次多项式这个特性,对于子区间[xi, xi+1],利用抛物线插值公式获得一个通过xi和xi+1两个点的二次多项式做为s’(x),然后对s’(x)进行积分和微分(求导)运算,分别得到s(x),和s”(x),最后将它们带入4n个条件中求解系数方程组。“三弯矩法”则是利用s(x)的二阶导数s”(x)是一次多项式(线性函数)这个特性,对于子区间[xi, xi+1],首先假设一个通过xi和xi+1两个点的线性函数做为s”(x),然后对s”(x)进行连续两次积分运算得到s(x),再对s(x)进行求导得运算到s’(x),最后将它们带入4n个条件中求解系数方程组。这两种方法的本质是一样的,只是对s(x)的推导过程不同,接下来就介绍使用“三弯矩法”求解三次样条函数的方法。

            三次样条函数的求解过程就是系数方程组的推导过程,使用“三弯矩法”推导系数方程组,首先要确定插值函数的二阶导数s”(x)。根据三次样条函数的性质,在每个子区间[xi, xi+1]上,其二阶导数s”(x)是个线性方程,现在假设在xi和xi+1两个端点的二阶导数值分别是Mi和Mi+1,也就是s”(xi) = Mi,s”(xi+1) = Mi+1,则经过xi和xi+1的两点式直线方程是:

    从M0到Mn,有n+1个Mi的值需要求解,但是(3.20)只有n-1个等式,此时就需要用到两个边界条件了。

            如果是使用第二类边界条件,则直接可以得到以下两个条件等式:

            s”(x0) = M0 = f”(x0) = y0’                                                (3.21)

            s”(xn) = Mn = f”(xn) = yn’                                                (3.22)

    令d0 = 2y0’,dn = 2yn’,可以得到由第二类边界条件确定的两个方程:

            2M0 = d0                                                                    (3.23)

            2Mn = dn                                                                    (3.24)

            如果是使用第一类边界条件,即s‘(x0) = f’(x0),s‘(xn) = f’(xn)两个条件,则需要将这两个条件代入(3.16),通过计算得到两个条件等式。将s‘(x0) = y0’代入(3.16),得到:

    将第二类边界条件得到的(3.23)和(3.24)或第一类边界条件得到的(3.27)和(3.28)与(3.20)中的n – 1个等式组合在一起就得到一个关于Mi的方程组,求解此方程组可以得到Mi的值,代入到(3.15)即可得到三次样条函数方程。以第一类边界条件得到的(3.27)和(3.28)为例,与(3.20)连立得到以下方程组:

    这就是三弯矩方程组,其中Mi,i=0,1,…n就是三次样条函数s(x)的矩。根据(3.27)和(3.28),un = 1,v0 = 1,其余各系数可以通过(3.19)中的系数计算出来。这个方程组的系数矩阵是一个对角线矩阵,并且是一个严格对角占优的对角阵(ui和vi的值均小于主对角线的值,也就是ui和vi的值皆小于2),可以使用追赶法求解。下一节将介绍如何使用追赶法求解方程组,并给出求解的算法实现。

    12.3.5 追赶法求解方程组

            任意矩阵A,都可以通过克洛脱(Crout)分解得到两个三角矩阵:

    其中y1=d1/l1,其余各项的递推计算关系是:

    yi = (di – miyi-1)/li, i = 2,3,… ,n

    对于第二个方程,求解最终结果xi:

    其中xn = yn,其余各项的递推求解关系是:

    xi = yi – uixi+1, i = n – 1, n – 2, …, 1

    递推计算yi和xi的过程分别被形象地形容为追的过程和赶的过程,这也是追赶法得名的原因,实际上这种方法在国际上叫做托马斯(Thomas)法。在这里需要强调一下,对三角矩阵的克洛脱分解需要满足几个条件,否则无法进行,这几个条件分别是:

            下面就给出一个追赶法求解方程组的通用算法实现,在使用之前需要判断系数矩阵是否是对三角矩阵,并且满足上述三个条件,相关的判断请读者自行添加:

     76 /*追赶法求对三角矩阵方程组的解*/

     77 bool ThomasEquation::Resolve(std::vector<double>& xValue)

     78 {

     79     assert(xValue.size() == m_DIM);

     80 

     81     std::vector<double> L(m_DIM);

     82     std::vector<double> M(m_DIM);

     83     std::vector<double> U(m_DIM);

     84     std::vector<double> Y(m_DIM);

     85 

     86     /*消元,追的过程*/

     87     L[0] = m_matrixA[ARR_INDEX(0, 0, m_DIM)];

     88     U[0] = m_matrixA[ARR_INDEX(0, 1, m_DIM)] / L[0];

     89     Y[0] = m_bVal[0] / L[0];

     90     for(int i = 1; i < m_DIM; i++)

     91     {

     92         if(IsPrecisionZero(m_matrixA[ARR_INDEX(i, i, m_DIM)]))

     93         {

     94             return false;

     95         }

     96         M[i] = m_matrixA[ARR_INDEX(i, i - 1, m_DIM)];

     97         L[i] = m_matrixA[ARR_INDEX(i, i, m_DIM)] - M[i] * U[i - 1];

     98         Y[i] = (m_bVal[i] - M[i] * Y[i - 1]) / L[i];

     99         if((i + 1) < m_DIM)

    100         {

    101             U[i] = m_matrixA[ARR_INDEX(i, i + 1, m_DIM)] / L[i];

    102         }

    103     }

    104     /*回代求解,赶的过程*/

    105     xValue[m_DIM - 1] = Y[m_DIM - 1];

    106     for(int i = m_DIM - 2; i >= 0; i--)

    107     {

    108         xValue[i] = Y[i] - U[i] * xValue[i + 1];

    109     }

    110 

    111     return true;

    112 }

     

    12.3.6 三次样条曲线拟合算法实现

            根据12.3.4节对三次样条函数的推导分析,三次样条曲线拟合算法的核心可分为三部分,第一部分是根据推导结果计算关于三次样条函数的“矩”的方程组的系数矩阵,第二部分就是用追赶法求解方程组,得到各个区间的三次样条函数,第三部分就是根据每个拟合点的输入的值xi,确定使用哪个区间的三次样条函数,并使用该区间的三次样条函数计算出三次样条插值yi,最后得到的一系列(xi, yi)组成的曲线就是三次样条拟合曲线。拟合算法也是按照上面的分析,分三个步骤计算插值:

            第一步是计算系数矩阵,其中u0、v0、d0和dn的值需要单独计算,其余的值可以通过(3.19)递推计算出来。

            第二步是将系数矩阵代入12.3.5节给出的追赶法通用算法,求出Mi的值。求解之前,先证明一下第一步得到系数矩阵是否满足追赶法的条件。首先,主对角线元素的值都是2,满足12.3.5节的条件(1)。其次,由ui和vi的计算条件可知,|ui| < 1,|vi| < 1,这也满足12.3.5节的条件(2)。最后,因为ai = 2,且ui和vi的和是1,所以12.3.5节的条件(3)也得到了满足。由上判断可知,求解三次样条函数的“矩”的系数矩阵满足使用追赶法求解的条件,可以使用追赶法求解。

            第三步是计算插值,需要将第二步计算得到的Mi代入(3.15),并选择合适的子区间样条函数计算出插值点的值。

            下面就给出采用三弯矩法实现的三次样条曲线拟合算法,CalcSpline()函数的参数Xi和Yi是n个插值点(包括起点和终点)的值,boundType是边界条件类型,b1和b2分别是对应的两个边界条件,这个算法支持第一类和第二类边界条件(包括自然边界条件)。内部的矩阵matrixA就是按照(3.29)构造的Mi方程组的系数矩阵,可用于直接用追赶法求解方程组。CalcSpline()函数的大部分代码都是在构造Mi方程组的系数矩阵,首先根据边界条件确定un 、v0 、d0和dn,其他系数则根据(3.19)的递推关系,在for(int i = 1; i < (m_valN - 1); i++)循环中依次计算出来,最后是利用12.3.5节给出的追赶法算法求出Mi。GetValue()函数负责计算给定区间内任意位置的插值,首先根据x的值确定使用哪个子区间的样条函数,然后根据(3.12)和(3.14)给出的关系计算插值。

     16 void SplineFitting::CalcSpline(double *Xi, double *Yi, int n, int boundType, double b1, double b2)

     17 {

     18     assert((boundType == 1) || (boundType == 2));

     19 

     20     double *matrixA = new double[n * n];

     21     if(matrixA == NULL)

     22     {

     23         return;

     24     }

     25     double *d = new double[n];

     26     if(d == NULL)

     27     {

     28         delete[] matrixA;

     29         return;

     30     }

     31 

     32     m_valN = n;

     33     m_valXi.assign(Xi, Xi + m_valN);

     34     m_valYi.assign(Yi, Yi + m_valN);

     35     m_valMi.resize(m_valN);

     36     memset(matrixA, 0, sizeof(double) * n * n);

     37 

     38     matrixA[ARR_INDEX(0, 0, m_valN)] = 2.0;

     39     matrixA[ARR_INDEX(m_valN - 1, m_valN - 1, m_valN)] = 2.0;

     40     if(boundType == 1) /*第一类边界条件*/

     41     {

     42         matrixA[ARR_INDEX(0, 1, m_valN)] = 1.0; //v0

     43         matrixA[ARR_INDEX(m_valN - 1, m_valN - 2, m_valN)] = 1.0; //un

     44         double h0 = Xi[1] - Xi[0];

     45         d[0] = 6 * ((Yi[1] - Yi[0]) / h0 - b1) / h0; //d0

     46         double hn_1 = Xi[m_valN - 1] - Xi[m_valN - 2];

     47         d[m_valN - 1] = 6 * (b2 - (Yi[m_valN - 1] - Yi[m_valN - 2]) / hn_1) / hn_1; //dn

     48     }

     49     else /*第二类边界条件*/

     50     {

     51         matrixA[ARR_INDEX(0, 1, m_valN)] = 0.0; //v0

     52         matrixA[ARR_INDEX(m_valN - 1, m_valN - 2, m_valN)] = 0.0; //un

     53         d[0] = 2 * b1; //d0

     54         d[m_valN - 1] = 2 * b2; //dn

     55     }

     56     /*计算ui,vi,di,i = 2,3,...,n-1*/

     57     for(int i = 1; i < (m_valN - 1); i++)

     58     {

     59         double hi_1 = Xi[i] - Xi[i - 1];

     60         double hi = Xi[i + 1] - Xi[i];

     61         matrixA[ARR_INDEX(i, i - 1, m_valN)] = hi_1 / (hi_1 + hi); //ui

     62         matrixA[ARR_INDEX(i, i, m_valN)] = 2.0;

     63         matrixA[ARR_INDEX(i, i + 1, m_valN)] = 1 - matrixA[ARR_INDEX(i, i - 1, m_valN)]; //vi = 1 - ui

     64         d[i] = 6 * ((Yi[i + 1] - Yi[i]) / hi - (Yi[i] - Yi[i - 1]) / hi_1) / (hi_1 + hi); //di

     65     }

     66 

     67     ThomasEquation equation(m_valN, matrixA, d);

     68     equation.Resolve(m_valMi);

     69     m_bCalcCompleted = true;

     70 

     71     delete[] matrixA;

     72     delete[] d;

     73 }

     74 

     75 double SplineFitting::GetValue(double x)

     76 {

     77     if(!m_bCalcCompleted)

     78     {

     79         return 0.0;

     80     }

     81     if((x < m_valXi[0]) || (x > m_valXi[m_valN - 1]))

     82     {

     83         return 0.0;

     84     }

     85     int i = 0;

     86     for(i = 0; i < (m_valN - 1); i++)

     87     {

     88         if((x >= m_valXi[i]) && (x < m_valXi[i + 1]))

     89             break;

     90     }

     91     double hi = m_valXi[i + 1] - m_valXi[i];

     92     double xi_1 = m_valXi[i + 1] - x;

     93     double xi = x - m_valXi[i];

     94 

     95     double y = xi_1 * xi_1 * xi_1 * m_valMi[i] / (6 * hi);

     96     y += (xi * xi * xi * m_valMi[i + 1] / (6 * hi));

     97 

     98     double Ai = (m_valYi[i + 1] - m_valYi[i]) / hi - (m_valMi[i + 1] - m_valMi[i]) * hi / 6.0;

     99     y += Ai * x;

    100     double Bi = m_valYi[i + 1] - m_valMi[i + 1] * hi * hi / 6.0 - Ai * m_valXi[i + 1];

    101     y += Bi;

    102     return y;

    103 }

     

    12.3.7 三次样条曲线拟合的效果

    本节将用定义一个原始函数,从原始函数的某个区间上抽取9个插值点,根据这9个插值点和原函数的边界条件,利用三次样条曲线插值进行曲线拟合,并将原始曲线和拟合曲线做对比,展示一下三次样条曲线拟合的效果。

    首先定义原始函数:

    f(x) = 3/(1 + x2)

     

    选择区间[0.0, 8.0]上的9个点做为插值点,计算各点的值为:

    x

    0.0

    1.0

    2.0

    3.0

    4.0

    5.0

    6.0

    7.0

    8.0

    y

    3.0

    1.5

    0.6

    0.3

    0.1765

    0.1154

    0.0811

    0.06

    0.0462

    表 12 – 2 原函数f(x)在各插值点的值

    求f(x)的导函数f’(x):

    f’(x) = -6x/(1 + x2)2

    根据f’(x)计算出在区间端点处的两个第一类边界条件f’(0.0) = 0.0, f’(8.0) = -0.01136。利用表12-2中的数据和这两个边界条件,计算出三次样条插值函数,并从0.0开始,以0.01为步长,连续求800个点的插值,将这些点连成曲线得到拟合曲线。为了作对比,同样从0.0开始,以0.01为步长,用f(x)函数连续计算800个点的原值,将这些点连成曲线得到原始曲线。分别用不同的颜色画出这两条曲线,如图12-2所示:

    图12-2 拟合曲线和原始曲线对比

            从图12-2可以看到,三次样条曲线拟合的效果非常好。同样在[0.0, 8.0]区间上,如果增加插值点的个数,将获得更好的拟合效果。比如以0.5为单位,将插值点增加到17个,则拟合的曲线与原始曲线几乎完全重合。

     

    展开全文
  • 下面来看一下ROC和PR曲线(以下内容为自己总结): 1、ROC曲线: ROC(Receiver Operating Characteristic)曲线是以假正率(FP_rate)和真正率(TP_rate)为轴的曲线,ROC曲线下面的面积我们叫做AUC,如下图所示:...

    增注:虽然当时看这篇文章的时候感觉很不错,但是还是写在前面,想要了解关于机器学习度量的几个尺度,建议大家直接看周志华老师的西瓜书的第2章:模型评估与选择,写的是真的很好!!

    以下第一部分内容转载自:机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)是怎么一回事

    摘要:

    数据挖掘、机器学习和推荐系统中的评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)简介。

    引言:

    在机器学习、数据挖掘、推荐系统完成建模之后,需要对模型的效果做评价。

    业内目前常常采用的评价指标有准确率(Precision)、召回率(Recall)、F值(F-Measure)等,下图是不同机器学习算法的评价指标。下文讲对其中某些指标做简要介绍。

    这里写图片描述

    本文针对二元分类器!
    本文针对二元分类器!!
    本文针对二元分类器!!!

    对分类的分类器的评价指标将在以后文章中介绍。

    在介绍指标前必须先了解“混淆矩阵”:

    混淆矩阵

    True Positive(真正,TP):将正类预测为正类数

    True Negative(真负,TN):将负类预测为负类数

    False Positive(假正,FP):将负类预测为正类数误报 (Type I error)

    False Negative(假负,FN):将正类预测为负类数→漏报 (Type II error)

    这里写图片描述

    这里写图片描述

    1、准确率(Accuracy)

    准确率(accuracy)计算公式为:
    这里写图片描述

    注:准确率是我们最常见的评价指标,而且很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好。
    准确率确实是一个很好很直观的评价指标,但是有时候准确率高并不能代表一个算法就好。比如某个地区某天地震的预测,假设我们有一堆的特征作为地震分类的属性,类别只有两个:0:不发生地震、1:发生地震。一个不加思考的分类器,对每一个测试用例都将类别划分为0,那那么它就可能达到99%的准确率,但真的地震来临时,这个分类器毫无察觉,这个分类带来的损失是巨大的。为什么99%的准确率的分类器却不是我们想要的,因为这里数据分布不均衡,类别1的数据太少,完全错分类别1依然可以达到很高的准确率却忽视了我们关注的东西。再举个例子说明下。在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc也有 99% 以上,没有意义。因此,单纯靠准确率来评价一个算法模型是远远不够科学全面的。

    2、错误率(Error rate)

    错误率则与准确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(TP+TN+FP+FN),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 - error rate。

    3、灵敏度(sensitive)

    sensitive = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力。

    4、特效度(specificity)

    specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力。

    5、精确率、精度(Precision)

    精确率(precision)定义为:
    这里写图片描述

    表示被分为正例的示例中实际为正例的比例。

    6、召回率(recall)

    召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。

    7、综合评价指标(F-Measure)
    P和R指标有时候会出现的矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure(又称为F-Score)。
    F-Measure是Precision和Recall加权调和平均:
    这里写图片描述
    当参数α=1时,就是最常见的F1,也即
    这里写图片描述
    可知F1综合了P和R的结果,当F1较高时则能说明试验方法比较有效。

    8、其他评价指标

    计算速度:分类器训练和预测需要的时间;

    鲁棒性:处理缺失值和异常值的能力;

    可扩展性:处理大数据集的能力;

    可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。

    下面来看一下ROC和PR曲线(以下内容为自己总结):

    1、ROC曲线:
    ROC(Receiver Operating Characteristic)曲线是以假正率(FP_rate)和真正率(TP_rate)为轴的曲线,ROC曲线下面的面积我们叫做AUC,如下图所示:
    图片根据Paper:Learning from eImbalanced Data画出

    图片根据Paper:Learning from eImbalanced Data画出

    其中: TPrate=TPPcTP_{rate}=\frac{TP}{P_c}TPrate=PcTP, FPrate=FPNcFP_rate=\frac{FP}{N_c}FPrate=NcFP
    (1)曲线与FP_rate轴围成的面积(记作AUC)越大,说明性能越好,即图上L2曲线对应的性能优于曲线L1对应的性能。即:曲线越靠近A点(左上方)性能越好,曲线越靠近B点(右下方)曲线性能越差。
    (2)A点是最完美的performance点,B处是性能最差点。
    (3)位于C-D线上的点说明算法性能和random猜测是一样的–如C、D、E点。位于C-D之上(即曲线位于白色的三角形内)说明算法性能优于随机猜测–如G点,位于C-D之下(即曲线位于灰色的三角形内)说明算法性能差于随机猜测–如F点。
    (4)虽然ROC曲线相比较于Precision和Recall等衡量指标更加合理,但是其在高不平衡数据条件下的的表现仍然过于理想,不能够很好的展示实际情况。

    2、PR曲线:
    即,PR(Precision-Recall)曲线。
    举个例子(例子来自Paper:Learning from eImbalanced Data):
    假设N_c>>P_c(即Negative的数量远远大于Positive的数量),若FP很大,即有很多N的sample被预测为P,因为FPrate=FPNcFP_{rate}=\frac{FP}{N_c}FPrate=NcFP,因此FP_rate的值仍然很小(如果利用ROC曲线则会判断其性能很好,但是实际上其性能并不好),但是如果利用PR,因为Precision综合考虑了TP和FP的值,因此在极度不平衡的数据下(Positive的样本较少),PR曲线可能比ROC曲线更实用。

    展开全文
  • 最小二乘法曲线拟合以及Matlab实现

    万次阅读 多人点赞 2017-12-28 17:31:23
    最小二乘法曲线拟合以及Matlab实现 在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这...

    最小二乘法曲线拟合以及Matlab实现

    在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。

    目录

    • 最小二乘法直线拟合原理
    • 曲线拟合
    • Matlab实现代码

    最小二乘法直线线拟合原理

    首先,我们从曲线拟合的最简单情况——直线拟合来引入问题。如果待拟合点集近似排列在一条直线上时,我们可以设直线 y=ax+by=ax+by=ax+b 为其拟合方程,系数 A=[a,b]A=[a,b]A=[a,b] 为待求解项,已知:
    这里写图片描述

    用矩阵形式表达为: Y=X0AY=X_{0}AY=X0A,其中:
    这里写图片描述
    要求解A,可在方程两边同时左乘 X0X_{0}X0 的逆矩阵,如果它是一个方阵且非奇异的话。

    但是,一般情况下 X0X_{0}X0 连方阵都不是,所以我们在此需要用 X0X_{0}X0 构造一个方阵,即方程两边同时左乘 X0X_{0}X0 的转置矩阵,得到方程: X0TY=X0TX0AX_{0}^{T}Y=X_{0}^{T}X_{0}AX0TY=X0TX0A

    此时,方程的系数矩阵 X0TX0X_{0}^{T}X_{0}X0TX0 为方阵,所以两边同时左乘新系数矩阵 X0TX0X_{0}^{T}X_{0}X0TX0 的逆矩阵,便可求得系数向量A ,即:(X0TX0)−1X0TY=A(X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A(X0TX0)1X0TY=A

    方程A=(X0TX0)−1X0TYA=(X_{0}^{T}X_{0})^{-1}X_{0}^{T}YA=(X0TX0)1X0TY 右边各部分均已知,所以可直接求解得到拟合直线的方程系数向量A。

    曲线线拟合

    当样本点的分布不为直线时,我们可用多项式曲线拟合,即拟合曲线方程为n阶多项式

    y=∑i=0naixi=anxn+an−1xn−1+...+a1x+a0y=\sum_{i=0}^{n}a_ix^i=a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0y=i=0naixi=anxn+an1xn1+...+a1x+a0

    用矩阵形式表示为: Y=X0AY=X_0AY=X0A ,其中:

    X0

    待求解项为系数向量A=[an,an−1,...,a2,a1,a0]TA=[a_n,a_{n-1},...,a_2,a_1,a_0]^TA=[an,an1,...,a2,a1,a0]T

    曲线拟合方程Y=X0AY=X_0AY=X0A 的求解方法与上面直线的求解方法一样,也是在方程Y=X0AY=X_0AY=X0A 两边同左乘X0X_0X0的转置矩阵得到: X0TY=X0TX0AX_{0}^{T}Y=X_{0}^{T}X_{0}AX0TY=X0TX0A

    再同时在新方程两边同时左乘X0TX0X_{0}^{T}X_{0}X0TX0 的逆矩阵,得到:(X0TX0)−1X0TY=A(X_{0}^{T}X_{0})^{-1}X_{0}^{T}Y=A(X0TX0)1X0TY=A

    上式左边各部分均已知,所以可直接求解得拟合曲线方程的系数向量A。

    Matlab实现代码

    %by hanlestudy@163.com
    clear
    clc
    x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
    y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
    [~,k]=size(x);
    for n=1:9
        X0=zeros(n+1,k);
        for k0=1:k           %构造矩阵X0
            for n0=1:n+1
                X0(n0,k0)=x(k0)^(n+1-n0);
            end
        end
        X=X0';
        ANSS=(X'*X)\X'*y';
        for i=1:n+1          %answer矩阵存储每次求得的方程系数,按列存储
           answer(i,n)=ANSS(i);
       end
        x0=0:0.01:17;
        y0=ANSS(1)*x0.^n    ;%根据求得的系数初始化并构造多项式方程
        for num=2:1:n+1     
            y0=y0+ANSS(num)*x0.^(n+1-num);
        end
        subplot(3,3,n)
        plot(x,y,'*')
        hold on
        plot(x0,y0)
    end
    suptitle('不同次数方程曲线拟合结果,从1到9阶')
    

    运行结果

    拟合曲线结果:

    可以看出看来,当多项式的阶数过小是,曲线并不能很好地反映出样本点的分布情况;但阶数过高时,会出现过拟合的情况。
    这里写图片描述

    系数矩阵answer:

    这里写图片描述

    Matlab自带函数——polyfit

    在matlab中,也有现成的曲线拟合函数polyfit,其也是基于最小二乘原理实现的,具体用法为:ans=polyfit(x,y,n). 其中x,y为待拟合点的坐标向量,n为多项式的阶数。

    下面代码是用polyfit函数来做曲线拟合:

    clear
    clc
    x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
    [~,k]=size(x);
    y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
    for n=1:9
        ANSS=polyfit(x,y,n);  %用polyfit拟合曲线
        for i=1:n+1           %answer矩阵存储每次求得的方程系数,按列存储
           answer(i,n)=ANSS(i);
       end
        x0=0:0.01:17;
        y0=ANSS(1)*x0.^n    ; %根据求得的系数初始化并构造多项式方程
        for num=2:1:n+1     
            y0=y0+ANSS(num)*x0.^(n+1-num);
        end
        subplot(3,3,n)
        plot(x,y,'*')
        hold on
        plot(x0,y0)
    end
    suptitle('不同次数方程曲线拟合结果,从1到9阶')
    

    运行结果:

    用polyfit拟合的结果与第一份代码运行的结果基本一样
    这里写图片描述

    申明

    本文为本人原创,转载请注明出处!

    展开全文
  • 分类模型评估之ROC-AUC曲线和PRC曲线

    万次阅读 多人点赞 2016-06-30 11:27:09
    ROC(Receiver Operating Characteristic,接受者工作特征曲线曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。博文介绍ROC和AUC的特点,讨论如何作出ROC曲线图以及计算AUC。 AUC是现...
  • matplotlib绘制平滑的曲线

    万次阅读 2018-11-03 09:39:03
    matplotlib绘制平滑的曲线有2种常用的方法 1.曲线拟合 使用scipy库可以拟合曲线. 没拟合的图: import matplotlib.pyplot as plt import numpy as np T = np.array([6, 7, 8, 9, 10, 11, 12]) power = np.array(...
  • P-R曲线深入理解

    万次阅读 多人点赞 2018-04-19 19:48:09
    P-R曲线就是精确率precision vs 召回率recall 曲线,以recall作为横坐标轴,precision作为纵坐标轴。首先解释一下精确率和召回率。解释精确率和召回率之前,先来看下混淆矩阵,负 正负TNFP正FNTP把正例正确分类为...
  • 多分类下的ROC曲线和AUC

    万次阅读 多人点赞 2018-03-05 17:37:20
    本文主要介绍一下多分类下的ROC曲线绘制和AUC计算,并以鸢尾花数据为例,简单用python进行一下说明。如果对ROC和AUC二分类下的概念不是很了解,可以先参考下这篇文章:...
  • Qt-QCustomplot画静态、动态曲线教程图解

    万次阅读 多人点赞 2018-03-23 14:18:22
    QCustomPlot是一个小型的Qt画图标类,支持绘制静态曲线、动态曲线、多重坐标曲线,柱状图,蜡烛图等。只需要在项目中加入头文件qcustomplot.h和qcustomplot.cpp文件,然后使一个widget提升为QCustomPlot类,即可...
  • 贝塞尔曲线

    千次阅读 2018-01-09 10:32:37
    贝塞尔曲线(The Bézier Curves),是一种在计算机图形学中相当重要的参数曲线(2D,3D的称为曲面)。 贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所发表,他运用贝塞尔曲线来为汽车的主体...
  • 1,校准曲线 (包括"标准曲线"和"工作曲线") 应用标准溶液制作校准曲线时,如果分析步骤与样品的分析步骤相比有某些省略时,则制作的校准曲线称为标准曲线; 如果模拟被分析物质的成分,并与样品完全相同的分析...
  • 本文介绍了运动控制终的S曲线,通过matlab和C语言实现并进行仿真;篇幅较长,自备茶水;
  • Nurbs曲线+曲线阶数+曲线的基本属性

    千次阅读 2019-01-03 14:51:38
    •Nurbs曲线+曲线阶数+曲线的基本属性: •Nurbs曲线: 目前Nurbs曲线是工业设计领域模型描述的标准CATIA、UG、Pro-E、Alias都支持Nurbs模型。对于Nurbs曲线的理解有助于模型的构建。Nurbs曲线全称为Non uniform ...
  • 曲线积分

    万次阅读 多人点赞 2018-06-17 23:34:15
    曲线积分可以分为两类: 对弧长的曲线积分 对坐标的曲线积分 我们分别介绍 对弧长的曲线积分 对弧长曲线积分的现实(物理)含义:弧长 × 物理量 = 对弧长曲线积分值; 举例说明: 计算曲型物体质量:弧长 ...
  • 用贝塞尔曲线曲线

    千次阅读 2018-04-25 14:47:27
    在j中,提供了bezierCurveTo()方法,也就是利用起点,终点,两个控制点在canvas画贝塞尔曲线,首先,咱们通过moveTo函数将笔尖移动到曲线的起点,然后bezierCurveTo(控制点, 控制点, 终点)这样画出贝塞尔曲线.关于贝塞尔...
  • 已知y=x , x取值范围为〔0,2〕,如何用matlab 画幅频特性曲线和相频特性曲线
  • PR曲线和ROC曲线理解

    千次阅读 2019-08-30 23:26:21
    PR曲线和ROC曲线是数据挖掘中2个常见的评估指标(对于二分器而言),理解如下: 一、pr曲线: 1)y轴为precision,x轴为recall。 2)pr曲线上各个取值为当前p下,样本判断结果:大于p的为正样本,反之为负样本。 ...
  • lm曲线公式推导_LM曲线

    千次阅读 2021-01-27 06:39:26
    LM曲线(LM Curve)[编辑]LM曲线概述LM曲线是一条用来描述在货币市场均衡状态下国民收入和利率之间相互关系的曲线。LM曲线表示在货币市场中,货币供给等于货币需求时收入与利率的各种组合的点的轨迹。LM曲线的数学...
  • ROC曲线详解

    万次阅读 多人点赞 2018-04-26 13:33:49
    —————————————————————————————————分割线1 ROC曲线的概念受试者工作特征曲线 (receiver operating characteristic curve,简称ROC曲线),又称为 感受性曲线(sensitivity curve...
  • 样条曲线

    千次阅读 2019-07-21 21:04:46
    在计算机图形中,样条曲线(spline curve)指由多项式曲线段连接而成的曲线,在每段的边界处满足特定的连续性条件。样条曲面(spline surface)可以使用两组样条曲线进行描述。       ...
  • roc曲线的意义_ROC曲线分析

    千次阅读 2020-12-19 09:48:42
    作者:柏安之 封面:自己想吧01ROC曲线的主要作用(1)ROC曲线可以很容易地查出一个分类器在某个阈值时对样本的识别能力。(2)可以借助ROC曲线选择出某一诊断方法最佳的诊断界限值。ROC曲线越是靠近左上角,试验的FPR越...
  • 显式曲线 隐式曲线 曲率公式推导

    千次阅读 2020-06-05 23:01:44
    显示曲线曲率、隐式曲线曲率推导过程曲率公式显示曲线曲率推导过程隐式曲线曲率推导过程 曲率公式 曲线的曲率(curvature)就是针对曲线上某个点的切线方向角对弧长的转动率示,曲线曲率越大,表示曲线的弯曲程度越大...
  • 曲线拟合(曲线平滑)

    千次阅读 2017-01-29 15:33:07
    曲线拟合 , 曲线平滑
  • 曲线平滑-贝塞尔曲线

    万次阅读 2016-08-31 12:04:50
    Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究...
  • ROC曲线-阈值评价标准

    万次阅读 多人点赞 2012-03-16 08:42:32
    ROC曲线指受试者工作特征曲线 / 接收器操作特性曲线(receiver operating characteristic curve), 是反映敏感性和特异性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同...
  • CMC曲线

    千次阅读 2018-12-14 15:10:32
    CMC曲线(累计匹配曲线) CMC曲线在人脸识别,行人重识别等领域使用的非常多,但却很少有文章去详细的介绍CMC曲线,这是我在researchgate网页上某个博主主页上找到的关于CMC曲线的介绍,个人觉得通过例子讲解的形式...
  • Bezier曲线与Catmull-Rom曲线

    千次阅读 2019-08-16 17:33:02
    详细推导贝塞尔曲线以及Catmull-Rom曲线的绘制公司,并给出相关代码(Unity,C#),其中Catmull-Rom曲线与Dotween的一致

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,786
精华内容 41,114
关键字:

曲线