🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

5585閲覧

多変数パラメータフィッティングの精度を上げたい

shiiter

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/17 02:43

前提・実現したいこと

・Pythonをさわり始めました。
・以下のようなパラメータ最適化ができないか試行中です。
●後に示しますが、現状結果は何だかなといったところです。
最適化については色々な解説サイト様がありましたが、関数の形まるごとに触れているのは探しきれませんでした。
宜しければアドバイスが欲しく思います。。。

--
例えば4個のパラメータ(a,b,c,d)で決まる関数F(a,b,c,d)がある。

 F = a*x + b(x**2) + c*(x**3) + d*(x**4)

ある実験・計測により、この関数Fに完全に従う曲線が得られたとして、
このときのパラメータ(a,b,c,d)を求めたい。(いわゆる逆問題?)

--
本当はもっと実用的なモデルで考えたいですが、
とてもその段階にないので、まずはこの辺りから始めたいと思いました。
最適化にはまずOptunaを試してみてからという話も聞きましたので、
名付けなど見苦しいかもですが以下のようなコードを書いてみました。

該当のソースコード

Python

1import numpy as np 2import optuna 3 4study_F_ML = optuna.create_study() 5study_F_ML.optimize(objective_F, n_trials= 1000) 6 7def F(a,b,c,d): 8 x = np.arange(1001)/100.0 9 y = a*x + b*(x**2) + c*(x**3) + d*(x**4) 10 y_goal = 30 * x + (-50)*(x**2) + 20*(x**3) + (-2)*(x**4) 11 #最適化の目標はa = 30 , b = -50, c = 20, d = -2 12 y_MAE = (1/1001) * abs(y- y_goal).sum(axis=0) #MAEで評価 13 return y_MAE 14 15def objective_F(trial): 16 a = trial.suggest_uniform('a', -100, 100) 17 b = trial.suggest_uniform('b', -100, 100) 18 c = trial.suggest_uniform('c', -100, 100) 19 d = trial.suggest_uniform('d', -100, 100) 20 score = F(a,b,c,d) 21 return score

結果

目標値にある程度近い値は出ましたが、実用にはまだ遠いかなといった感じです。

Python

1study_F_ML.best_params 2{'a': 23.71088301113415, 3 'b': -61.00813218555368, 4 'c': 25.742281885308095, 5 'd': -2.5264525629825365} 6 #最適化の目標はa = 30 , b = -50, c = 20, d = -2

イメージ説明

ご相談内容

何となくパラメータ最適化はできたのですが、まだまだ精度が足りません。
こんなものかなとも思いましたが、この例ではパラメータの選び方によっては完全一致もあり得るので、
上手く最適化できていない印象です。
特に目的関数について、RMSEやMAEでは誤差の総和で判断されるので、関数の形状についての情報が失われちゃうのかなとか思っています。
なんとも雑なご質問ですが、精度の向上のためにはどのような改善方法があるか、知見をいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiiter

2021/01/17 04:39

早速ご回答いただき、ありがとうございます。 改善の方法はたくさんあるんですね。検索力も足りていなかったようです。 記事を読ませていただいて、再チャレンジしたいと思います。 また、本質問が解決した際に追加で質問したかったことがあるのですが、 少し先んじて、おまけ程度に伺いたく思います。 --- 今後、本当にパラメータ最適化したいモデルは、 今回のように複数のパラメータからなる関数の形に書くことができ、出力も一意に決まり再現性もあるが、それがどのような式で書けるかは複雑で分からないとします。 (説明が拙いですが、 複雑で定式化が難しいモデルだけれども、それ自体はシミュレーション等で完全に再現できる。 実験・計測等で得られたある結果(特性)に対して、パラメータが完全に最適化された場合、 それらの値を設定してシミュレーションを実行すると、全く同じ出力結果が得られる。 じゃあシミュレーション解析すれば定式化できるじゃん,なのかもしれませんがそれは置いておいて...) この場合も取りあえずは同じような方法を使っていくのがいいんでしょうか。 式の形によって~とありましたので、どのような手法があるのだろうと思いました。 (これも先ずは検索しろなのかもしれませんが、参考にさせていただきたく。。) もしよろしければお願いします。
jbpb0

2021/01/17 04:40

回帰アルゴリズムの線形/非線形は、例の式でのa〜dに付いて線形/非線形のどちらなのか、で決まります 式のxに付いてではありません そこを混同しないように、ご注意ください 例の式は、xに付いては4次関数なので非線形ですが、a〜dに付いては線形なので、回帰アルゴリズムも線形回帰でできます (多項式回帰は線形回帰)
jbpb0

2021/01/17 05:12 編集

> 出力も一意に決まり再現性もあるが、それがどのような式で書けるかは複雑で分からない ガウス過程回帰は、式を決めなくてもデータがあれば回帰でき、予測もできます ただし、データの密度が高くないと、「式の形」という制約が無いため、大外れするかもしれません https://nykergoto.hatenablog.jp/entry/2017/05/29/python%E3%81%A7%E3%82%AC%E3%82%A6%E3%82%B9%E9%81%8E%E7%A8%8B%E5%9B%9E%E5%B8%B0_~_%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E6%AF%94%E8%BC%83_~ の「予測モデルの作成」から下のグラフを見てください あと、外挿にも向いてないと思います それも、「式の形」という制約が無いためです フィッティングに使う式は、そのデータが従うはずの法則ですから、データに対する「知識」ですよね その「知識」抜きでデータだけで正確な法則を導くには、それなりの注意が必要です あるアルゴリズムを使えば、どんなデータでもうまくいく、なんてことはありません
guest

回答1

0

式の形によって解き方が変わるのですが、その式なら多項式回帰で解けます
やり方は、ググればたくさん見つかります
たとえば、これとか
scikit-learnで多項式回帰を行う
【AIプログラミング】多項式回帰を勉強する、scikit-learnで多項式回帰プログラミング

式の形が、回帰で求めたいパラメータに付いて線形ではない場合は、非線形回帰をやります
Python SciPy : 非線形最小二乗問題の最適化アルゴリズム

なお、回帰アルゴリズムの線形/非線形は、例の式でのa〜dに付いて線形/非線形のどちらなのか、で決まります
式のxに付いてではありません
そこを混同しないように、ご注意ください
例の式は、xに付いては4次関数なので非線形ですが、a〜dに付いては線形なので、回帰アルゴリズムも線形回帰でできます
(多項式回帰は線形回帰)

投稿2021/02/28 14:42

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問