yuuho.wiki

カオスの欠片を集めて知恵の泉を作る

ユーザ用ツール

サイト用ツール


develop:start

文書の過去の版を表示しています。


開発

design doc 的な?

hellflame

hellflame というコマンドを作成し, hellflame hoge というサブコマンドで面倒くさいことを色々とやれるようにする.

train

train が開始されたら 環境変数に応じたディレクトリを用いる. 実験時のディレクトリをサンドボックス化することが主な用途. 実験に使用中のファイルを編集してしまわないようにコピーを作成する.

基本的に全て実験定義ファイルにしたがって実験を開始する.

configファイルの定義

仕様をどうするか?

ツールとか

ビルドシステムについてメモ

低レイヤー? Make, MSBuild, XCode, Ninja
高レイヤー? CMake, premake, Bazel, qmake?

OpenCV は CMake を使っているっぽい。一番ナウいのはGoogleの作っているBazel?

NinjaはMakefileに変わる高速なビルドシステム。ただし人間が書くものではなく、 高レイヤーのシステムから自動生成されることが想定されている。

CI

オープンソースな Jenkins が最強?

テストシステムについて

  • Google Test
    OpenCVなどで使われている。画像の入出力も比較できるか?

研究過程で生み出したもの

non-clip distribution

問題点とやりたいこと

プロシージャルモデリング用途でいい感じの確率密度分布からサンプリングした値を使いたい。
正規分布は値の範囲が無限なので使いづらい。正規分布で最小値・最大値を決めてクリップしてしまうと、 最小値・最大値に分布が偏るのであまりよくない。

なので、最小値最大値を決められつつ、そのような最小値最大値という極端な値での生起確率も決めることができて、 最頻値も決められるような良い確率分布を定義した。

解決方法

ここで最小値 $v_{min}$ 最大値 $v_{max}$ の生起確率を $p_{base}$ とする。
最頻値を決められて0,1 での生起確率が 0 な正規分布に似た形の分布としてベータ分布(第一種ベータ分布)があるのでこれを使う。 (numpyなどで簡単に利用可能)
ベータ分布の形状を制御するパラメータは $\alpha$ と $\beta$ の二つの実数値である。 ベータ関数 $B(\alpha,\beta)$ を用いて以下のように定義される。 $$ f(x;\alpha,\beta) = \frac{x^{\alpha-1}(1-x)^{\beta-1}}{B(\alpha,\beta)} $$ 正規分布のような上に山なりの形状にするには $\alpha,\beta>1$ である必要があるが、 この条件下で最頻値 $v_{mode}$ は次のように決まる。 $$ v'_{mode} = \frac{\alpha-1}{\alpha+\beta-2} $$

とりあえず最小値・最大値での生起確率を 0 としたとき、 $\alpha=2$を固定として $v_{min}, v_{max}, v_{mode}$ を用いて次のように表せる。 $$ v'_{mode} = \frac{v_{mode}-v_{min}}{v_{max}-v_{min}} \\ \beta = 1/v'_{mode}\\ f'(x) = f\left( \frac{x-v_{min}}{v_{max}-v_{min}};\alpha,\beta \right) $$

実装

自作確率密度関数からサンプリングするときの実装

def non_clip_distribution(vmin,mode,vmax,base,shape=(1,)):
    normed_mode = (mode-vmin)/(vmax-vmin)
    beta        = 1 / normed_mode
    distB = np.random.beta(a=2,b=beta,size=shape) * (vmax-vmin) + vmin
    distU = np.random.rand(*shape)                * (vmax-vmin) + vmin
    return np.where(np.random.rand(*shape)>base, distB, distU)
develop/start.1620987025.txt.gz · 最終更新: 2021/05/14 10:10 by yuuho