量化项目管理案例:缺陷趋势预测利器
 

2010-01-11 作者:founder_cmmi 来源:blog.ccidnet.com

 

Gompertz模型

不知身为软件工程师的你,在写代码时是不是有过这样的经历:一方面对自己写的代码信心满满,一方面又非常希望知道自己开发的代码的质量到底多高。如果代码真的没被测出bug来或者测出的bug较少时,反而有点担心——会不会还有隐藏的更深的bug没被发现?或者身为测试工程师的你,可能比开发人员担心的会更多:这些代码该不该再继续测试了?怎么就能断定当前的版本算是通过验收标准了,继而可以被客户和用户认可?是不是就可以把这个版本交付使用了呢?

--------------------------------------------------------------------------------

相信这是很多开发和测试人员都曾经经历过的。无论是开发人员、测试人员,还是项目经理、高层管理人员,都已经为版本的交付日以继夜的加班工作,可不能在交付的时刻功亏一篑。打击心情不说,加班加点不说,而且,谁该来为可能的返工和无休无止的变更买单呢。

所以,软件版本在发布时需要有一个判定的标准——没有预先定义的判定标准,就无法去判断版本是否已经达到了客户的要求。不进行判断,或者是错误的判断,都很有可能会造成该项目资源安排的不合理,甚至造成资源的浪费,那么不管是精神上还是体力上,甚至进度上、成本上,都会给项目团队带来不小的打击。

CMMI四级的一个要求是量化的管理项目(详见量化项目管理QPM中文版)。映射到缺陷预测活动中,也就是量化的管理缺陷。量化的退出标准就是将类似“这个版本是否能够通过”这样的问题,形象地转变为“已经测出的bug数是否已经足够多,遗留的bug是否已经少到不会影响软件的交付”等等这样的表述。这样,无论是理解上还是判断上都更加容易,版本发布标准也就变得不难理解了。

在决定发布版本之前,需要去统计这样几件事:我们已经发现了多少个bug;用量化的方法进行管理时,我们还有多少个bug没有发现;我们统计到的未发现的bug数是否能达到客户的要求;如果无法满足客户的要求,那我们至少还需要发现多少个bug。当这一系列问题都解决了以后,开发、测试人员是终于可以“收”工拿项目奖,还是需要返工加班、继续努力,也就一目了然了。

知道了要做什么,接下来要考虑的就是“怎么做”。出于这样的原因,方正国际软件有限公司(以下简称方正国际)几年来一直都在内部实施着利用统计学的原理对软件缺陷进行管理和监控。用统计学的方法监控和预测缺陷的发展情况,从而对发现的缺陷进行管理,确定还未发现的缺陷情况、为了按时交付每一个阶段应当发现的缺陷情况,以此相应调整测试工作的时间和进度。

这就是方正国际近两年来一直在内部实施的基于Gompertz模型的缺陷预测与管理,以及在此基础上开发的缺陷预测与管理的工具。在已经采集到的多个项目数据的基础上,现在该工具已经在公司内部使用。应用这个工具,让测试人员在测试初期就对自己大致的工作量有了比较准确的估计,并对测试的每个阶段发现的bug实施分析和监控;根据预实对照的目标达成情况来调整开发、测试的进度;而且在最终交付时,给客户一个高质量的、可靠的工作产品。简单用个例子来说明吧。在项目A还未进入但即将进入测试阶段时,测试经理就会根据历史的情况、经验等方法,估计出进入测试阶段后的第一周,大概可以发现多少件缺陷;同样,再估计出版本交付时可能出现的缺陷数目,以及版本交付后会出现的缺陷的数目。利用这三个数据的信息,就大致可以得到:要达到预定的目标,在进入测试阶段后,每周、甚至每天大概需要发现多少缺陷。以此为依据,测试经理就可以对团队中的测试人员的任务进行分配、对工作进行评价。当然,这仅仅是Gompertz模型使用的场景之一。

统计学是很强大的,统计学知识的应用也是很广泛的。那么,在缺陷预测中的统计学原理,或者说是理论依据是什么呢?基于Gompertz模型的缺陷预测工具到底是怎样对测试活动和质量进行监控的呢?接下来,我们会逐步与大家分享。

预测技术

在展开Gompertz模型趋势预测的说明前,首先给关注统计学知识在软件行业应用的网友介绍趋势预测的基础知识。

如何理解预测技术呢?简单来说,预测(prediction)是根据事物发展的历史资料及当前情况,运用一定的理论和方法,对未来趋势做出的一种科学推测。再简单点,就像传说中或是童话里的占卜师一样,当你想知道将来的事情时,你需要告诉占卜师你的出生情况,他就能将你的一生预测出来。不同的是,他只能告诉你,你的一生是顺利或是不顺,或再详细点告诉你可能在哪段时间会发生不寻常的事情;而我们所说的预测技术却可以详细到周,甚至详细到天。当然,这里还有个本质的区别,那就是我们这里说的预测是有科学基础的,而占卜师的预测只是常常出现在童话里或者传说中罢了。

预测技术的应用主要针对未来的趋势,即是经常讲的趋势预测?这里我们也来个“顾名思义”。“趋势”一词在词典里的解释是“事物发展的动向”,也就是会呈现出某种规律。简单点,某一事物未来是好是坏,是多是少,是升是降,或者先好后坏,先多后少,先升后降等等,也就是对未来进行预测。再用上面的例子来说明,小李急切地想知道自己的未来,并求助于占卜师,而占卜师则预测到他在40岁时会有场灾祸,那么恐怕小李紧接着要问的就是“我该怎样做才能化解我的灾祸”。趋势预测就是要解决类似的问题。预测并不是最终目的,而是一种手段,当预测到的趋势不符合规定的标准时,就应当及时采取措施来进行调整或缓解,这也是趋势预测的目标之一,通过分析预测的结果,揭发它的发展趋势,从而使得人们能够尽早地发现问题,或得到一个科学论断和标准。现在从童话回到现实中来。在软件领域,缺陷的趋势预测是预测技术应用较为广泛的领域之一,它是利用统计的手段来预测产品或解决方案中的遗留缺陷、测试阶段的单位时间内应当查出的缺陷等,因此对软件质量的提高和测试阶段的管理起着重要作用。

在软件领域中,一条重要的原则就是“do it right the first time”。这条原则告诉软件行业的工作人员:应当在第一次就将事情做对。然而实际中的情况是,软件开发完成后总还是存在缺陷,所以才需要测试,才需要品质保证;考虑业务的复杂性、开发工具的更新、需求的不稳定性、开发人员的能力经验欠缺等因素,几乎不能在第一次就将事情完全的做对,取而代之的是不断的验证、测试、修改再确认,才能最终确保软件产品或服务的正确性。然而有一件事可以确定,某个软件系统中的缺陷数目应当是一定的,随着软件系统生命周期的推进,发现的缺陷数应当由少到多,再从多到少并趋近于零。那么,如果无法做到“第一次将事情做对”,也要“尽早将事情做对”,在缺陷可能带来巨大的风险之前,就将它“扼杀在摇篮里”。如果没有预测,不知道未来趋势,也就无法判断当前处于怎样的状态下,更无法知道,在当前阶段,是不是已经有缺陷遗留到了下一阶段。这一点其实很容易理解,本来需要在2周内每天完成30项任务,但第一周只完成了10项,那接下来的一周内就需要加班加点完成剩下的50项任务;如果未能完成,那就可能导致无法交付任务,带来足以让你后悔的结果。

时间序列预测是预测技术中最常见的一种。时间序列是指由同一现象在不同时间上的相继观察值排列而成的数列,形式上由现象经历的时间和现象在不同时间上的观察值两部分组成。时间序列可以分为平稳的时间序列和非平稳的时间序列两种。平稳的时间序列是指基本上不存在趋势的序列;非平稳的时间序列指的是存在趋势的序列。

平稳序列的分析和预测的方法主要有3种,分别为:简单平均法;移动平均法;指数平滑法:

  • 在简单平均法中,t+1期的预测值等于前t期的预测值的平均值,它适用于较平稳的序列,将远期的数据与近期的数据看作对未来同等重要,但现实生活中,往往是近期的数据更加重要。所以,简单平均法的预测结果不够准确。
  • 移动平均法是对简单平均法的改进,通过对时间序列利用“逐期递移”的方式求得一系列平均数作为趋势值或预测值。它的关键在于选择合适的移动步长。简单的移动平均法将每一个值都赋予了相同的权值,也可以使用加权的移动平均法,权值之和为1。
  • 指数平滑法是加权移动平均的一种特殊形式,表现为观察值的时间离现在的时间越远,其权数就会呈现指数的下降。
    非平稳的、不存在趋势的序列的预测方法有2种:线性的趋势预测和非线性的趋势预测:
    线性趋势是指现象随时间的推移而呈现出稳定增长或下降的线性变化规律。它的预测方式是根据最小二乘法原理,使实际观察值与预测值的离差平方和最小。
  • 非线性趋势是指现象的发展趋势符合非线性曲线的变化规律,如二次曲线、指数曲线(修正指数曲线)、S型增长曲线等等。它的预测方式有最小二乘法、三和法、三点法等。

成长曲线

终于要介绍到预测方法啦。有了前面两篇文章的基础,大家应该都对预测有了认识。还是那句话,知道了要做什么,接下来就该想要“怎么做”。明白了预测的重要性,那就该去想想,怎么去预测?不过别心急,我们一步一步来,这篇文章会介绍预测工具的基础知识——成长曲线。

什么是成长曲线?成长曲线就是描绘观测样本从初始阶段不断发展壮大所经历的全部过程的曲线。在软件领域的成长曲线的过程中,要观测的样本值会经历萌芽、发展、稳定等阶段。成长曲线在很多方面都有应用,比如在报纸上、经济类刊物上常常能看到的经济成长曲线、品牌成长曲线;再比如细心的妈妈都会把宝宝出生后的成长情况记录下来,绘成儿童成长曲线等等。

在软件领域中同样有成长曲线,软件领域中的成长曲线反映了软件系统中的要观测的某个属性随着各种因素(如时间、成本等)变化发展的情况。成长曲线可以拟合事物发展的趋势,曲线拟合(Curve fitting)就是用连续曲线近似地刻画或比拟平面上离散的点表示的坐标之间的函数关系的一种数据处理方法。在数值分析中,曲线拟合就是用解析表达式逼近离散数据,即离散数据的公式化,就是选择适当的曲线类型来拟合观测数据,并用拟合的曲线方程分析两变量间的关系。

接着回到软件领域中的成长曲线上。对于一个系统来说,进入开发阶段后,开发人员每天都要完成一定量的代码行,而代码行的总数在项目计划阶段就应当是估算好的,那么,开发人员应当按照怎样的速度完成这些代码;已经完成了一部分代码后,能否判断出这样的速度是否合理、能否按期完成任务;前期完成过多代码可能会造成后期工作量太小,而前期完成太少代码又可能会带来后期的工作繁重。也许这时,你就会迫切需要一个工具来对开发人员的工作进行监控。进入测试阶段也是一样。所以这里提到的软件领域中的成长曲线的预测,就是针对软件的开发阶段和测试阶段的。再以测试为例,成长曲线能够反映缺陷从最初的测试出的缺陷较少,到中期不断发展增多,再到最终测出的缺陷数稳定不变的全部过程。成长曲线应当是连续的,它能够表示一段时间内事物持续发展的情况,能够表示事物在一个持续的时间段内发展的全过程。

成长曲线有很多种形式。常见的线性曲线也可以看作是成长曲线的一种,只是在现实中,线性曲线的使用不如非线性曲线广泛。下面将几种常见的成长曲线归纳介绍,希望对大家的理解有所帮助。

1. Rayleigh模型

Rayleigh模型是Weibull分布的一种特殊形式,是一种常用的模型。Weibull分布最重要的一个特征是它的概率密度函数的尾部逐渐逼近0,但永远达不到0,在许多工程领域都使用了很多年。Rayleigh模型既可以对软件开发全生命周期进行预测,也可以仅对测试阶段的缺陷分布进行预测,得到所期望的时间间隔t与所发现缺陷的关系。对于成熟的组织,当项目周期、软件规模和缺陷密度已经确定时,就可以得到确定的缺陷分布曲线,并可以据此控制项目过程的缺陷率。如果项目进行中实际的缺陷值与预估的缺陷值有较大差别时,说明中间出现问题,需要加以控制。

1) Rayleigh模型的函数形式

Rayleigh模型的累积分布函数(CDF):F(t)=K*(1-exp^(-(t/c)^2));

Rayleigh模型的概率密度函数(PDF):f(t)=2*K*t/(c^2)*( exp^(-(t/c)^2))。

上面两个函数中,t是时间自变量,c是一个常量(c=2^(1/2)tm,tm是f(t)到达峰值对应的时间),K是曲线与坐标形成的面积(总缺陷数),也是我们要估计的参数。多年的预测经验得到缺陷在tm时间的比率(F(tm)/K)约等于0.4,即在f(t)到达最大值时,已出现的缺陷大约占总缺陷的40%。按照这个推导,在某一时间就可以估算出总的缺陷数以及具体的Rayleigh分布参数,从而将缺陷的计算过程简化。

2) Rayleigh函数对应的图

图1 Rayleigh模型的CDF图

图2 Rayleigh模型的PDF图

由图1——CDF图可以看出,累积密度最终趋近一个最大值(K);由图2——PDF图可以看出,缺陷随时间逐渐降低最终趋向于0。

3) 使用Rayleigh曲线来建模软件开发质量涉及两个假设:

在开发过程中观察到的缺陷率与应用中的缺陷率成正比关系。对应于图1来说,也就是如果开发过程中观测到的缺陷率越高,CDF中图的幅度越高,K值越大;

给定同样的错误植入率,假如更多的缺陷被发现并更早将其移出,那么在后期阶段遗留的缺陷就更少,应用领域的质量就更好。对应于图2来说,曲线与X、Y轴围成区域的面积是一定的(总的缺陷数是确定的),如果在前期移除较多缺陷,即曲线的峰值点前移,那么后期曲线的面积就会小,代表后期遗留的缺陷数减少。

4) 使用场景:收集数据应当越早越好;且需要持续的追踪缺陷数。

5) 优势:随时间信息的缺陷密度可预测,因此在测试阶段使得找到并验证缺陷的估计成为可能。

6) Rayleigh模型没有考虑到变化调整的机制,所以可能会影响到缺陷的预测。

2. 指数模型

指数模型是针对测试阶段,尤其是验收类测试阶段的缺陷分布的模型,其基本原理是在这个阶段出现的缺陷(或者失效模式,我们这里讨论的是缺陷)是整个产品可靠性的良好指证。它是Weibull系列的另一个特例。指数模型是许多其他可靠性增长模型的基础。指数模型可分为故障/失效计数模型(fault/failure count model)和失效间隔时间模型(time between failures model)。基本的指数模型的累积缺陷分布函数(CDF)为y=K*a*b^t,修正指数模型在基本指数模型曲线函数上加一个常数因子。

1) 指数模型的函数形式

指数模型的累积缺陷分布函数(CDF):F(t)=K*(1-exp(-λ*t));

指数模型的缺陷概率密度函数(PDF):f(t)=K*(λ*exp(-λ*t))。

其中,t是时间,K是总缺陷数,λ与K是需要估计的两个参数。

2) 指数模型对应的函数图

图3 指数模型的CDF图

图4 指数模型的PDF图

2) 指数模型的关键假设:测试工作量在测试阶段中是均匀的。

3) 使用:指数模型预测缺陷时是基于正式的测试阶段的数据的,因此它主要适用于这些阶段,最好在开发过程后期——例如最后的测试阶段。但在交付用户使用后,用户发现的缺陷模型,与交付用户之前的模型往往有很大差别,这是由于交付客户后影响客户的测试的不确定因素更多。

4) 优势:最简单最有用的模型之一,易于使用和实现。

5) 缺陷:假设测试的工作量在整个测试阶段是均匀的。

3. NHPP模型(非齐次泊松过程模型)

NHPP模型是对在给定间隔内观察到的故障数建模,它是指数模型的一个直接应用。

1) NHPP模型的函数形式:其中,参数的含义与指数模型相同

NHPP模型的累积缺陷分布函数(CDF):F(t)=K*(1-exp(-λ*t));

NHPP模型的缺陷概率密度函数(PDF):f(t)=K*λ*c^(-λ*t)。

2) NHPP模型对应的函数图:见指数模型

3) 由于NHPP模型是指数模型的应用,所以NHPP 模型的特征与指数模型的特征相同。

4) 缺陷:大多数NHPP模型都基于这样的假设:每个缺陷的严重性和被监测到的可能性相同,在排除一个缺陷时不引入另一个新的缺陷,但实际情况并非如此。缺陷之间是存在着关联关系的。

4. S型可靠性增长模型

S型增长模型是软件领域应用较为广泛的模型之一,下一篇,将会详细进行介绍。

S型增长曲线

介绍完成长曲线,这回介绍S型曲线。S型也叫做S型增长曲线,它是成长曲线的一种特殊形式,因此也具有成长曲线的基本特征。S型模型的概念来源于种群增长。种群在一个有限的环境中增长,随着种群密度的上升,个体对有限的空间、食物和其他生活条件的种内竞争加剧,必然影响到种群的出生率和死亡率,从而降低种群的实际增长率,直到停止生长,甚至使种群数量下降。这种增长方式用图表示出来就会呈“S”型。

S型增长模型是现在软件领域及其它许多领域中应用的更为普遍的模型,它之所以能够广泛应用,在于S型增长模型包括了增长过程的两个阶段:发展前期增长快速的阶段,以及受到一定的限制或规律导致增长缓慢的阶段。

  • S型增长模型的特点:
    • S型曲线会趋近一条渐近线(K值),即“S”型增长曲线渐近于K值,但不会超过K值。
    • 曲线的变化是逐渐的、平滑的,而不是骤然的。
    • S型曲线上,曲线最大值趋近K,增长率不断下降直至为零。
  • S型曲线也可以被划分为五个时期:开始期;加速期;转折期;减速期;饱和期
  • 优势:适用于较大型的具有较多缺陷的项目
  • 缺陷:较为复杂,且很难跨项目使用。
  • S型可靠性增长模型对应的函数图

图1 S曲线的CDF图

图2 S曲线的PDF图

S曲线的两个重要模型:Gompertz模型和Logistic模型

  • Gompertz模型
    Gompertz曲线函数:yt=K*a^(b^t)(K>0),其中,yt是预测值,t表示时间,a,b,K为模型参数,预测关键是确定a,b,K的值。
  • Logistic模型
    Logistic曲线函数:yt=K/(1+a*exp(-b*t))(K>0)(或yt=1/(K+a*b^t)(K>0)),参数含义同Gompertz模型,预测关键是确定a,b,k的值。

S型可靠性增长模型还有2种特殊形式:

1. Delay-S型可靠性增长模型

Delay-S型可靠性增长模型也叫做延迟S型可靠性增长模型。

对于软件缺陷移除过程,测试过程应当不仅包括缺陷检测过程,还包括一个缺陷隔离过程。由于故障分析需要一定的时间,这个时间应当不是可以忽略不计的,在观察到的第一个故障时间和报告时间之间有很大的延迟。随时间观测到的延迟缺陷累计数符合S曲线分布,这种情况称为延迟S型曲线模型。

  • Delay-S型可靠性增长模型的函数形式
    • Delay-S的累积缺陷分布函数(CDF):F(t)=K*(1-(1+λ*t)exp(-λ*t));
    • Delay-S的缺陷概率密度函数(PDF):f(t)=K*(λ^2)*t*exp(-λ*t);
    • 其中,t是时间,K是总缺陷数或者累积缺陷率。
  • Delay-S型可靠性增长模型对应的函数图

图3 Delay-S型曲线的CDF图

图4 Delay-S型曲线的PDF图

2. Inflection-S型可靠性增长模型

Inflection-S型可靠性增长模型也叫做变形S型可靠性增长模型。

变形S型可靠性增长模型用检测到的缺陷之间的相互依赖性描述了软件故障检测现象。具体来说,检测到的故障越多,就有更多没有检测到的缺陷变得可以检测。这个模型讨论了缺陷之间的相互关系,可能与实际情况更接近。

  • Inflection-S型可靠性增长模型的函数形式
    • Inflection-S的累积缺陷分布函数(CDF):F(t)=K*(1-exp(-λ*t))/(1+Φ*exp(-λ*t));
    • Inflection-S的缺陷概率密度函数(PDF):f(t)=K*λ*exp(-λ*t)*(1+Φ)/(1+Φ*exp(-λ*t))^2;
    • 其中,t是时间,K是总缺陷数或者累积缺陷率。
  • Inflection-S型可靠性增长模型的曲线形式与普通S型曲线增长模型相似。

拟合度判断

在上一篇里,已经介绍了如何选择曲线模型,这一篇里,将会介绍怎样预测出该模型下符合实际数据的曲线,选择合适的模型。(模型的拟合算法将单独介绍)

给定一组实际数据,要让你预测出今后的一段时间,该数据的发展趋势,很多情况下,你并不能一下子就找到符合这组数据发展趋势的模型。而实际上,又有太多模型可以选择,每一个模型都会得到一个不同的发展趋势。好比买衣服,琳琅满目、各式各样,可是,到底哪一件适合你要出席的场合呢?所以,到底是指数合适,还是Gompertz合适,又或者是Logistic合适呢?

这个时候,就迫切的需要一个评判的标准,这种标准称为拟合度。拟合度的评价也有几种方法,本文列出了几种常用的拟合度判断方法,并对这几种方法进行总结、对比。

·利用相关系数R2来进行拟合度判断

相关系数R2是一种常见的拟合度的判断方法,常用于判断线性曲线的拟合度,然而在许多非线性曲线的拟合度判定过程中使用的依然是判断R2的方法,这个判断标准在实践中也被证明是符合实际的。实际中,R2较大的曲线模型,往往也是拟合较好的模型。

    • 计算残差平方和Q=∑(y-y*)^2,其中,y代表的是实测值,y*代表的是预测值
    • 计算相关系数R2=1-Q/∑(y-ya)^2,其中,y代表的是实测值,ya代表的是实测值的平均数
    • 判断方式:R2越大、越接近1,认为拟合度越好

·利用变换的R2来进行拟合度判断——以Gompertz曲线和Logistic曲线为例

Gompertz曲线和Logistic曲线的预测过程(无论是三点法还是三和法)首先都需将模型的函数进行变换(对Gompertz模型进行对数变换,对Logistic模型进行倒数变换),然后再运用三和法或者三点法的原理进行计算。所以这里提出一种运用变换的相关系数R2来进行拟合度判断。

  • Gompertz曲线
    • 分别将实测值和预测值进行对数变换
    • 将对数变换后的实测值记作y,将对数变换后的预测值记作y*
    • 根据相关系数的计算方法,计算变换后的残差平方和Q和相关系数R2
  • Logistic曲线
    • 分别将实测值和预测值进行求倒数变换
    • 将求倒变换后的实测值记作y,将求倒变换后的预测值记作y*
    • 根据相关系数的计算方法,计算变换后的残差平方和Q和相关系数R2

·利用实测数据与拟合数据来进行拟合度判断

由于R2是用于判断线性模型的拟合程度的,对于非线性曲线,似乎不具有什么理论上的支持,所以,出现了许多针对非线性曲线进行的拟合度判定。下面的方法是其中的一种。

  • 同样,计算残差平方和Q=∑(y-y*)^2和∑y^2,其中,y代表的是实测值,y*代表的是预测值
  • 计算新的拟合度指标RNew=1-(Q/∑y^2)^(1/2)
  • 判断方式:RNew越接近1,认为拟合度越好

·利用余弦函数进行辅助判断

从上一种方法中可以看出,在参数个数相同的前提下,拟合值越接近实测值,则认为拟合得越好。由此出现了根据几何意义得到的方法:若把实测值和预测值视为N维空间中的向量,若它们之间的夹角Θ越小,则可以认为拟合得越好。这里,计算角余弦系数FR=cosΘ=∑(yy*)/((∑y^2)^(1/2)* (∑y*^2)^(1/2))。

经实验证明,RNew的分辨率和灵敏度都较高,计算简单。实际中,可先用FR初选,再用RNew精选,可能会得到较好的结果。

平均绝对偏差、平均平方误差、平均预测误差和平均绝对百分误差

下面将介绍平均绝对偏差、平均平方误差、平均预测误差和平均绝对百分误差这四个评价指标。下面各指标中,At表示时段t的实际值,Ft表示时段t的预测值,n是整个预测期内的时段个数(或预测次数)。

·平均绝对偏差MAD:Mean Absolute Deviation

平均绝对偏差就是整个预测期内每一次预测值与实际值的绝对偏差(不分正负,只考虑偏差量)的平均值。

公式:MAD=(∑|At-Ft|)/n,t=1…n

MAD与标准偏差类似,但更容易求得。MAD能较好地反映预测的精度,但它不容易衡量无偏性。

·平均平方误差MSE:Mean Square Error

公式:MSE=(∑At-Ft)^2/n,t=1…n

MSE与MAD相似,可以较好的反映精度,但无法衡量无偏性。

·平均预测误差MFE:Mean Forecast Error

平均预测误差是指预测误差的和的平均值。

公式:MFE=(∑(At-Ft))/n,t=1…n

其中,∑(At-Ft),t=1…n被称作预测误差滚动和RSFE(Running Sum of Forecast Errors)。如果预测模型是无偏的,RSFE应该接近于0,即MFE应接近于0。因此MFE能很好的衡量预测模型的无偏性,但它不能反映预测值偏离实际的程度。

·平均绝对百分误差MAPE(Mean Absolute Percentage Error)

公式:MAPE=(∑|(At-Ft)/At|)/n,t=1…n

一般认为MAPE小于10时,预测精度较高。

MAD、MFE、MSE和MAPE是几种常用的衡量预测误差的指标,但单一的指标很难全面地评价一个预测模型,在实际中可以将它们结合起来使用,选择较为合适的模型。

经公司内部项目数据的实验证明,这几种拟合度的判断方法得到的结果是相互印证的,某一个模型计算得到的几种拟合度的趋势往往是相同的,这样可以辅助我们去判断选择较为合适的模型。但记住这样一句话:“所有的模型都是错的”。任何一个模型都有自己的局限性和假设要求,没有一个模型能够被证明是现实数据的真实反映。模型只是用来帮助我们解决问题的一种工具,可靠性增长模型也不例外。选择模型前,考虑实际使用中可能出现的现象,多问自己几个问题,多去寻找一些答案,而不是仅仅依靠拟合度的计算,以此来有效的构建合适的模型。

下表是几种拟合度指标的使用场景。

最后要说的还是那句话:所有的模型都是错的。依靠拟合度并不是目的,更不是真理,在选择模型前,多问自己几个问题,您的经验和知识,同样是选择时的重要手段哦。

拟合度指标
 
使用场景
 
R2
 
对线性曲线,R2能反映出拟合的好坏,对非线性曲线,实际也能得到较符合的结果,简便计算时可使用
 
变形R2
 
比R2更有理论说服力,拟合趋势与R2相近。但对某些情况可能无法进行计算,比如实测数据中出现0时,无法计算对数值和倒数值
 
RNL
 
判断非线性曲线拟合度时更有理论基础,试验证明其分辨率和灵敏度都较高,可在细选模型时使用
 
FR
 
实践应用时,先用FR(放大镜)初选,再用分辨率和灵敏度高的RNL(显微镜)精选,会得到较好的结果
 
MAD
 
能较好地反映预测的精度,但不容易衡量无偏性。MAD容易求得,要求计算简单时可使用,可配合MFE、MAPE使用
 
MFE
 
能很好的衡量预测模型的无偏性,但它不能反映预测值偏离实际的程度,可配合MAPE使用
 
MSE
 
与MAD相似,可以较好的反映精度,但无法衡量无偏性,可配合MFE、MAPE使用
 
MAPE
 
能很好的衡量预测模型的无偏性,可配合MAD或MSE使用
 
MAD+ MFE+ MSE+ MAPE
 
MAD、MFE、MSE和MAPE是几种常用的衡量预测误差的指标,但任何单一的一种指标都很难全面地评价一个预测模型,在实际中可以将它们结合使用,根据选择的要求,需要精度较高的或偏离较低的模型,以此选择较为合适的模型。

S型曲线K值的分析

这篇文章将会介绍到对S型曲线的渐近值K值的分析。在之前介绍S型曲线的文章中(地址为:http://fispi.blog.ccidnet.com/blog-htm-do-showone-uid-354725-type-blog-itemid-5313963.html),已经对K值进行了介绍:S型曲线会趋近一条渐近线(K值),即“S”型增长曲线的最大值会接近K,但不会超过K;增长率会不断下降直至为零。以软件缺陷预测为例,有了K值,我们就能得到该软件系统最终应当发现的缺陷数目。这样在发布软件之前,根据已经检测到的缺陷的数目,就可以得到还有多少个缺陷未被发现。因此,为我们是否可以发布这个软件、或者说我们发布这个软件的原因提供了依据。

大家都明白渐近线的含义,K值就相当于渐近线。那还有什么可讨论的呢?实践证明,在缺陷预测时,用9个实际数据预测得到的曲线,与用15个实际数据预测得到的曲线并不相同,它们的趋近值,即K值也不相同。那么,到底哪个模型更为拟合?已经有了9个数据时预测得到的模型,是否还需要用更多的数据去重新预测呢?那如果有了20个实际数据,是否还有必要用25个实际数据重新预测呢?

在曲线预测中,预测的结果使得我们能够得到曲线在每个时间的分布情况以及曲线最终的逼近情况。所以,对渐近值K的预测是我们预测的目的之一。

从上述曲线模型的预测过程中可以看出,预测的结果是最终会得到一个K值。如果使用不同数目的样本数据进行预测能够得到相同的K值,那么就说明K值是稳定的。但在实际项目中,多次实验得到的结果却是K的值并不是唯一不变的,它也是一个随时间趋势、遵循一定的规律不断发展变化的值。

那么,K值会如何变化呢?下面是我们针对这个问题,在实际项目中所作的实验。

  • 将预测出的数值用同样的预测方法重新预测,比较将预测值用作样本值进行预测得到的结果与之前的预测值之间的差别
    • 结果:两次结果并不相同,但差别很小,K值的接近度近似于100%
  • 针对三点法进行实验。普通三点法所取三点分别为起点、中点和“终点”,三点之间相距分别为M;通过比较所取的三点若稍有差别时得到的结果来分析K值,所以取三点分别为第二点、中点的后一点和“终点”(或者是类似的取法),它们之间同样相距分别为M(这里是对Gompertz曲线和Logistic曲线做的实验)
    • 结果:两次结果也并不完全相同,但差别同样很小,K值的接近度近似于99%

上面这两个实验虽然得到了相近的结果,看起来几次实验K值也是接近的,但并不能得到K值是稳定的这一结论,要想对K值稳定度进行分析,还需要继续针对K值进行不同的实验来分析研究,或利用大量数据进行验证。

·预测监控

预测的一个十分重要的理论基础是:一定形式的需求模式过去、现在和将来都起着基本相同的作用,即过去起作用的模型现在依然是有效的,那么如何来判断实际情况呢,这就需要进行预测监控。

检验预测模型是否仍然有效的一个简单方法是将最近的实际值与预测值进行比较,看偏差是否在可以接受的范围之内,另一种方法是应用跟踪信号(Tracking Signal,TS)。

所谓跟踪信号,是指预测误差滚动和与平均绝对误差的比值,公式为:

TS=RSFE/MAD=∑(At-Ft)/MAD

各符号的含义见上篇文章。每当有实际需求发生时,就应当计算TS。如果预测模型仍然有效,TS应该比较接近于0。只有TS在一定范围内(设定上下限),才认为预测模型可以继续使用,否则,就应该重新选择模型,如图1。

图1 TS范围

图1中,两条红色的线代表的是TS的上下限范围,黑色曲线代表的是TS,TS不断变化,但只有在上下限的范围之内的TS才可以看作是有效的,可以继续使用,否则,TS不再有效,不应继续使用。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织