2020年12月14日月曜日

scipy.optimize.curve_fit

任意関数の最小二乗法は EXCEL でも Pythonでも可能です。

精度、速度、記載の単純さで scipy.optimize.curve_fit の圧勝です。初期値によっては一発で求まらないこともありますが、 EXCELソルバーに比べると安定かつ高速で解を求めてくれます。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html

変分推論は難しいですね。収束させるのにあたりのつけ方が必要になるようです。で、結局は最小二乗法に戻ってしまったり。慣れが必要なのでしょう。

 

2020年12月13日日曜日

DataFrame のアダマール積

Pandas の DataFrame でよく使う便利な乗算。
間違えやすいので、( ..)φメモメモ

**************************************

2020年12月7日月曜日

地下水 と MCMC

ようやくMCMC を概ね理解し動かせるようになったので、地下水モデル10章の不確実性に関する部分へ少しだけ立ち戻ることに。
https://phreeqc.blogspot.com/2019/07/4.html

MCMC関連の文献を探してみると、簡単な計算をされている事例がありました。第2著者以降は日本の方ですね。
Julien Boulange, Hirozumi Watanabe, Shinpei Akai (2017) A Markov Chain Monte Carlo technique for parameter estimation and inference in pesticide fate and transport modeling

  • 気候、水収支、土壌、農薬特性などの40以上のパラメータから、農薬濃度の予測精度に大きな影響を与えることが報告されている以下の4パラメータを選択
  • 農薬溶解速度(kdiss)、水田土壌中の農薬の一次分解速度(kbio)、農薬の脱離速度(kdes)、農薬分配係数(kd)
  • これらの事前確率分布を作成(最大・最小間で一様分布)
  • 尤度は正規分布(E(θ)は観測値と予測値の平均2乗誤差)
  • MCMC で事後確率分布を作成

尤度を計算する前に採択されたパラメータでシミュを回す必要があります。大きなモデルを扱う実務向きではないですね。

実務で扱う地下水モデルで不確実性を検討するには、PEST一択なのでしょうか?確かに、市販のパッケージソフトには組み込まれており、使い勝手も良かった印象はあります。加えて、逆解析を古くから扱っているせいか、Bayes も良く出てきます。海外では当たり前なのかな?

もう少し、文献等を読んでみましょう。

2020年12月6日日曜日

change detection

Ohki et al.(2020)
Landslide detection in mountainous forest areas using polarimetry and interferometric coherence
https://earth-planets-space.springeropen.com/articles/10.1186/s40623-020-01191-5


ALOS-2 のデータ (Lバンド、空間解像度約6m)を用いた、土砂移動箇所検出の検討事例です。北海道胆振東部地震(2018年9月)と九州北部豪雨(2017年7月)を対象としています。
提案手法は change detection の範疇ですが、画像データを利用していません。波のデータのみです。そして最後はお決りの機械学習です(といっても決定木です)。

特徴

  • PolSAR、InSAR、DEM を組み合わせた解析

結果

  • すべての特徴量(InSAR、PolSAR、DEM)を用いた場合、kappa>0.6程度の精度。
  • 正確な検出には、少なくとも二重偏波(HHとHV)が必要。特に大きな入射角では四重偏波を推奨。
  • 精度向上には、より高い空間分解能、より高い時間周波数、より多くの方向からの観測が必要である。

留意点

  • Hサイト(北海道)は、試験地周辺の火山の火砕流堆積物に覆われている。そのため、胆振地震では浅い土砂崩壊が多く、比較的緩やかな斜面(<30°)で発生したと考えられている。Hサイトを用いて構築したモデルは,急峻な地形での多発したFサイトへの適用性が悪い。地質の違いに留意する必要あり。


最近の国交省さんの動向を見ていますと、今後、土砂災害分野における各種衛星データの利用は拡大して行くようですね。関連マニュアルも複数出ていますし、ALOS-3へ向けてのシンポジウムでも以下のような報告がされています。
https://www.pco-prime.com/alos-3_alos-4_sympo/pdf/1505.pdf 

機械学習を用いた change detection の精度は高いといえない状況ですが、いずれ向上し、災害時の人手不足問題も(change detection に関しては)回避できるでしょう。
検出アルゴリズムの構築以外は特に難しい作業はないので、備えておきましょう。

2020年12月5日土曜日

スパースモデリング

EXCELをよく使っていた頃、データに多項式をフィッティングする場面で何次式を使うかは感覚的でした。

低次だと合いませんし、高次だとノイズまで合わせてしまいます(いわゆる過学習)。ちょうどよいところを探す方法は、、、古くからありましたね。

LASSO
https://scikit-learn.org/stable/modules/linear_model.html#lasso
\begin{align*}
\min_{w}{ \frac{1}{2n_{\text{samples}}} ||y - X w||_2 ^ 2 + \alpha ||w||_1}\end{align*}

この損失関数はモデルの適合性を表す誤差項と、複雑さを表すペナルティー項で構成されています。αは求めたいパラメータwを制御する上位のパラメータ(ハイパーパラメータ)。αを大きくするほど大きなL1ノルムに対してペナルティーがかかる仕組みです。するとL1ノルムは小さくならざるを得なくなり、スパースな解が導かれる(が適合性は低くなりやすい)という仕組み。逆にαを小さくするほどL1ノルムを大きく取れるようになり、適合性が向上しやすい(が複雑で、過学習に陥りやすい)。αをどのように調整・採用するかがキモです。

その判断基準は以下の通り。

・情報量基準(AIC、BICなど)
・cross‐validation

情報量基準の利用では客観性に優れるものの感覚的にずれていると感じることがあるでしょう。一方、cv は理屈でなく現実的。ベースを統計にしているか、機械学習にしているかなどで好き嫌いが分かれそうです。

スパースを仮定した場合、非ゼロのwを増やすと組み込まれるXも高次まで多く含まれて適合性は良くなる(が複雑になる)といった表現が理想です。が、L0ノルムを扱うと組み合わせ(計算コスト)が膨大になるとのこと。そこでα*L1ノルムで代用しているそうです。
ちなみに、L1、L2 は機械学習でも多用されていましたね。回帰だと以下の通りです。

・L0正則化・・・非ゼロノルムの個数
・L1正則化・・・L1ノルム利用、LASSO回帰
・L2正則化・・・L2ノルム利用、Ridge回帰
・L1+L2正則化・・・Elastic Net

scikit-learn を利用すれば、これらのモデリングは容易。ありがたいですね。

 ==========================================
ラグランジュの未定乗数法を適用した場合の図や説明も web 上には多くあります。そちらの方が直感的で理解し易いでしょう。

関連内容はコチラ↓
https://phreeqc.blogspot.com/2019/06/blog-post_19.html
https://phreeqc.blogspot.com/2020/02/blog-post.html


2020年12月3日木曜日

GEE+ Sentinel-1

SAR データを利用した Change Detection を整理。

以前利用していたDocker は -vオプションを使用しなければ動きました。機能が追加されているようです。
https://phreeqc.blogspot.com/2019/04/sar-change-detection-on-google-earth.html

GEE コミュニティのチュートリアルにもありました。Part1は動きましたが、Part2の後半はダメでした。
https://developers.google.com/earth-engine/tutorials/community/detecting-changes-in-sentinel-1-imagery-pt-2

いずれも、GEE+ Sentinel-1。解析エンジンもデータも海外製です。データは政府事業の Tellus 提供より揃っています。
https://phreeqc.blogspot.com/2019/02/google-earth-engine.html
国内の複数個所で Change Detection を試行しましたが、動作も問題ありません。きちんと結果は出てきます。
扱っているモノがモノなので、まだ精度面では物足りません。が、手軽に加工できるところはありがたいですね。将来的にはアルゴリズムが向上し、精度面でも耐え得るモノになるでしょう。

Tellus でも ALOS2 のデータが公開され始めました。が、未だ直近1年分くらいは公開されていません。過去分も、2~3年前くらいまで。直近のデータがないのは辛い。
しかも、開発環境を割り当ててもらえないと、自由に加工できない状況は継続中。https://phreeqc.blogspot.com/2020/09/tellusar.html

まだまだ海外製には追いつけない感が漂っています。頑張って欲しいですね。


2020年11月23日月曜日

MCMC

MCMCを実装するライブラリはいくつかあるようです。

PyMC3:Theano
PyMC4:TensorFlow
Pyro:PyTorch
NumPyro:JAX

手元の環境で動いたのはPyroのみ。環境構築に関してはシビアなようです。

web上のサンプルを見てみますと、書き方はほぼPyMC3と同じでした。動かすのは簡単(traceplot がないのは残念。seaborn で書きました)。

が、写経し終わると理解できていない箇所が露わに。

 y_model = pyro.sample('y_model', dist.Normal(a*x + b, sd), obs=y)

ここの obs の計算内容がわかりません。ここがキモなのはわかっているのですが、マニュアルに詳細が書かれていませんし、ソースも追えません。尤度×事前確率にどのようにかかわっているのでしょう?
おそらく、理解している方々が必要として使われているので、学び方が逆なのでしょうね。

ま、他の部分は理解できていることが分かりました。メモしておきましょう。

 **************************************
20201123 MCMC メモ
 
データ駆動科学

  • データを出発点と考える=因果律を遡る
  • 従来:変形係数を確定(モデルを確定)→応力、ひずみがノイズを含み確率的分布(→安全率を含めた設計)
  • データ駆動:応力、ひずみが確定→変形係数が確率的分布(逆解析的発想)
  • データx,y(ひずみ、応力)が得られたとき、パラメータa(変形係数)が取り得る確率分布(事後確率)を求めたい。
  • 必要なのは、①パラメータaを与えたときにyが取り得る確率分布(尤度)、②aの確立分布(事前確立)

取得データD[x,y]

  • 確定x:ひずみx
  • 確定y:応力y


予測分布モデル (例)物理モデル+ノイズ
 物理モデル y=ax+b

  • 未確定a:平均μa,標準偏差σaとして設定(事前確率P(a)=N(μa,σa2)を仮定)
  • 未確定b:平均μb,標準偏差σbとして設定(事前確率P(b)=N(μb,σb2)を仮定)
  • 未確定σn:一様分布(U([n])を仮定)
    ←いずれもデータDを見て取りうる範囲を仮定

 ノイズ

  • 重畳ノイズを正規分布として設定(尤度P(y_model)=N(ax+b,σn2)を仮定


予測分布モデルから θ[a:変形係数、b:切片、sd:標準偏差]の事後確率 p(θ|D)を求める。

  • p(θ|D) = p(D|θ)p(θ)/p(D) ∝ p(D|θ)p(θ)
  • 事後確率 ∝ 尤度×事前確率
  • 事前確率、尤度に正規分布を仮定した場合、事後分布を解析的に求めることが可能(共役事前分布)。
  • しかし、一般的には計算が困難。→MCMC法などで帰納的に事後確率(最大)を求める。


マルコフ連鎖モンテカルロ法(MCMC法)

  • モンテカルロ法:乱数を使ったシミュレーション手法
  • マルコフ連鎖:現在の状態が、前時刻の状態のみに依存するモデル→メトロポリス法などの利用
  1. θ0を仮定
  2. 乱数εを加え、θ1を作成。
  3. 確率密度の比rを計算r=p(D|θ1)p(θ1)/ p(D|θ0)p(θ0)
    ノイズを正規分布と仮定した場合、p(D|θ) ∝ exp(-NE(θ)/σ2)
    あるθ0、θ1における exp(-NE(θ)/σ2)p(θ) を求める
    ←obs=D を利用 ※点での推定
  4. 確率密度の比rを評価
    r>1でθ1を採用
    r<=1かつ乱数U(1,0)<rでθ1を採用、U>=rでx0を採用
  5. 1~4の繰り返し←exp(-NE(θ)/σ2)p(θ)の分布形状を推定

 

他手法との違い

  • 最小二乗法:残差の平方和 E(θ) を最小化
  • 最尤推定:a,b,σについて導関数=0の位置(パラメータの値)を求める(global minimum とは限らない)
  • ベイズ推定:パラメータを確率的に扱う→分布(形)を求める 
******************************************
20201129
MAP推定:パラメータ値の同定のみの場合(パラメータの分布を求めない)
  • 作成した予測分布モデル+観測データ(obs)に対し、MAP(maximum a posterior :最大事後確率)推定でパラメータを同定
  • pyro.condition で同定パラメータをモデルに反映
 
20201202
変分推論:分布も推定
  • svi = SVI(model, guide, optimizer, loss=Trace_ELBO())でモデル構造を作成
  • step method でデータDをモデルに渡して調整←obsの役目
  • predictive で予測分布を作成(モンテカルロ近似)
概ね、obs の役割について理解しました。
数式は理解できていません。残念ながら後回しです。
 
20201204
数式もOK(おそらく)。
これで MCMC(メトロポリス法利用)は理解できたと思います。