计算等压面要素场的基本检验指标
本文介绍计算等压面要素场的几种基本检验指标。
重要提示:本文介绍的部分代码参考自 NWPC 正在开发的新一代检验工具包 GetPy。
介绍
本文介绍的基本检验指标涉及以下三种数据:
- 预报场 (forecast_field)
- 分析场 (analysis_field):当前模式的分析场或者使用 FNL 等其他分析场
- 气候场 (climate_field)
本文假定上述数据均被插值成 WMO GDPFS 手册中规定的标准网格,即 1.5 度 * 1.5 度。下面的指标计算不涉及数据插值问题。
计算指标还需要使用到网格点对应的纬度坐标值 (latitudes) 。
指标计算即可以针对全球范围,也可以针对特定的区域范围。本文假定上述四个参数都已按照选定的区域范围进行裁剪。
指标
Mean Error
Mean Error (ME),也叫作 Bias,表示预报值与验证值之间的偏差的平均值。定义如下:
其中
- F_i 表示预报值
- A_i 表示验证值 (verification value)
- D_i 表示两者的差值
- w_i 是权重系数,n 是样本的个数,phi_i 是纬度。
观测值,初始值或客观分析值通常被用作验证值。当预报完全正确时,ME 等于 0,被称为完美预报 (perfect forecast)。
计算北半球 (Northern Hemisphere) 等广阔区域的平均值时,需要考虑区域之间与纬度相关的差异,并使用加权系数进行评估。
例如,为了评估等角投影 (euirectangular projection) 中的客观分析,通常将加权系数 “wi = 1/n"替换为纬度的余弦 “cos phi_i”。本文中介绍的其他指标采用相同的计算方法。
回答如下问题:平均预报误差是多少?
范围:负无穷大 到 正无穷大
完美分数:0
特性:
简单,熟悉。也称为(加性)偏差 (additive bias)。不测量误差的大小。不测量预测值和观察值之间的对应关系,即,如果存在补偿误差,则可以为不良预测获得完美的分数。
Mean Absolute Error
回答如下问题:预报误差的平均幅度是多少?
范围:0 到 正无穷大
完美分数:0
特性:
简单,熟悉。不指示偏差的方向。
Standard Deviation
Standard Deviation (SD)
Root Mean Square Error
Root Mean Square Error (RMSE) 通常用于表示预测准确性。定义如下:
其中 D_i 表示预报和验证值的差值,w_i 表示权重系数,n 是样本个数。
RMSE接近零表示预测值更接近验证值。对于完美预测,RMSE等于零。将 ME 和随机误差分开,RMSE 可以表示如下:
其中 sigma_e^2 表示差值 D_i 的标准差 (standard deviation, SD)
回答如下问题:预报误差的平均幅度是多少?
范围:0 到 正无穷大
完美分数:0
特性:
简单,熟悉。测量“平均”误差,并根据误差的平方加权。不指示偏差的方向。与较小的错误相比,RMSE 对较大的错误具有更大的影响,如果特别不希望出现较大的错误,则这可能是一件好事,但也可能鼓励保守的预测。
Anomaly Correlation Coefficient
异常相关系数 (Anomaly Correlation Coefficient, ACC) 是空间场验证中使用最广泛的量度之一 (Jolliffe and Stephenson 2003),它代表预报异常与验证值与参考值(如气候数据)之间的相关性。ACC 定义如下:
其中
- F_i 表示预报值
- A_i 表示验证值
- C_i 参考值,例如气候值
- bar{f} 是 f_i 的均值
- bar{a} 是 a_i 的均值
- w_i 表示权重系数
如果预测异常的变化模式与验证异常的变化模式完全一致,则 ACC 将采用最大值 1。相反,如果变化模式完全反转,则将采用最小值 -1。
回答如下问题:预报异常与观测异常的对应程度如何?
范围:-1 到 1
完美分数:1
特性:
测量预报和观测值之间的对应关系或相位差,减去每个点的气候平均值 C,而不是样本平均值。经常使用异常相关性来验证数值天气预报(NWP)模式的输出。ACC 对预报偏差不敏感,因此良好的异常相关性不能保证准确的预报。
计算
使用 numpy 或 xarray 库保存数组
import numpy as np
import xarray as xr
函数参数说明:
-
forecast_field
:预报场 -
analysis_field
:分析场 -
climate_field
:气候场 -
latitudes
:纬度坐标数组
ME
def bias(
forecast_field: np.ndarray or xr.DataArray,
analysis_field: np.ndarray or xr.DataArray,
latitudes: np.ndarray or xr.DataArray
) -> np.ndarray or xr.DataArray:
result = np.sum(
(forecast_field - analysis_field) * np.cos(latitudes * np.pi / 180.0)
) / np.sum(np.cos(latitudes * np.pi / 180.0))
return result
MAE
def absolute_bias(
forecast_field: np.ndarray or xr.DataArray,
analysis_field: np.ndarray or xr.DataArray,
latitudes: np.ndarray or xr.DataArray
) -> np.ndarray or xr.DataArray:
result = np.sum(
np.abs(forecast_field - analysis_field) * np.cos(latitudes * np.pi / 180.0)
) / np.sum(np.cos(latitudes * np.pi / 180.0))
return result
SD
def std(
forecast_field: np.ndarray or xr.DataArray,
analysis_field: np.ndarray or xr.DataArray,
latitudes: np.ndarray or xr.DataArray
) -> np.ndarray or xr.DataArray:
bias_result = bias(forecast_field, analysis_field, latitudes)
result = np.sqrt(
np.sum(
np.power(forecast_field - analysis_field - bias_result, 2) * np.cos(latitudes * np.pi / 180.)
) / np.sum(np.cos(latitudes * np.pi / 180.))
)
return result
MSE
def mse(
forecast_field: np.ndarray or xr.DataArray,
analysis_field: np.ndarray or xr.DataArray,
latitudes: np.ndarray or xr.DataArray
) -> np.ndarray or xr.DataArray:
result = np.sum(
np.power(forecast_field - analysis_field, 2) * np.cos(latitudes * np.pi / 180.0)
) / np.sum(np.cos(latitudes * np.pi / 180.0))
return result
ACC
def acc(
forecast_field: np.ndarray or xr.DataArray,
analysis_field: np.ndarray or xr.DataArray,
climate_field: np.ndarray or xr.DataArray,
latitudes: np.ndarray or xr.DataArray
) -> np.ndarray or xr.DataArray:
forecast_climate = bias(forecast_field, climate_field, latitudes)
obs_climate = bias(analysis_field, climate_field, latitudes)
acc1 = np.sum(
(forecast_field - climate_field - forecast_climate) * (analysis_field - climate_field - obs_climate) * np.cos(latitudes * np.pi / 180.)
)
acc2 = np.sum(
np.power(forecast_field - climate_field - forecast_climate, 2) * np.cos(latitudes * np.pi / 180.)
)
acc3 = np.sum(
np.power(analysis_field - climate_field - obs_climate, 2) * np.cos(latitudes * np.pi / 180.)
)
result = acc1 / np.sqrt(acc2 * acc3)
return result
参考
https://www.cawcr.gov.au/projects/verification/
https://www.jma.go.jp/jma/jma-eng/jma-center/nwp/outline2019-nwp/pdf/outline2019_Appendix_A.pdf
题图由 bridgesward 在 Pixabay 上发布。
- 移除 WordPress 后台插件管理的“编辑”与“停用”功能
- 区域设置 ID (LCID) 表
- jquery 表单事件
- Jexus以.NET(Phalanger)方式支持PHP的网站
- jquery鼠标事件
- Jexus 负载均衡
- 用.NET Framework 2.0创建 Form设计器[翻译]
- jquery事件绑定
- Fontello:免费Web-font 图标大集合(font-face 图标集)
- 通过 wp-config.php 禁止安装、升级或编辑WordPress 主题与插件
- 利用VS2005中的Code Snippets提高开发效率
- 用schemaSpy制作数据库文档
- WordPress 投票插件Post Ratings,可在谷歌搜索显示星级投票(附中文包下载)
- Spark学习笔记——共享变量
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenCV 使用imread()函数读取图片的六种正确姿势
- PHP simplexml_import_dom()函数讲解
- PHP getName()函数讲解
- Laravel框架集成UEditor编辑器的方法图文与实例详解
- PHP+redis实现的购物车单例类示例
- ThinkPHP3.2.3框架邮件发送功能图文实例详解
- PHP simplexml_load_file()函数讲解
- Python下划线5种含义代码实例解析
- PHP getDocNamespaces()函数讲解
- Django实现内容缓存实例方法
- Tensorflow–取tensorf指定列的操作方式
- spring-boot-route(一)Controller接收参数的几种方式
- python中 _、__、__xx__()区别及使用场景
- 浅谈TensorFlow中读取图像数据的三种方式
- python 最简单的实现适配器设计模式的示例