Code Monkey home page Code Monkey logo

regression's People

Contributors

fkzk avatar

Watchers

 avatar

regression's Issues

多項式でsin(πx)を近似する

  • y = sin(πx) のグラフを表示する
  • サンプル点を10個作り、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 を表示する

多項式でsin(πx)を近似する

  • y = sin(πx) のグラフを表示する
  • サンプル点を20個作り、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 を表示する

L2ノルムによる正則化を導入する

現状、nを大きくすると多項式の値が大きく触れてしまう。
そこで、L2ノルムによる正則化を導入してこれを抑える。
また、グラフの表示に際してyの表示範囲を設定する。

回帰手法を切り替えられるようにする

回帰の手法は結局のところ

  1. 回帰に使うハイパーパラメータ
    • 多項式フィッティングで言えばn_degreec_l2
  2. トレーニング用のsample_x
  3. sample_xをターゲット関数で写してノイズを乗せたsample_target

を指定することで回帰関数を作ることができる。
そこで各回帰関数は

  1. 1.によってregressorを初期化して生成し
  2. 2., 3. によるregressor.train(sample_x, sample_target)で回帰関数を構成
  3. regressor(x)によって回帰関数としての出力をする

ように構成することとする。

ひとまずの目標としては

  • 現状の多項式フィッティングをPolyRegressorクラスの機能として再実装
  • PolyRegressorregressor.pyに移動し、build_regressor(regressor_name, **init_kwargs)の形でインスタンスを呼び出せるようにする

こととする。

評価指標の算出

|y-\hat{y}|の積分(真の関数値との誤差の面積)を|y|の積分(真の関数の面積)で割る。
ただし、定数関数y=0の場合を考慮して分母に小さい正の数を足す。

|y - \hat{y}| / (|y| + ε)

NNを実装する

層の数、中間ニューロン数、学習率、反復回数を調整できるようにする

グラフを作成する

  • sinπxのグラフを表示する
  • グラフの見た目を整える
  • 学習サンプルを生成・プロット
  • 凡例を追加する

ほかの回帰手法を使いやすいようリファクタリング

目標:regressor_nameという変数を1か所書き換えるだけで回帰手法を切り替えられるようにする

  • 上部に実験条件の変数をまとめる
  • 切り出せる処理の関数化
  • 多項式フィッティングの処理をPolyRegressorクラスに集約
  • PolyRegressorregressor.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)とする。

スコアはひとまず標準出力に表示する。

PolyRegressorとGPRegressorの結果を同時に表示

現在はregressor_nameを書き換えることによってどちらの回帰手法を使うのかを決めているが、比較のために同時に予測曲線を表示したい。

これはコード内に単純にpoly_regressorgp_regressorを実装すれば書けるが、regressor_name = ['poly', 'gp']と書くことによってこれが実現されるようにしたい。
この変更をしたあともregressor_nameで回帰手法をひとつだけ指定したときの挙動は変えないものとする。

ガウス過程回帰の実装

ハイパーパラメータは以下の2つとする。

  • beta: データに乗っているノイズの標準偏差の逆数
  • sigma: ガウスカーネルの標準偏差

c = (K + (1/beta)I)^(-1) z
mu = <k, c>
を計算して出力

研究例:小区間平均化の実験

  • サンプル数と推論時間の関係を調べる
  • サンプル数と精度の関係をプロットする
    • 分割数の決定
  • 小区間に分割する方法の実装
  • 提案手法についてサンプル数と推論時間の関係を調べる
  • 提案手法についてサンプル数と精度の関係を調べる

学習用サンプルにノイズを加える

ノイズは標準偏差がσのガウシアンノイズとする。
ここでσはターゲット関数の値域の(最大値-最小値)に定数をかけたものとする。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.