zhumetrv
<h1>二进制位置度量</h1>
<p><font face="黑体" color=Blue size=3><strong>它是两个二值化场之间误差平方和的平方根与平均误差距离的线性组合,或预报场和观测场之间的平均误差距离的差异,如果在两个预报模型之间,针对相同的验证字段进行比较。</strong></font> </p>
<h2>计算步骤</h2>
<p>Zhu等人(2011年)提出的二进制位置度量是两个度量的线性组合:两个字段中事件之间的重叠量,由distOV给出(简单地说,是两个二进制字段之间误差平方和的平方根),以及(如果两个字段中都有事件)Peli和Malah(1982年)描述的平均误差距离;也可参见Baddeley(1992年)。该度量可以在实况场A和预测场B之间进行计算。也就是说, </p>
<p>metrV(A,B) = lam1 * distOV(I.A,I.B)+lam2\ * distDV(I.A,I.B)</p>
<p>该公式计算了度量值metrV(A, B),其中λ1和λ2是权重系数。<br />
公式中:<br />
I.A(I.B)是由A(B)大于等于阈值的二进制字段,
distOV(I.A, I.B)是两个二进制字段之间的重叠距离,由sqrt( sum( (I.A - I.B)^2))给出,
distDV(I.A, I.B)是两个二进制字段相对于预报场I.F的平均误差距离的绝对值,其中平均误差距离的计算方法为: </p>
<p>e(A,B) = 1/(N(A)) * sqrt(sum(d(x,B)))</p>
<p>其中,N(A)是A中事件的数量,求和是针对A中所有点x进行的,d(x,B)是点x到B中每个点的最短距离的最小值。为了提高计算效率,e(A,B)是通过使用距离变换(由spatstat包中的distmap函数计算)来计算的。<br />
注意,如果两个字段中都没有事件,则按定义,术语distob(A,B) = 0;如果仅有一个字段中没有事件,则返回一个大的常数(这里是字段的最大维度)。这样,distob与Peli和Malah(1982年)描述的平均误差距离不同。 </p>
<h2>参考文献</h2>
<p>1.Baddeley, A. J. (1992) An error metric for binary images. In Robust Computer Vision Algorithms, W. Forstner and S. Ruwiedel, Eds., Wichmann, 59–78.<br />
2.Peli, T. and Malah, D. (1982) A study on edge detection algorithms. Computer Graphics and Image Processing, 20, 1–21.<br />
3.Zhu, M., Lakshmanan, V. Zhang, P. Hong, Y. Cheng, K. and Chen, S. (2011) Spatial verification using a true metric. Atmos. Res., 102, 408–419, doi:10.1016/j.atmosres.2011.09.004.</p>
<pre><code class="language-python">import numpy as np
import pandas as pd
import meteva.base as meb
import meteva.method as mem</code></pre>
<h2>参数说明</h2>
<p><font face="黑体" color=Blue size=3><strong>metrV_default(ob, fo, thresholds, lam1 = 0.5, lam2 = 0.5, show = False)</strong></font> </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><font face="黑体" color=Blue size=5>ob</font></strong></td>
<td style="text-align: left;">包含观测数据的二维数组</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>fo</font></strong></td>
<td style="text-align: left;">包含预报数据的二维数组,shape和ob相同</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>threshold</font></strong></td>
<td style="text-align: left;">阈值的列表</td>
</tr>
<tr>
<td style="text-align: left;"><strong>lam1</strong></td>
<td style="text-align: left;">数值,给出要应用于 metrV 中的二值化场的平方误差和的平方根的权重</td>
</tr>
<tr>
<td style="text-align: left;"><strong>lam2</strong></td>
<td style="text-align: left;">数值,给出要应用于 metrV 中的平均误差距离项的权重</td>
</tr>
<tr>
<td style="text-align: left;"><strong>distfun</strong></td>
<td style="text-align: left;">字符,最短距离计算函数,默认为欧氏距离计算</td>
</tr>
<tr>
<td style="text-align: left;"><strong>show</strong></td>
<td style="text-align: left;">布尔值,是否打印日志</td>
</tr>
</tbody>
</table>
<h2>输出结果</h2>
<p><strong>计算两个场的线性组合:(i) 两个场之间的重叠量和 (ii) 平均误差距离</strong> </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><font face="黑体" color=Blue size=5>thresholds</font></strong></td>
<td style="text-align: left;">输入的阈值数据的列表</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>distOV</font></strong></td>
<td style="text-align: left;">每个阈值对应的distOV部分评分</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>distDV</font></strong></td>
<td style="text-align: left;">每个阈值对应的distDV部分评分</td>
</tr>
<tr>
<td style="text-align: left;"><strong><font face="黑体" color=Blue size=5>metrV</font></strong></td>
<td style="text-align: left;">每个阈值对应的metrV评分</td>
</tr>
</tbody>
</table>
<p><strong>参考示例</strong></p>
<pre><code class="language-python">grid1 = meb.grid([100, 120, 0.05], [24, 40, 0.05])
path_ob = r'H:\test_data\input\mem\mode\ob\rain03\20072611.000.nc'
path_fo_03 = r'H:\test_data\input\mem\mode\ec\rain03\20072608.003.nc'
grd_ob = meb.read_griddata_from_nc(path_ob, grid=grid1, time=&quot;2020072611&quot;, dtime=0, data_name=&quot;OBS&quot;)
grd_fo = meb.read_griddata_from_nc(path_fo_03, grid=grid1, time=&quot;2020072608&quot;, dtime=3, data_name=&quot;ECMWF&quot;)
look_metrV = mem.zhumetic.metrV(grd_ob.values.squeeze(), grd_fo.values.squeeze(), thresholds = [0.1, 1.5],lam1 = 0.05,lam2 = 0.95)</code></pre>
<pre><code class="language-python">look_metrV</code></pre>
<pre><code>{'thresholds': [0.1, 1.5],
'distOV': [183.719895493112, 132.12872511305028],
'distDV': [0.5185006310586935, 1.7302352027873313],
'metrV': [9.67857037416136, 8.250159698300479]}</code></pre>
<pre><code class="language-python"></code></pre>