MATLAB,Python,Scilab,Julia比較 第2章【バックナンバー】

MATLAB,Python,Scilab,Julia比較 第2章【バックナンバー】 数値計算
MATLAB,Python,Scilab,Julia比較 第2章【バックナンバー】

はじめに

MATLAB,Python,Scilab,Julia比較するシリーズの第2章。

第1章ではベクトル行列演算の基本的なやり方や
状態空間モデル、そのモデルをPID制御。
などを行った。

第2章は回帰関連の話がメインとなる。

ちなみに、問答方式じゃない方も記事もある。
問答方式に合わせて、これの内容を強化していく予定。

書籍とか

その他の章

概要偏

  • 本シリーズは最小二乗法を代表とした回帰アルゴリズムメイン
  • 自動車業界だと、制御対象の内部パラメータの推定で使われることもある。
    • 経年劣化で内部パラメータが変動しても回帰である程度特定可能。
      • これにより事前交渉検知や劣化状況に合わせた制御ポリシーの変更が可能。

最小二乗法

  • 最もシンプルな回帰分析である1次関数の最小二乗法の解説開始。
  • 最小二乗法の理屈は「誤差の二乗の和が最小になる線」を求める。
  • 誤差が最小になる関数を誤差関数Lとして定義。
    • 1次関数に於いて最小になる誤差関数を求めた。
    • 後々、シンプルな式になる予定。
  • 誤差関数の最小値を求める方法として総当たりがある。
    • しかし、時間がかかったり、精度の設定の適切性が問えないなどの問題があり現実的な手法とは言い難い。
  • 誤差関数の最小値を求めるには偏微分を使用するのが王道。
    • 偏微分は「変な微分」ではない。
    • 偏微分自体は複雑なものではなく、複雑なものをシンプルに扱うためのもの。
  • 誤差関数の最小値は偏微分を使用すると求まるはず。
  • a,bを振ったい場合の誤差関数の値は2次関数的になるので、極値は必ず極小値になる。
    • この極小値になるa,bを求めたい。
  • 偏導関数の公式の前に導関数の公式を確認。
  • 偏導関数の公式も基本は導関数の公式と一緒。
    • 偏微分する軸以外の変数を定数として扱う点が異なる。
  • Σが数式に紛れても分解すれば似たようなやり方になる。
  • 1次関数に於ける最小二乗法の誤差関数の偏導関数を求めた。
    • 項数が多く、ややこしい部分はあるが、一個一個はシンプル。
  • これをMATLAB等で簡単に演算させるためにベクトル、行列の形式に変形する必要がある。
  • 誤差関数の偏導関数を連立方程式に。
  • 連立方程式になったので、行列形式に表現を変えらえる。
  • 行列形式で逆行列を解決させるために2×2の逆行列の公式を使用。
    • 逆行列を扱えない言語の場合は、この公式を使用して逆行列を解決する必要がある。
  • 各種ツール、言語を使うと最小二乗法が一撃で解ける。
    • ライブラリ的な機能を使うことになる。
    • 後日、ライブラリ未使用もやってみる予定。
  • 今回はMATLABのpolyfitを使って最小二乗法を実施。
  • Pythonによる最小二乗法はNumpyのpolyfitで実施可能。
  • 実際にコードを作成し、動作させてみた。
    • ほぼ同一の係数が算出で来た。
    • (表示精度の都合、見た目上は違う値にはなってる。)
  • Scilabによる1次関数の最小二乗法を実施。
    • MATLABと一緒と思いきや、実はコンセプトレベルで違う。
    • 正規方程式の仕様が丸見えになってるイメージ。
      • 正規方程式については追々説明していく予定。
  • Juliaにて1次関数の最小二乗法を実施。
    • Polynomialsパッケージのfit関数を使用。
    • 他のツール、言語と異なり、係数ではなく、関数が取得される。
    • 配列としてアクセスすれば、係数単体の値と取得できる。
  • 1次関数最小二乗法の係数算出の式を元にMATLABで実装。
  • polyfitと同じと解釈できる結果が得られた。
  • 1次関数最小二乗法の係数算出の式を元にPython(Numpy)で実装。
  • np.polyfitと同じと解釈できる結果が得られた。
  • 1次関数最小二乗法の係数算出の式を元にScilabで実装。
  • lsq関数と同じと解釈できる結果が得られた。
  • 純粋なベクトル、行列の演算に関してはMATLABと同じ書き方になる。
  • 1次関数最小二乗法の係数算出の式を元にJuliaで実装。
  • fit関数と同じと解釈できる結果が得られた。
  • 純粋なベクトル、行列の演算に関してはMATLABとほぼ同じ書き方になる。
  • 1次関数最小二乗法の別の算出方法がある。
    • 平均、分散、共分散を利用したもの。
  • 上記の内容を一個ずつ説明していく予定。
  • 1次関数最小二乗法の途中過程の連立方程式を再確認。
  • 平均値、分散、共分散の関連性の雰囲気で把握。
    • これを仮説としていろいろ確認していく。
  • 総和の定義を確認。
    • 単に足すだけ。
    • 係数×要素数をΣを使って表現するパターンもある。
  • 平均値の定義と変形。
    • 総和を要素数でわればOK。
    • 要素数を右辺から左辺に持ってきた変形式が重要。
  • 分散の定義及び変形式の確認。
  • 複雑な変形を経た上でシンプルな変形式になる。
    • 展開のルールと、分配のルールが使える。
      • Excelの表をイメージすると分かりやすいかも?
  • 共分散について簡単に説明。
    • 2種類のデータの相関性を評価できる。
  • 相関性について簡単に説明。
    • 正の相関、負の相関。
    • 強い相関、弱い相関。
  • 共分散の式を変形した。
  • いままでの導出した変形式と一次関数最小二乗法の連立方程式を再掲。
  • 最小二乗法の連立方程式の片方からbを算出。
    • aが不明なため、このままではbも不明だが、もう片方の式のbに代入すればaが求まる。
    • aが求まれば、bも求まるはず。
  • 平均、平均の変形、分散の変形、共分散の変形を用いて係数aを求めた。
  • 共分散、分散の計算式を元に図解すると四角形の面積で表現できる。
    • x,y方向の差の積による四角形、x方向の差の二乗による四角形の比なので、傾きを求めるのと同一となる。
  • 標本分散と不偏分散について説明。
    • 証明方法は割愛。
    • 図を見て、不偏分散の必要性を察っするレベルで確認。
  • 各ツール、各言語で分散を求める関数等があるが、大体が不偏分散。
    • オプション指定で標本分散にすることも恐らく可能。
  • 平均分散共分散を使用した一次関数最小二乗法をMATLABで記載。
    • covとvarを使用する。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。
  • 平均分散共分散を使用した一次関数最小二乗法をPython(Numpy)で記載。
    • covとvarを使用する。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。
  • 平均分散共分散を使用した一次関数最小二乗法をScilabで記載。
    • covとmtlb_varを使用する。
    • 分散取得用の関数にvarianceは不偏分散しか返さない。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。
  • 平均分散共分散を使用した一次関数最小二乗法をJuliaで記載。
    • covとvarを使用する。
    • covは共分散を返す。
      • MATLABのように分散共分散行列にはなっていない。
      • パラメータを2列に並べて渡すと分散共分散行列を返す。

正規方程式へ至る道

  • 1次関数最小二乗法こと単回帰分析のあとは重回帰分析、多項式回帰分析にチャレンジ。
  • 重回帰分析、多項式回帰分析を行うには正規方程式が必要。
  • 正規方程式を導出するまでの因果関係を図示した。

対称行列と二次形式

  • 対称行列について説明。
    • 対角部を中心に対象となっている正方行列。
    • 単位行列も対称行列の一種ではある。
      • 厳密には対称行列の一種である対角行列の一種が単位行列。
  • 対称行列は二次形式、二次形式の微分、グラム行列で使用する予定。
  • 二次形式について確認。
    • すべての候の次数が2である多項式。
  • 二次形式を一般化して行列表現。
    • 行列表現できた方が計算しやすい。
  • 二次形式の行列表現と多項式表現の関係性を示した。
    • 行列Aが対称行列になることを制約とすると行列表現と多項式表現に可逆性を付加することができる。
    • これに伴い、等しいものとして扱うことが可能となる。
  • 実際に行列表現と多項式表現が等しいかを各ツール、各言語で確認したいが、その前にベクトル、行列のまま演算する仕掛けを考える必要がある。
  • 二次形式の行列表現をfor文を使用せずに一括計算するための仕掛けを考える。
    • 内積を分解してアダマール積と定数関数との内積にする。
    • これにより、x^Tとxの直積的な結果を抑制。
  • 二次形式の多項式表現と行列表現の計算をMATLABで実施。
  • meshgridにx軸とy軸を入力とすることで平面座標が得られる。
  • 平面座標を元に2変数の演算を実施。
  • 演算結果をmesh関数を使用して3Dグラフに表示。
  • 二次形式の多項式表現と行列表現の計算をPythonで実施。
  • 3Dグラフを表示する際は、projection=’3d’が必要。
  • plot_wireframeでワイヤーフレームでグラフ表示ができる。
  • 二次形式の多項式表現と行列表現の計算をScilabで実施。
  • 基本的にはMATLABと一緒。
    • ただし、reshapeの代わりにmatrixを使う必要がある。
  • 二次形式の多項式表現と行列表現の計算をJuliaで実施。
  • 3Dグラフを表示する際は、”projection” => “3d”が必要。
  • meshgridが無いので自作した。

二次形式の微分

  • 二次形式の微分についての話へ突入。
  • ∇(ナブラ)について説明。
    • ベクトルに対しての偏微分。
    • 各要素に対しての微分を行うだけなので、複雑な概念ではない。
  • ∇を使用して、二次形式の微分(勾配)を求める。
  • 二次形式を多項式表現し、偏微分。
  • 偏微分した結果を行列形式に戻す。
  • 結果としてシンプルな偏導関数が求められる。
  • 具体的な二次形式の多項式に対して微分。
  • ∇による微分結果確認。
  • 二次形式の微分の公式による結果確認。
  • ツールで計算させるまでもないが、一応やっておく。
  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にMATLABで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にPython(NumPy)で算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にScilabで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • コードの差はreshapeがmatrixになった程度。
  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にScilabで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • コードの差は演算部分はmeshgridを自作、グラフ表示がPyPlot経由Matplotlibの仕様になってる程度。

グラム行列

  • グラム行列の説明。
    • グラム行列は対称行列になる。
  • 試しにグラム行列の演算をして対象行列になるか確認。
  • グラム行列が対称行列になることを証明。
    • m×nの行列を行ベクトルに分解してからグラム行列の演算をさせる。
    • 演算結果の対称部をピックアップして等しいことを証明する。

二乗和誤差

  • 二乗和誤差に関しては、以前の最小二乗法の誤差関数で扱ってはいる。
    • 「正しいを思われる線との誤差を2乗にしたもの」という意味自体は変わらない。
  • しかし、今回はこれを多変量として一般化しようという話になる。
  • 多変量について説明。
    • いっぱい変数あるってこと。
  • 二乗和誤差を多変量で表現。
    • ベクトル、行列で表現するってこと。
  • 一般化した後に具体化して確認。

正規方程式

  • いままでの知識の総動員すべく数式列挙。
    • 二次形式の行列表現。
    • 二次形式の微分。
    • グラム行列。
    • 二乗和誤差の一般化。
  • 一般化した二乗和誤差の数式の変形を実施。
  • 上記の途中で行列の積に対する転置で一見すると特殊な変形がある。
    • (Ax)^T=x^T A^T。
      • 計算すると分かるが普通に等しい結果になる。
  • グラム行列が対称行列であることを利用して、二次形式であることを保証してしまう。
  • 二次形式を保証した上で、それの偏導関数を利用する。
  • 二乗和誤差の偏導関数を元に最小化問題へ。
  • 上記式を元に極小値を求める式へ。
    • これをxを求める式に変形したものが正規方程式。
  • 正規方程式がわかっていると、単回帰、重回帰、多項式回帰が一撃で解けるようになる。

単回帰分析

  • 正規方程式を使って単回帰分析を行う。
  • 単回帰分析の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • 上記を元に各ツール、各言語で演算を実施すればOK。
  • 正規方程式による単回帰分析をMATLABで実施。
  • 以前の最小二乗法と同じ結果が得られた。
  • 数式で定義した通りの演算をするのみ。
  • 正規方程式による単回帰分析をPython(NumPy)で実施。
  • MATLABと同じ結果が得られた。
  • ベクトル、行列の内積の演算子は「@」。
    • 「*」にしてしまうとアダマール積になってしまうので注意。
  • 正規方程式による単回帰分析をScilabで実施。
  • MATLABの演算と同じ結果が得られた。
  • 計算部分は全く一緒。
    • グラフ表示部の微調整の仕方が違う。
  • 正規方程式による単回帰分析をJuliaで実施。
  • MATLABと同じ結果が得られた。
  • 演算部分はMTALABと同一。
    • ベクトル化演算子であるdot演算子を利用する局面はある。

重回帰分析

  • 正規方程式を使って重回帰分析を行う。
  • 重回帰分析の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • サンプリングデータは特定の多項式に±1の乱数を載せたものを使用。
    • 特定の多項式と近い係数が求まればOK。

MATLAB

  • 正規方程式による重回帰分析をMATLABで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 3Dグラフの散布図はscatter3、メッシュ状の平面関数はmeshを使用して表現する。

Python

  • 正規方程式による重回帰分析をPython(NumPy)で実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 3Dグラフの散布図はscatter3D、平面関数はplot_wireframeを使用して表現する。
    • projection=’3d’のオプションを忘れずに。

Scilab

  • 正規方程式による重回帰分析をScilabで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 3Dグラフの散布図はscatter3d。
    • 3D散布図はVersionによっては表現できなかったり関数名が違ったりするので注意が必要。

Julia

  • 正規方程式による重回帰分析をJuliaで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 3DグラフはPython寄りの仕様。
    • PyPlotがmatplotlibのラッパーであるため。

多項式回帰分析

  • 正規方程式を使って多項式回帰分析を行う。
  • 多項式回帰分析の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • サンプリングデータは特定の多項式に±1の乱数を載せたものを使用。
    • 特定の多項式と近い係数が求まればOK。

MATLAB

  • 正規方程式による多項式回帰分析をMATLABで実施。
  • 誤差はあるものの目的の係数の算出はできている。

Python

  • 正規方程式による多項式回帰分析をPython(NumPy)で実施。
  • 誤差はあるものの目的の係数の算出はできている。

Scilab

  • 正規方程式による多項式回帰分析をScilabで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • コード自体はMATLABコードのコピペで行けてしまった。
    • plot部分の微調整が無かったんで。

Julia

  • 正規方程式による多項式回帰分析をJuliaで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • コード自体はMATLABコードのほぼコピペ。
    • 等差数列、plotのオプション周りの合わせこみはした。

多変量多項式回帰分析

  • 正規方程式を使って多変量多項式回帰分析を行う。
  • 多変量多項式回帰分析の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • サンプリングデータは特定の多項式に±1の乱数を載せたものを使用。
    • 特定の多変量多項式と近い係数が求まればOK。

MATLAB

  • 正規方程式による多変量多項式回帰分析をMATLABで実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • サンプル点数を増やせば、理想値に近付く。

Python

  • 正規方程式による多項式回帰分析をPython(NumPy)で実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • 式が複雑になってくると、Pythonコードだと元の式の表現から乖離しているのがちょっと気になる。

Scilab

  • 正規方程式による多変量多項式回帰分析をScilabで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • コード自体はMATLABコードのコピペ。
    • scatter3をscatter3dに書き換えた程度。

Julia

  • 正規方程式による多変量多項式回帰分析をJuliaで実施。
  • 誤差はあるものの目的の係数の算出はできている。
  • コード自体はMATLABコードのコピペ?
    • 演算部分はコピペ。
    • グラフ表示はmatplotlib仕様依存に書き方。

多変量多項式回帰分析(関数項)

  • 正規方程式を使って多変量多項式回帰分析(関数項あり)を行う。
  • 多変量多項式回帰分析(関数項あり)の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • サンプリングデータは特定の多項式に±1の乱数を載せたものを使用。
    • 特定の多変量多項式と近い係数が求まればOK。

MATLAB

  • 正規方程式による多変量多項式回帰分析(関数項あり)をMATLABで実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • サンプル点数を増やせば、理想値に近付く。

Python

  • 正規方程式による多変量多項式回帰分析(関数項あり)をPython(NumPy)で実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • サンプル点数を増やせば、理想値に近付く。

Scilab

  • 正規方程式による多変量多項式回帰分析をScilabで実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • サンプル点数を増やせば誤差は減る。
  • コード自体はMATLABコードのコピペ。
    • scatter3をscatter3dに書き換えた程度。

Julia

  • 正規方程式による多変量多項式回帰分析をJuliaで実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • 誤差の出方はサンプル点数次第。

まとめ

  • 第2章最終回。
  • これまでの振り返り。
  • 正規方程式の限界について。
    • 係数と変数の積による項以外の特殊な項があると対応できない。
  • 今回やった回帰分析の延長線上にあるもの。
    • ラッソ回帰、リッジ回帰。

コメント

タイトルとURLをコピーしました