【入門】MATLAB,Python,Scilab,Julia使い方比較【数値計算プログラム】

【入門】MATLAB,Python,Scilab,Julia使い方比較【数値計算】 MATLAB/Simulink
【入門】MATLAB,Python,Scilab,Julia使い方比較【数値計算】

恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]

回帰分析の代表的な利用シーン

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

最小二乗法の初歩

  • 最小二乗法の初歩として1次関数の最小二乗法を解説。
  • 誤差関数を特定し最小化したものが求めたい線となる。
    • 最小化方法は以下
      • 総当たり(現実的ではない)
      • 偏微分を使う
  • 連立方程式の形にできれば行列で表現でき逆行列が利用できる。

最小二乗法

最小二乗法(MATLAB)

  • 各種ツール、言語を使うと最小二乗法が一撃で解ける。
    • ライブラリ的な機能を使うことになる。
    • 後日、ライブラリ未使用もやってみる予定。
  • 今回はMATLABのpolyfitを使って最小二乗法を実施。

最小二乗法(Python)

  • Pythonによる最小二乗法はNumpyのpolyfitで実施可能。
  • 実際にコードを作成し、動作させてみた。
    • ほぼ同一の係数が算出で来た。
    • (表示精度の都合、見た目上は違う値にはなってる。)

最小二乗法(Scilab)

  • Scilabによる1次関数の最小二乗法を実施。
    • MATLABと一緒と思いきや、実はコンセプトレベルで違う。
    • 正規方程式の仕様が丸見えになってるイメージ。
      • 正規方程式については追々説明していく予定。

最小二乗法(Julia)

  • Juliaにて1次関数の最小二乗法を実施。
    • Polynomialsパッケージのfit関数を使用。
    • 他のツール、言語と異なり、係数ではなく、関数が取得される。
    • 配列としてアクセスすれば、係数単体の値と取得できる。

数式ベースで最小二乗法

MATLAB

  • 1次関数最小二乗法の係数算出の式を元にMATLABで実装。
  • polyfitと同じと解釈できる結果が得られた。

Python

  • 1次関数最小二乗法の係数算出の式を元にPython(Numpy)で実装。
  • np.polyfitと同じと解釈できる結果が得られた。

Scilab

  • 1次関数最小二乗法の係数算出の式を元にScilabで実装。
  • lsq関数と同じと解釈できる結果が得られた。
  • 純粋なベクトル、行列の演算に関してはMATLABと同じ書き方になる。

Julia

  • 1次関数最小二乗法の係数算出の式を元にJuliaで実装。
  • fit関数と同じと解釈できる結果が得られた。
  • 純粋なベクトル、行列の演算に関してはMATLABとほぼ同じ書き方になる。

平均分散共分散で最小二乗法

  • 総和、平均、分散、共分散を元に1次関数最小二乗法の係数算出が可能。
    ただし、各数式の変形が必要なため、変形式を導出。
  • 係数b(切片)を求めたあとに係数a(傾き)を求める。
    一般的な連立方程式の解き方と一緒。

不偏分散、不偏共分散についてさっくり解説

  • 標本分散と不偏分散について説明。
    • 証明方法は割愛。
    • 図を見て、不偏分散の必要性を察っするレベルで確認。
  • 各ツール、各言語で分散を求める関数等があるが、大体が不偏分散。
    • オプション指定で標本分散にすることも恐らく可能。

MATLAB

  • 平均分散共分散を使用した一次関数最小二乗法をMATLABで記載。
    • covとvarを使用する。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。

Python

  • 平均分散共分散を使用した一次関数最小二乗法をPython(Numpy)で記載。
    • covとvarを使用する。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。

Scilab

  • 平均分散共分散を使用した一次関数最小二乗法をScilabで記載。
    • covとmtlb_varを使用する。
    • 分散取得用の関数にvarianceは不偏分散しか返さない。
  • covは共分散だけでなく、分散共分散行列が取得される。
    • よって、covだけでも分散は取得可能。

Julia

  • 平均分散共分散を使用した一次関数最小二乗法をJuliaで記載。
    • covとvarを使用する。
    • covは共分散を返す。
      • MATLABのように分散共分散行列にはなっていない。
      • パラメータを2列に並べて渡すと分散共分散行列を返す。

正規方程式へ至る道

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

対称行列と二次形式

  • 対称行列と二次形式について説明。
  • 二次形式は多項式表現と行列表現ができる。
    • 行列表現ができると計算がしやすくなる。
    • しかし、全座標を入れるにはfor文を使用する必要がある。
      • for文を削除するための仕掛けを入れておいた。

MATLAB

  • 二次形式の多項式表現と行列表現の計算をMATLABで実施。
  • meshgridにx軸とy軸を入力とすることで平面座標が得られる。
  • 平面座標を元に2変数の演算を実施。
  • 演算結果をmesh関数を使用して3Dグラフに表示。

Python

  • 二次形式の多項式表現と行列表現の計算をPythonで実施。
  • 3Dグラフを表示する際は、projection=’3d’が必要。
  • plot_wireframeでワイヤーフレームでグラフ表示ができる。

Scilab

  • 二次形式の多項式表現と行列表現の計算をScilabで実施。
  • 基本的にはMATLABと一緒。
    • ただし、reshapeの代わりにmatrixを使う必要がある。

Julia

  • 二次形式の多項式表現と行列表現の計算をJuliaで実施。
  • 3Dグラフを表示する際は、”projection” => “3d”が必要。
  • meshgridが無いので自作した。

二次形式の微分

  • ∇について説明。
  • 二次形式の微分について説明。
  • 具体的な多項式に当てはめて計算してみた。

MATLAB

  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にMATLABで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。

Python

  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にPython(NumPy)で算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。

Scilab

  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にScilabで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • コードの差はreshapeがmatrixになった程度。

Julia

  • 二次形式の多項式としての偏導関数、行列形式による偏導関数を元にJuliaで算出及びプロット。
  • ともに同一の算出結果とプロットが得られた。
  • コードの差は演算部分はmeshgridを自作、グラフ表示がPyPlot経由Matplotlibの仕様になってる程度。

グラム行列

  • グラム行列の定義について説明。
  • グラム行列の性質について説明。
    • 対称行列になる。
  • グラム行列が対称行列になることの証明。

二乗和誤差

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

正規方程式

  • いままでの知識の総動員すべく数式列挙。
  • 二乗和誤差の偏導関数を元に最小化問題へ。
  • 正規方程式がわかっていると、単回帰、重回帰、多項式回帰が一撃で解けるようになる。

単回帰分析

  • 正規方程式を使って単回帰分析を行う。
  • 単回帰分析の二乗和誤差関数の定義。
  • 正規方程式の各成分の定義。
  • 上記を元に各ツール、各言語で演算を実施すればOK。

MATLAB

  • 正規方程式による単回帰分析をMATLABで実施。
  • 以前の最小二乗法と同じ結果が得られた。
  • 数式で定義した通りの演算をするのみ。

Python

  • 正規方程式による単回帰分析をPython(NumPy)で実施。
  • MATLABと同じ結果が得られた。
  • ベクトル、行列の内積は「@」。
    • 「*」にしてしまうとアダマール積になってしまうので注意。

Scilab

  • 正規方程式による単回帰分析をScilabで実施。
  • MATLABの演算と同じ結果が得られた。
  • 計算部分は全く一緒。
    • グラフ表示部の微調整の仕方が違う。

Julia

  • 正規方程式による単回帰分析を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で実施。
  • 誤差はあるものの目的の係数の算出はできている。
    • 誤差の出方はサンプル点数次第。

最小二乗法(番外編:LAFセンサ)

ここではLAF(全域空燃比)センサの特性再現を題材に最小二乗法を試す。

最小二乗法

わかりやすい測量の数学―行列と最小二乗法―

イラストで学ぶ 機械学習 最小二乗法による識別モデル学習を中心に (KS情報科学専門書) 

MATLABによる最小二乗法

Pythonによる最小二乗法

わかりやすい測量の数学―行列と最小二乗法―

イラストで学ぶ 機械学習 最小二乗法による識別モデル学習を中心に (KS情報科学専門書) 

次のページへ

次は画像処理関連について

コメント

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