PROSAIL模型参数详解与敏感性分析

最近一直在学习PROSAIL模型的相关内容,觉得还是要做个总结。

1 PROSAIL的简单介绍

虽然但是,使用PROSAIL做敏感性分析,并不需要去了解这个模型的详细原理,因此这部分其实可以跳过。

PROSAIL是两种模型耦合得到的,I have a PROSPECT, I have a SAIL, Dah! PROSAIL! SAIL是冠层尺度的辐射传输模型,把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层,从而模拟入射辐射与均匀介质之间的相互作用,具体还是挺复杂的。而PROSPECT就是叶片尺度的辐射传输模型,把叶片假设为1到n个具有粗糙表面的吸收板,且这些吸收板被n-1层空气隔开,从而计算叶片结构的各向同性散射,当然叶片内的各种生化参数是这个模型的重要参数。PROSAIL就把两者结合起来,PROSPECT作为SAIL的基本单元,就得到了PROSAIL,能够用来计算植被的冠层光谱以及叶片各种重要的生化参数。

没有拜读过相关论文,只是看了一篇综述,具体机理肯定不是我这样两三句就能概括的。

如果是直接用PROSAIL的话有两种方法,迭代优化和查找表,查找表是物理模型的老朋友了。一般也使用PROSAIL会和机器学习模型等经验方法结合起来,做混合反演,怎么混合我也只懂一些些,不在这里误人子弟。PROSAIL衍生的一个非常重要的副产品就是敏感性分析,我理解就是改变一些重要参数的变化范围,然后观察这些参数对光谱的影响,比如最经典的,叶绿素含量的改变不会影响近红外,我看有不少人通过敏感性分析波段变化而后构建新的植被指数(某种程度也算是混合模型?)。

不管怎么用吧,说到底PROSAIL也只是科(灌)研(水)的一种工具,怎么研(水)得看各位的本事,还是看一下Python怎么用。

2 PROSAIL的Python接口

当我对PROSAIL原理完全不了解的时候,一开始在github上找到了这个项目:pyprosail,在linux上装了Fortran(windows我也装过,完全OK的),但是装上之后依然无法import,我猜测应该还是缺少了什么支持库之类的东西,但是这个项目作者已经不再更新了,我也就没再继续死磕,怕遇上神仙bug,而是改用了这个项目:prosail,非常好用,效率很高,底层没有使用Fortran语言,而是改用了numba加速,是一份非常优秀的代码。

项目首页都有介绍安装方法,没有wheel文件,而是下载包之后,运行setup.py,此外值得注意的是,这个项目还贴出了参考代码以及文献:prosail。

关于这个模型所需的所有参数,在read me.md都有详细介绍,这里对于prosail.run_prosail()接口参数做了个完整归纳,贴出两张表格:

3. 敏感性分析与LUT生成

讲道理,做敏感性分析还是要有一定先验知识的,首先,上一节的所有参数含义烂熟于心,然后,找两篇不错的敏感性分析论文看一看,看看别人如何设置参数范围,以及哪些参数对哪些波段会有影响,还有了解必要的植被先验知识,这方面还是得认真学习一下。

这里主要讲使用Python的实操。

1)Configspace

要做敏感性分析或者生成LUT肯定涉及到参数空间,我使用的是一个叫Configspace的包来管理参数并生成网格,这个包原本是依附一个叫smac的用来做贝叶斯优化的包,主要用来管理机器学习模型的超参数,被我拿来套在PROSAIL上了,因为比较熟悉这个包所以用起来顺手。

说实在话,这个包并不是特别友好,安装比较麻烦,windows基本不要想了,linux可以装,这里贴出项目地址:Configspace,根据上面的步骤安装就好,api介绍看这里:Configspace。自己写一个也可以,其实不复杂,只不过这种涉及网格的循环,Python效率比较差,可以用itertools,或者sklearn也有管理超参数的方法,就是使用Dict,说实在话,不够方便,但也可以用。

2)参数空间采样

就是简单粗暴地网格采样,我一直在思考这样做的正确性,毕竟自然界大多数分布都是正态的,比如植被的叶倾角,究竟该如何采样,我思考了三个方案:

    a. 均匀网格采样,每个参数有步长的采样,然后所有参数笛卡尔积。

     b. 正态随机分布网格采样,每个参数根据先验知识的均值和方差进行正态分布随机采样,然后所有参数笛卡尔积。

    c. 正态分布采样,不做笛卡尔积,每个参数根据先验知识,确定均值和方差,以及参数之间的协方差,然后在整个参数空间内进行正态分布随机采样。

这里面的c听起来感觉很科学,但实现基本不可能,因为参数之间的协方差基本不可能提前得到;b编程比较麻烦,主要是每个参数随机采样可能出现超出范围的值,这不方便控制;最后纠结了一番还是选择了均匀网格采样。

3)代码


4)效率

跑万行光谱就需要分钟级别的时间了,不是prosail的锅,而是Python的循环效率太慢,要提效率可以考虑cython或者开多线程。其实破万行还是挺轻松的,毕竟这么多参数,随便四个参数笛卡尔积一下,就是指数级别的灾难。另外在生成查找表的时候肯定需要用pandas,pandas我用的不好,感觉每次读万行以上的数据就要几十秒,以后会深入了解一下这个问题(flag)。




你可能感兴趣的:(PROSAIL模型参数详解与敏感性分析)