一个简单的自动调参(校准)程序(适用于DHSVM模型)

PS:为了让我的小论文更有说服力,所以花了两天时间编写并大体调试完这样一个东西,基本上没什么技术含量,但是对于调试这个模型来说,感觉应该可能或许还是有点用处的。。。

先介绍一下这个水文模型:DHSVM模型是一个应用广泛的、基于物理机制的、完全分布式水文模型(我只希望写完这篇文章之后这辈子也不要再和这么垃。。额, 这么先进的模型扯上半毛钱关系)

众所周知,当前的分布式物理模型,无论介绍说得多么天花乱坠,结构设计得多么巧妙复杂,但是由于数据精度不够高、参数不确定性等各种“信不信由你,反正我信了”的借口,归根结底都是要进行校准的,说白了都是要调参的。我当前遇到的问题就是:在我进行了7次校准之后,模型没有得到我想要的结果,而且我也看不到任何能够达到我预期结果的希望,那么,难道我要把宝贵的人生都献给Ctrl + c和Ctrl + v吗,当然不行,所以,一个解决(或许可以解决)的方法就是编写一个自动修改参数然后调用该模型的脚本。 Linux里, Bash Shell固然很强大,但是感觉我需要进行的操作还是稍微要复杂些的 ,所以我就启用了我的老搭档——Java,使用Java至少有两个好处:其一,平台无关;其二,不需公开自己写的垃圾代码 。

言归正传,下面介绍一下这个程序:

这是一个使用Java编写的简单程序,主要功能是自动批量执行由用户指定的参数组合驱动的DHSVM模型,并为每个参数组合的模拟结果计算所有主流模型评价统计量。 说白了,就是批处理调参。

实现原理:
DHSVM模型在运行时,会读取一个Configure文件,使用其中的模型参数来驱动模型,所以,一个显而易见的想法就是修改各个参数项来创建不同的参数组合,但是提取模型参数项本身就是一个出力不讨好的体力活(尤其当我并不是模型的开发者的时候),所以,我就偷了个懒:其实,要修改的位置完全可以用行号和字段号来确定,then,一切变得异常容易。。。

使用方法:
首先,设置参数项:即编辑程序自带的”setting.txt“文件,其内容如下,

1

如图,依次按照”#”所标注的提示,填写各个参数项,需要讲一下以下两项内容:

(1)[start_calibration]和 [end_calibration]之间不能有任何非参数设置语句
参数设置语句的格式是: line #1 field #2 {[from #3 to #4 step #5] | [list #3 #4 #5 …]}
line 后面跟要修改的参数项的行号 (从1开始)
field 后面跟该参数所在的位置(以空白符分割的字段位置, 比如对于”Ground Roughness = 5.0E-4 “这一句,要修改这个粗糙长度的话,field应设为4,另外可以同时修改多个field)
from及其后语句和list语句是不能同时存在的,但是二者必须指定其一。
from … to .. step … 是用来修改数值的,step是变化步长,若不设置,则会只修改两个数,即from和to
list 是用来应对多个参数在同一行或者修改字符串的

比如,这里的 ”line 236 f 5 6 7 list 2000. 2100. 2200. 3000 3100 3200 4000 4100 4200 5000 5100 5200“
指的是:第236行第5、6和7字段位置上的数值或字符会有被替换为“2000. 2100. 2200”、“3000 3100 3200”、”4000 4100 4200 “以及“5000 5100 5200”的四种可能性。

(2) [command] 和 [out_path] 的内容一定要对应,而且[working_dirctory]务必要设置为模型的主目录,否则模型可能会找不到需要的数据文件。

然后,执行程序:

2

上图是在Fedora 19下程序开始运行时的界面

如图所示,根据我的设置,总共有36种参数组合,所以会进行36次校准/调试。然后,

3

如图,程序顺利运行完毕,并将结果输出到默认的BatchResult.txt文件中。

打开结果文件:

4

打开结果文件,先不要被那恐怖的NS系数吓到, ,由于参数是随便设置的,而且初始条件也没有考虑,得到什么烂结果都是有可能的。结果文件会记录每个参数组合模拟结果与观测对比的5个主流统计量,分别是:nash系数,相关系数,百分比偏差,平均误差,均方根误差,我个人认为这几项已然够用了,同时会记录表征模型是否正常运行了的exit code,以及每个参数组合所修改的参数行(这个当然得有)

程序下载:
下午坐车回家后把程序整理下在发布,估计也没人用得上,自娱自乐 ~

 

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Post Navigation