fkzk / regression Goto Github PK
View Code? Open in Web Editor NEWGitHub演習用。データ点から元の関数を機械学習で推測する。
GitHub演習用。データ点から元の関数を機械学習で推測する。
GPRegressor
として実装する。
GPRegressor
としてregressor.py
に実装する。
コードを読み書きしやすくするため
の順に処理するようにする。
y = sin(πx)
のグラフを表示するy = sin(πx_i)
をグラフに表示するx^0, x^1, ..., x^n
を計算し、行列にまとめるa_0, a_1, ..., a_n
を求めるy = a_0 x^0 +a_1 x^1+...+a_n x^n
を表示するy = sin(πx)
のグラフを表示するy = sin(πx_i)
をグラフに表示するx^0, x^1, ..., x^n
を計算し、行列にまとめるa_0, a_1, ..., a_n
を求めるy = a_0 x^0 +a_1 x^1+...+a_n x^n
を表示する現状、nを大きくすると多項式の値が大きく触れてしまう。
そこで、L2ノルムによる正則化を導入してこれを抑える。
また、グラフの表示に際してyの表示範囲を設定する。
回帰の手法は結局のところ
n_degree
やc_l2
sample_x
sample_x
をターゲット関数で写してノイズを乗せたsample_target
を指定することで回帰関数を作ることができる。
そこで各回帰関数は
1.
によってregressor
を初期化して生成し2., 3.
によるregressor.train(sample_x, sample_target)
で回帰関数を構成regressor(x)
によって回帰関数としての出力をするように構成することとする。
ひとまずの目標としては
PolyRegressor
クラスの機能として再実装PolyRegressor
をregressor.py
に移動し、build_regressor(regressor_name, **init_kwargs)
の形でインスタンスを呼び出せるようにすることとする。
|y-\hat{y}|の積分(真の関数値との誤差の面積)を|y|の積分(真の関数の面積)で割る。
ただし、定数関数y=0の場合を考慮して分母に小さい正の数を足す。
|y - \hat{y}| / (|y| + ε)
層の数、中間ニューロン数、学習率、反復回数を調整できるようにする
目標:regressor_name
という変数を1か所書き換えるだけで回帰手法を切り替えられるようにする
PolyRegressor
クラスに集約PolyRegressor
をregressor.py
に移動build_regressor
関数経由でPolyRegressor
を準備現在、ターゲット関数はsin(πx)
を使うことになっているが、これをtarget_nameにより指定できるようにする。
例として
target_name="sin"
を指定するとsin(πx)
target_name="poly2"
を指定するとx^2+0.5x-0.7
が使えるようにする。
sin
関数を定義し、jnp.sin(jnp.pi * x)
をsin(x)
という形で書けるようにするsin
関数を返す、get_target_fn(target_name)
という関数を定義するsinx
に依存した名前だが、target
に一般化できる部分の変数を書き換えるpoly2(x)
関数を実装する。get_target_fn(target_name)
はpoly2
を返すようにするtarget_name
によってget_target_fn
が返す関数を切り替えられるようにするtarget_fn.py
に分離し、get_target_name
だけをimportして使うようにする近似の誤差の評価をするためにNormalized Mean Absolute Error (NMAE) を導入する。
NMAEにはいくつか流儀があるが、単純に値域の幅で割ることで正規化する。
また、見やすさのために
score := 10 log10((1/NMAE)^2) = - 20 log10(NMAE)
を評価値(dB)とする。
スコアはひとまず標準出力に表示する。
||t - y||^2 / ||t||^2 を評価基準にする
現在はregressor_name
を書き換えることによってどちらの回帰手法を使うのかを決めているが、比較のために同時に予測曲線を表示したい。
これはコード内に単純にpoly_regressor
とgp_regressor
を実装すれば書けるが、regressor_name = ['poly', 'gp']
と書くことによってこれが実現されるようにしたい。
この変更をしたあともregressor_name
で回帰手法をひとつだけ指定したときの挙動は変えないものとする。
PolyRegressor
の実装build_regressor
の実装ハイパーパラメータは以下の2つとする。
beta
: データに乗っているノイズの標準偏差の逆数sigma
: ガウスカーネルの標準偏差c = (K + (1/beta)I)^(-1) z
mu = <k, c>
を計算して出力
ノイズは標準偏差がσのガウシアンノイズとする。
ここでσはターゲット関数の値域の(最大値-最小値)に定数をかけたものとする。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.