nmc_verification

提供气象产品检验相关python程序


数值型检验指标

<pre><code class="language-python">%matplotlib inline %load_ext autoreload %autoreload 2 from nmc_verification.nmc_vf_method.yes_or_no.score import * import numpy as np</code></pre> <p>一分为二的预测说:“是的,将会发生一个事件”,或者“否,该事件不会发生”。雨雾预报是是/否预报的常见示例。对于某些应用,可以指定阈值以分隔“是”和“否”,例如,风速大于50节。</p> <p>为了验证这种类型的预测,我们从列联表开始,该表显示“是”和“否”的预测和出现的频率(样本数)。预测(是或否)和观测值(是或否)的四种组合称为联合分布:</p> <pre><code> 命中-事件预测发生,并且确实发生了 漏报-事件预测未发生,但确实发生了 空报-发生事件预测,但未发生 正确的否定-事件预测不会发生,也不会发生</code></pre> <p>列联表的左下方给出了观测和预测的发生与未发生的总数,称为边际分布。<br /> <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/26088aa4bd45ea64a100e53282f8b1d1?showdoc=.jpg" alt="" /><br /> 以下结合随机生成的测试数据,说明基于上述列联表计算的各种检验指标 </p> <pre><code class="language-python">ob = np.random.randn(2,10) fo = np.random.randn(2,10) ob[ob &lt; 0] = 0 fo[fo &lt; 0] = 0 grade_list = [0.1,1]</code></pre> <pre><code class="language-python">ob</code></pre> <pre><code>array([[0.98368418, 0. , 0.47480065, 0. , 1.28063937, 0.82227535, 0. , 0. , 0.64093047, 0. ], [0.80266759, 0. , 0.34206325, 0. , 0. , 0.97544822, 0. , 0. , 0. , 0.35537368]])</code></pre> <pre><code class="language-python">fo</code></pre> <pre><code>array([[0.26011892, 0. , 0.4674834 , 0.74638433, 0.43821029, 0.71978586, 0. , 0.27610173, 0. , 0. ], [0. , 0. , 0. , 2.29050322, 0. , 0.38644295, 0.33322722, 0. , 0.61084585, 0.08912401]])</code></pre> <h3>命中、空报、漏报、正确否定</h3> <p><strong>hfmc(ob, fo, grade_list=None)</strong><br /> 用来计算常用二分类预报检验指标的中间统计量 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 长度为4的一维numpy数组,其内容依次为命中、空报、漏报、正确否定的样本数<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">hfmc_array = hfmc(ob,fo,grade_list) hfmc_array</code></pre> <pre><code>array([[ 5., 5., 4., 6.], [ 0., 1., 1., 18.]])</code></pre> <p>在上述示例中,hfmc返回结果是一个二维数组,最后一维长度为4,倒数第2维长度为2,和grade_list对应。返回结果hfmc_array将在后续示例中被应用。</p> <h3>观测发生率</h3> <p><strong>s(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算 base rate: Observed yes/Total</p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。 </p> <h3>观测发生率</h3> <p><strong>s_hfmc(hfmc_array)</strong><br /> 基于中间结果计算 base rate: Observed yes/Total,</p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">s(ob,fo) #grade_list缺省</code></pre> <pre><code>array([0.45])</code></pre> <pre><code class="language-python">s(ob,fo,grade_list) #包含grade_list阈值参数,可以同时用于多个阈值的检验</code></pre> <pre><code>array([0.45, 0.05])</code></pre> <pre><code class="language-python">s_hfmc(hfmc_array)</code></pre> <pre><code>array([0.45, 0.05])</code></pre> <h3>预报发生率</h3> <p><strong>r(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算 forecast rate: Forecast yes/Total</p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。 </p> <h3>预报发生率</h3> <p><strong>s_hfmc(hfmc_array)</strong><br /> 基于中间结果计算 forecast rate: Torecast yes/Total</p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">r(ob,fo)</code></pre> <pre><code>array([0.55])</code></pre> <pre><code class="language-python">r(ob,fo,grade_list)</code></pre> <pre><code>array([0.5 , 0.05])</code></pre> <pre><code class="language-python">r_hfmc(hfmc_array)</code></pre> <pre><code>array([0.5 , 0.05])</code></pre> <h3>准确率</h3> <p><strong>pc(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算accuracy: (Hits+ Correct negatives)/Total,反映被正确预报的样本占比</p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为1 </p> <h3>准确率</h3> <p><strong>pc_hfmc(hfmc_array)</strong><br /> 基于中间结果计算 accuracy: (Hits+ Correct negatives)/Total,反映被正确预报的样本占比</p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">pc(ob,fo)</code></pre> <pre><code>array([0.6])</code></pre> <pre><code class="language-python">pc(ob,fo,grade_list)</code></pre> <pre><code>array([0.55, 0.9 ])</code></pre> <pre><code class="language-python">pc_hfmc(hfmc_array)</code></pre> <pre><code>array([0.55, 0.9 ])</code></pre> <h3>命中率</h3> <p><strong>pod(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算hit rate: Hits/(Hits + Misses),反映观测的正样本中多少被预报 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为1 </p> <h3>命中率</h3> <p><strong>pod_hfmc(hfmc_array)</strong><br /> 基于中间结果计算hit rate:Hits/(Hits + Misses),反映观测的正样本中多少被预报 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">pod(ob,fo)</code></pre> <pre><code>array([0.66666667])</code></pre> <pre><code class="language-python">pod(ob,fo,grade_list)</code></pre> <pre><code>array([0.55555556, 0. ])</code></pre> <pre><code class="language-python">pod_hfmc(hfmc_array)</code></pre> <pre><code>array([0.55555556, 0. ])</code></pre> <h3>成功率</h3> <p><strong>sr(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算Success ratio : Hits/(Hits + False alarms),反映预报的正样本中实际发生的比例 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为1 </p> <h3>成功率</h3> <p><strong>sr_hfmc(hfmc_array)</strong><br /> 基于中间结果计算Success ratio : Hits/(Hits + False alarms),反映预报的正样本中实际发生的比例 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">sr(ob,fo)</code></pre> <pre><code>array([0.54545455])</code></pre> <pre><code class="language-python">sr(ob,fo,grade_list)</code></pre> <pre><code>array([0.5, 0. ])</code></pre> <pre><code class="language-python">sr_hfmc(hfmc_array)</code></pre> <pre><code>array([0.5, 0. ])</code></pre> <h3>报空率</h3> <p><strong>pofd(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算Probability of false detection: False alarms/(False alarms + Correct negatives),反映观测负样本被预报为正样本的比例 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为0 </p> <h3>报空率</h3> <p><strong>pofd_hfmc(hfmc_array)</strong><br /> 基于中间结果计算Probability of false detection: False alarms/(False alarms + Correct negatives),反映观测负样本被预报为正样本的比例 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为0<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">pofd(ob,fo)</code></pre> <pre><code>array([0.45454545])</code></pre> <pre><code class="language-python">pofd(ob,fo,grade_list)</code></pre> <pre><code>array([0.45454545, 0.05263158])</code></pre> <pre><code class="language-python">pofd_hfmc(hfmc_array)</code></pre> <pre><code>array([0.45454545, 0.05263158])</code></pre> <h3>空报率</h3> <p><strong>far(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算False alarm ratio: False alarms/(Hit + False alarms),反映预报的正样本中实际未发生的比例 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为0 </p> <h3>空报率</h3> <p><strong>far_hfmc(hfmc_array)</strong><br /> 基于中间结果计算False alarm ratio: False alarms/(Hit + False alarms),反映预报的正样本中实际未发生的比例 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为0<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">far(ob,fo)</code></pre> <pre><code>array([0.45454545])</code></pre> <pre><code class="language-python">far(ob,fo,grade_list)</code></pre> <pre><code>array([0.5, 1. ])</code></pre> <pre><code class="language-python">far_hfmc(hfmc_array)</code></pre> <pre><code>array([0.5, 1. ])</code></pre> <h3>漏报率</h3> <p><strong>mr(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算Miss ratio: Misses/(Hit + Misses),反映观测正样本被预报为负样本的比例 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为0 </p> <h3>漏报率</h3> <p><strong>mr_hfmc(hfmc_array)</strong><br /> 基于中间结果计算Miss ratio: Misses/(Hit + Misses),反映观测正样本被预报为负样本的比例 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为0<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">mr(ob,fo)</code></pre> <pre><code>array([0.33333333])</code></pre> <pre><code class="language-python">mr(ob,fo,grade_list)</code></pre> <pre><code>array([0.44444444, 1. ])</code></pre> <pre><code class="language-python">mr_hfmc(hfmc_array)</code></pre> <pre><code>array([0.44444444, 1. ])</code></pre> <h3>偏差</h3> <p><strong>bias(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算bias:(Hit + False alarms)/(Hit + Misses),反映预报的正样本数 和 观测的正样本数的比值 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到正无穷的实数,完美预报对应值为1 </p> <h3>偏差</h3> <p><strong>bias_hfmc(hfmc_array)</strong><br /> 基于中间结果计算bias:(Hit + False alarms)/(Hit + Misses),反映预报的正样本数 和 观测的正样本数的比值 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素值为0到正无穷的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">bias(ob,fo)</code></pre> <pre><code>array([1.22222222])</code></pre> <pre><code class="language-python">bias(ob,fo,grade_list)</code></pre> <pre><code>array([1.11111111, 1. ])</code></pre> <pre><code class="language-python">bias_hfmc(hfmc_array)</code></pre> <pre><code>array([1.11111111, 1. ])</code></pre> <h3>偏差幅度</h3> <p><strong>bias_extend_linear(bias_array)</strong><br /> 计算bias偏离1的幅度,采用 (bias - 1)的绝对值表示 </p> <p><strong>参数说明:</strong><br />  bias_array:任意维numpy数组,其中每个元素是bias值。<br />  return: 返回一个和bias_array的shape一致的numpy数组 </p> <h3>偏差幅度</h3> <p><strong>bias_extend_log(bias_array)</strong><br /> 计算bias偏离1的幅度,采用 log(bias)的绝对值表示 </p> <p><strong>参数说明:</strong><br />  bias_array:任意维numpy数组,其中每个元素是bias值。<br />  return: 返回一个和bias_array的shape一致的numpy数组<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">bias_array = bias(ob,fo,grade_list) bias_extend_linear(bias_array)</code></pre> <pre><code>array([0.11111111, 0. ])</code></pre> <pre><code class="language-python">bias_extend_log(bias_array)</code></pre> <pre><code>array([0.10536052, 0. ])</code></pre> <h3>TS评分</h3> <p><strong>ts(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算ts: Hit /(Hit + Misses+ False alarms),反映预测的正样本与观察到的正样本对应的程度如何 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为1 </p> <h3>TS评分</h3> <p><strong>ts_hfmc(hfmc_array)</strong><br /> 基于中间结果计算ts: Hit /(Hit + Misses+ False alarms),反映预测的正样本与观察到的正样本对应的程度如何 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。每个元素值为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">ts(ob,fo)</code></pre> <pre><code>array([0.42857143])</code></pre> <pre><code class="language-python">ts(ob,fo,grade_list)</code></pre> <pre><code>array([0.35714286, 0. ])</code></pre> <pre><code class="language-python">ts_hfmc(hfmc_array)</code></pre> <pre><code>array([0.35714286, 0. ])</code></pre> <h3>ETS评分</h3> <p><strong>ets(ob, fo,grade_list=[1e-30])</strong><br /> 基于原始数据计算ets: (Hit-Hit_random) /(Hit + Misses+ False alarms - Hit_random),反映预测的正样本与观察到的正样本对应的程度如何, 其中扣除了随机预报产生的命中数量,Hit_randwom = Forecast yes × Observed yes / Total </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  grade_list: 该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据<br />  return: 返回一个一维numpy数组,其包含的检验指标和grade_list中的阈值一一对应。每个元素值为0到1的实数,完美预报对应值为1 </p> <h3>ETS评分</h3> <p><strong>ets_hfmc(hfmc_array)</strong><br /> 基于中间结果计算ets: Hit /(Hit + Misses+ False alarms),反映预测的正样本与观察到的正样本对应的程度如何 </p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。每个元素值为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">ets(ob,fo)</code></pre> <pre><code>array([0.1160221])</code></pre> <pre><code class="language-python">ets(ob,fo,grade_list)</code></pre> <pre><code>array([ 0.05263158, -0.02564103])</code></pre> <pre><code class="language-python">ets_hfmc(hfmc_array)</code></pre> <pre><code>array([ 0.05263158, -0.02564103])</code></pre> <p>晴雨预报也是二分类预报,但由于降水观测存在T量概念,在业务检验中对T量降水样本的处理和普通的二分类预报有所不同。具体的检验列联表可以用下图表示:<br /> <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/9324d866d8b492d4f8fbd1ab7c3d0621?showdoc=.jpg" alt="" /><br /> 据此,晴雨预报的准确率计算公式也和普通的二分类检验的准确率有所差别,在本函数库中有针对性的增加概率晴雨准确率的计算模块,它包括直接计算函数和中间统计量计算函数。 </p> <h3>晴雨预报的命中、空报、漏报、正确否定</h3> <p><strong>hfmc_of_sun_rain((ob, fo)</strong><br /> 用来计算常用晴雨预报检验指标的中间统计量 </p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  return: 长度为4的一维numpy数组,其内容依次为根据晴雨(雪)检验评定表计算出的命中、空报、漏报、正确否定的样本数 </p> <h3>晴雨准确率</h3> <p><strong>pc_of_sun_rain(ob, fo)</strong><br /> 基于原始数据计算accuracy: (Hits+ Correct negatives)/Total,反映被正确预报的样本占比</p> <p><strong>参数说明:</strong><br />  Ob:实况数据,任意维numpy数组<br />  Fo:预测数据,任意维numpy数组,Fo.shape 和Ob.shape一致<br />  return: 0到1的实数,完美预报对应值为1 </p> <h3>晴雨准确率</h3> <p><strong>pc_of_sun_rain_hfmc(hfmc_array)</strong><br /> 基于中间结果计算 accuracy: (Hits+ Correct negatives)/Total,反映被正确预报的样本占比</p> <p><strong>参数说明:</strong><br />  hfmc_array:包含总样本数和正确样本数的多维数组,其中最后一维长度为4,分别包含命中、空报、漏报、正确否定的样本数,倒数第二维长度为阈值个数<br />  return: 返回一个多维numpy数组,其shape 和hfmc_array去掉最后一维之后的shape一致。最后一维长度为阈值个数。其中每个元素为0到1的实数,完美预报对应值为1<br /> <strong>调用示例:</strong> </p> <pre><code class="language-python">pc_of_sun_rain(ob,fo)</code></pre> <pre><code>0.55</code></pre> <pre><code class="language-python">hfmc_sr = hfmc_of_sun_rain(ob,fo) pc_of_sun_rain_hfmc(hfmc_sr)</code></pre> <pre><code>0.55</code></pre> <p>在以上示例中,观测和预报的数据规模较小,可以直接调用评分函数计算相应评分,然而有些情况下待检验的数据太大不能整体存入一个numpy数组中,或者不方便整体存入一个numpy数组中,就不能调用上面的方式调用评分函数, 此时可以采用本函数库中中间结果统计函数来实现分块计算或并行计算的方式来实现计算。其检验步骤如下:<br /> <strong><em>步骤1:根据需要将分块数据逐一输入到中间结果计算函数</em></strong><br /> <strong><em>步骤2:将中间结果进行累加或合并</em></strong><br /> <strong><em>步骤3:根据累加或合并的中间结果计算检验指标</em></strong><br /> 通常上述计算中步骤1是最耗费计算资源,为了提高效率步骤1也可以采用<strong>并行</strong>的方式执行。此外,步骤1执行的结果也可<strong>输出到文件</strong>中,在后续的检验可以从中读入部分中间结果执行后续步骤,从而可以实现各种方式的分组检验,大大提高检验计算效率。 同时,在预报检验经常需要进行分组检验,获得不同类别预报的评分指标并进行对比。此时可以应用上述基于中间结果的检验函数对多维中间统计量的整体计算能力来简化代码的复杂度。<br /> <strong>示例如下:</strong></p> <pre><code class="language-python">day_count = 100 model_count = 3 grade_list = [0.1,1] ob = np.random.randn(day_count,1000) fo = np.random.randn(model_count,day_count,1000) ob[ob &lt; 0] = 0 fo[fo &lt; 0] = 0 hfmc_array = np.zeros((model_count,len(grade_list),4)) hfmc_sr = np.zeros((model_count,4)) for i in range(day_count): ob1 = ob[i,:] for j in range(model_count): fo1 = fo[j,i,:] hfmc_array[j,:,:] += hfmc(ob1,fo1,grade_list) hfmc_sr[j,:] += hfmc_of_sun_rain(ob1,fo1)</code></pre> <pre><code class="language-python">pc_of_sun_rain_hfmc(hfmc_sr)</code></pre> <pre><code>array([0.52313, 0.5186 , 0.5209 ])</code></pre> <pre><code class="language-python">pc_hfmc(hfmc_array)</code></pre> <pre><code>array([[0.5046 , 0.73444], [0.50015, 0.73328], [0.50222, 0.73416]])</code></pre> <pre><code class="language-python">ts_hfmc(hfmc_array)</code></pre> <pre><code>array([[0.29891597, 0.08588345], [0.29550964, 0.08315287], [0.29795216, 0.08608361]])</code></pre> <pre><code class="language-python">bias_hfmc(hfmc_array)</code></pre> <pre><code>array([[0.99886755, 1.01263238], [1.00180757, 1.01033559], [1.00422492, 1.01556718]])</code></pre> <p>以上只是展示了分类检验的维度为1的情况,实际上上述思路可以扩展至任意高维的情况。熟练使用中间统计量计算和合并方法,基于中间统计量整体计算分类问题下的检验指标数组,是提高代码编写效果的关键。上述检验函数的内部也都采用了numpy的整体计算方式实现,在计算效率上进行了最大程度的优化。</p>

页面列表

ITEM_HTML