meteva

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


数值型检验指标

<p>[TOC]</p> <pre><code class="language-python">%matplotlib inline %load_ext autoreload %autoreload 2 import meteva.method as mem import numpy as np</code></pre> <p><strong><em>通过随机函数生成测试数据,用于后续检验函数调用示例</em></strong></p> <pre><code class="language-python">ob_p = np.random.rand(10,100) ob= np.zeros(ob_p.shape) ob[ob_p&amp;gt;0.5] = 1 #设定有一部分观测被确定为正例(1),一部分被确定为负例(0) error1 = np.abs(np.random.randn(5,10,100)) * 0.3 #在观测的基础上加上一个概率扰动构建概率预报 error0 = np.abs(np.random.randn(5,10,100)) * 0.3 error1[error1&amp;gt;1] = 1 error0[error0&amp;gt;1] = 1 fo = np.zeros((5,10,100)) + ob fo[fo==1] = 1 - error1[fo==1] #对于观测正例,概率预报在1左右 fo[fo==0] = error0[fo ==0] #对于观测负例,概率预报在0左右</code></pre> <pre><code class="language-python">mem.discrimination(ob,fo) #显示不同概率预报位于不同区间时观测的正例和负例数统计结果</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/8200e7f5909d74764e421141f5531e79?showdoc=.jpg" alt="" /></p> <h1>bs评分</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;bs(ob, fo)&lt;/font&gt;</strong><br /> 计算brier_score 评分</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;ob&lt;/font&gt;</strong></td> <td style="text-align: left;">实况数据, 任意维numpy数组,元素取值必须为0或者1</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;fo&lt;/font&gt;</strong></td> <td style="text-align: left;">fo比Ob.shape多一维或者保持一致,fo.shape低维与ob.shape保持一致,元素取值必须在区间[0,1]内</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">如果fo和ob的shape一致(即只有一种预报),返回结果为实数;如果fo比ob高出一维,则返回1维数组,长度等于预报成员数。元素0到1的实数,完美值为0</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.bs(ob,fo[0,:])</code></pre> <pre><code>0.0947734897233469</code></pre> <pre><code class="language-python">mem.bs(ob,fo)</code></pre> <pre><code>array([0.09477349, 0.09045114, 0.08758562, 0.08848226, 0.09198963])</code></pre> <h1>bss评分</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;bss(ob, fo)&lt;/font&gt;</strong><br /> 计算Brier skill score 评分, 它是实际预报bs相对预报随机预报bs评分的技巧。</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;ob&lt;/font&gt;</strong></td> <td style="text-align: left;">实况数据, 任意维numpy数组,元素取值必须为0或者1</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;fo&lt;/font&gt;</strong></td> <td style="text-align: left;">fo比Ob.shape多一维或者保持一致,fo.shape低维与ob.shape保持一致,元素取值必须在区间[0,1]内</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">如果fo和ob的shape一致(即只有一种预报),返回结果为实数;如果fo比ob高出一维,则返回1维数组,长度等于预报成员数。元素负无穷到1的实数,完美值为1</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.bss(ob,fo[0,:])</code></pre> <pre><code>0.6199559309339472</code></pre> <pre><code class="language-python">mem.bss(ob,fo)</code></pre> <pre><code>array([0.61995593, 0.63728865, 0.64877945, 0.64518392, 0.63111927])</code></pre> <h1>roc面积</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;roc_auc(ob, fo)&lt;/font&gt;</strong><br /> 计算roc图中 roc曲线以下部分的面积。</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;ob&lt;/font&gt;</strong></td> <td style="text-align: left;">实况数据, 任意维numpy数组,元素取值必须为0或者1</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;fo&lt;/font&gt;</strong></td> <td style="text-align: left;">fo比Ob.shape多一维或者保持一致,fo.shape低维与ob.shape保持一致,元素取值必须在区间[0,1]内</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">如果fo和ob的shape一致(即只有一种预报),返回结果为实数;如果fo比ob高出一维,则返回1维数组,长度等于预报成员数。元素 0 到 1的实数,完美值为1,小于或等于0.5代表没有预报技巧</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.roc_auc(ob,fo[0,:])</code></pre> <pre><code>0.9567919799498747</code></pre> <pre><code class="language-python">mem.roc_auc(ob,fo)</code></pre> <pre><code>array([0.95679198, 0.96264662, 0.96702957, 0.96417444, 0.96267469])</code></pre> <p>在以上示例中,观测和预报的数据都直接输入到评分函数中进行计算,然而有些情况下待检验的数据太大不能整体存入一个numpy数组中,或者不方便整体存入一个numpy数组中,此时就不能调用上面的方式调用评分函数。为此本程序库设计了一套可分块计算的检验程序。 其检验步骤如下: 步骤1:根据需要将分块数据逐一输入到中间结果计算函数 步骤2:将中间结果进行累加或合并 步骤3:根据累加或合并的中间结果计算检验指标 通常上述计算中步骤1是最耗费计算资源,为了提高效率步骤1也可以采用并行的方式执行。此外,步骤1执行的结果也可输出到文件中,在后续的检验可以从中读入部分中间结果执行后续步骤,从而可以实现各种方式的分组检验,大大提高检验计算效率。<br /> 另外,在预报检验经常需要进行分组检验,获得不同类别预报的评分指标并进行对比。此时可以应用上述基于中间结果的检验函数对多维中间统计量的整体计算能力来简化代码的复杂度。</p> <h1>总样本数、误差总和、观测平均、观测方差</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems(ob, fo)&lt;/font&gt;</strong><br /> 用来计算bs,bss等检验指标的中间量 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;ob&lt;/font&gt;</strong></td> <td style="text-align: left;">实况数据, 任意维numpy数组,元素取值必须为0或者1</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;fo&lt;/font&gt;</strong></td> <td style="text-align: left;">fo比Ob.shape多一维或者保持一致,fo.shape低维与ob.shape保持一致,元素取值必须在区间[0,1]内</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">如果fo和ob的shape一致(即只有一种预报),返回结果为一维数组,长度为4,;如果fo比ob高出一维,则返回2维数组,shape= (预报成员数,4),最后一维内容依次为总样本数、误差总和、观测的平均值、观测的方差</td> </tr> </tbody> </table> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems逐一合并函数&lt;/font&gt;</strong><br /> <strong>tems_merge(tems_array0,tems_array1)</strong><br /> 用来将tems计算得到的分块中间统计量进行合并,得到两块数据并集对应的统计量 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems_array0&lt;/font&gt;</strong></td> <td style="text-align: left;">最后一维长度为4的多维数组,分别记录了(总样本数、误差总和、观测的平均值、观测的方差)</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems_array1&lt;/font&gt;</strong></td> <td style="text-align: left;">形式和含义同tems_array0</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">形式和含义同tems_array0</td> </tr> </tbody> </table> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems整体合并函数&lt;/font&gt;</strong><br /> <strong>tems_merge_all(tems_array)</strong><br /> 如果有大量的分块中间量tems需要合并,采用tems_merge进行逐一合并的速度还是不够,此时可以采用tems_merge_all来进行合并,效率可以大大提高。但是tems_merge_all输入输入tems_array只能是2维。</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems_array&lt;/font&gt;</strong></td> <td style="text-align: left;">2维numpy数组,第一维代表不同分块,第2维长度为4的多维数组,分别记录了(总样本数、误差总和、观测的平均值、观测的方差)</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">合并后的中间统计量,是一个包含(总样本数、误差总和、观测的平均值、观测的方差)的一维数组</td> </tr> </tbody> </table> <p><strong>调用示例</strong> </p> <pre><code class="language-python">model_count = 5 day_count = 10 tems_list = [] tems_array = np.zeros((model_count,4)) grade_count = 10 hnh_array = np.zeros((model_count,grade_count,2)) for i in range(day_count): ob1 = ob[i,:] fo1 = fo[:,i,:] hnh_array += mem.hnh(ob1,fo1,grade_count) #计算并累加区分能力表,函数见probablility.plot.hnh模块 tems1 = mem.tems(ob1,fo1) tems_array= mem.tems_merge(tems_array,tems1) tems2 = mem.tems(ob1,fo[0,i,:]) #单个模式的中间量 tems_list.append(tems2) </code></pre> <pre><code class="language-python">print(tems_array) #逐日合并的得到的中间结果,同时包含5个模式</code></pre> <pre><code>[[1.00000000e+03 9.47734897e+01 5.25000000e-01 2.49375000e-01] [1.00000000e+03 9.04511422e+01 5.25000000e-01 2.49375000e-01] [1.00000000e+03 8.75856236e+01 5.25000000e-01 2.49375000e-01] [1.00000000e+03 8.84822596e+01 5.25000000e-01 2.49375000e-01] [1.00000000e+03 9.19896314e+01 5.25000000e-01 2.49375000e-01]]</code></pre> <pre><code class="language-python">#整体合并的中间量(总样本数、误差总和、观测的平均值、观测的方差)结果,只能合并一个模式 tems_test = mem.tems_merge_all(np.array(tems_list)) tems_test</code></pre> <pre><code>array([1.00000000e+03, 9.47734897e+01, 5.25000000e-01, 2.49375000e-01])</code></pre> <h1>bs评分-并行</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;bs_tems(tems_array)&lt;/font&gt;</strong><br /> 计算brier_score 评分</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems_array&lt;/font&gt;</strong></td> <td style="text-align: left;">最后一维长度为4的多维数组,分别记录了(总样本数、误差总和、观测的平均值、观测的方差),它通常是tems函数的返回结果或结果的累加</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">整数或数组,它比tase_array少了最后一维。 其中每个元素为 0到1的实数,完美值为0</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.bs_tems(tems_array)</code></pre> <pre><code>array([0.09477349, 0.09045114, 0.08758562, 0.08848226, 0.09198963])</code></pre> <h1>bss评分-并行</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;bss_tems(tems_array)&lt;/font&gt;</strong><br /> 计算Brier skill score 评分, 它是实际预报bs相对预报随机预报bs评分的技巧。 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;tems_array&lt;/font&gt;</strong></td> <td style="text-align: left;">最后一维长度为4的多维数组,分别记录了(总样本数、误差总和、观测的平均值、观测的方差),它通常是tems函数的返回结果或结果的累加</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">整数或数组,它比tase_array少了最后一维。 其中每个元素为 负无穷到1的实数,完美值为1</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.bss_tems(tems_array)</code></pre> <pre><code>array([0.61995593, 0.63728865, 0.64877945, 0.64518392, 0.63111927])</code></pre> <h1>roc面积-并行</h1> <p><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;roc_auc_hnh(hnh_array)&lt;/font&gt;</strong><br /> 计算roc图中 roc曲线以下部分的面积。</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=blue size = 5&gt;hnh_array&lt;/font&gt;</strong></td> <td style="text-align: left;">最后两维shape为(等级数,2)的多维数组,分别记录了(预报概率在各个区间时实况正例和负例的样本数),它通常是<a href="https://www.showdoc.cc/meteva?page_id=4680093808004082">hnh,区分能力表</a>函数的返回结果或结果的累加</td> </tr> <tr> <td style="text-align: left;">&lt;font face=&quot;黑体&quot; color=blue size=5&gt;return&lt;/font&gt;</td> <td style="text-align: left;">整数或数组,它比hnh_array少了最后2维。 其中每个元素为0 到 1的实数,完美值为1,小于或等于0.5代表没有预报技巧</td> </tr> </tbody> </table> <p><strong>调用示例:</strong> </p> <pre><code class="language-python">mem.roc_auc_hnh(hnh_array)</code></pre> <pre><code>array([0.95437193, 0.96109875, 0.96468371, 0.96181253, 0.95988772])</code></pre> <p>以上只是展示了分类检验的维度为1的情况,实际上上述思路可以扩展至任意高维的情况。熟练使用中间统计量计算和合并方法,基于中间统计量整体计算分类问题下的检验指标数组,是提高代码编写效果的关键。上述检验函数的内部也都采用了numpy的整体计算方式实现,在计算效率上进行了最大程度的优化。</p> <pre><code class="language-python"></code></pre>

页面列表

ITEM_HTML