質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

Q&A

解決済

1回答

820閲覧

データが無い領域の算出アルゴリズムを募集

hhiro45fd

総合スコア19

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

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

0グッド

1クリップ

投稿2021/05/17 04:58

前提・実現したいこと

次の実験点を計算するアルゴリズムを模索しています。

以下のような実験データ(x1,x2が変数)が手元にあって、
まだデータが無い領域を次に実験する場合、
人間であれば(x1,x2) = (0.4,0.3)あたりを選択すると思います。

イメージ説明
(データの範囲:0.00<=x<=1.00、データ区切り:0.01刻み と仮定)

この次点の決定を機械的にやるにはどうすれば良いか?ということを検討しています。
やり方を考えた(試したこと参照)のですが、
他にもっと賢いやり方が世の中にはあるはず・・・と思い質問させて頂きました。

試したこと

※コードの実装はまだしていません。(pythonを予定)
①実験データに対して一番直径が大きい円を描ける点
②その他(これを募集しています)
(①はfor文で力技で書くしかない?)

補足情報(FW/ツールのバージョンなど)

実運用ではxは10次元ほどを想定しています。
良い方法ご存じでしたらご教示ください(ヒントでも十分です)。

データ(上の例)

x1x2
00.930.68
10.490.79
20.740.02
30.210.03
40.030.45
50.670.62
60.790.11
70.720.16
80.680.62
90.950.91
100.670.95
110.960.28
120.390.69
130.330.99
140.840.85
150.770.95
160.780.55
170.840.54
180.660.66
190.710.55

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

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

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

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

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

ppaul

2021/05/17 07:44

結果の最適性と、検索プログラムの簡易性と、検索プログラムの処理速度の優先順位はどういう順番ですか? あと、最適な点を一つ見つけて、その次に最適な点を一つ見つける時のN点と、最適なN点を見つけるのでは結果が違いそうですが、前者なのですね。
hhiro45fd

2021/05/17 09:13

>jbpb0様 コメントありがとうございます。 予測値の標準偏差の大きさが最大の点で抽出、等のやり方をすれば ベイズ最適化でもできそうです。 ただ、2点目以降を見つける場合は観測点が必須と思われるので、 (実験→予測→実験・・・とできる系の場合はいけると思われます) その点は留意が必要かと思います。ちょっと計算してみます。
hhiro45fd

2021/05/17 09:21

>ppaul様 コメントありがとうございます。 >優先順位 ①検索プログラムの簡易性>②結果の最適性>③検索プログラムの処理速度 となります。 >最適な点を一つ見つけて・・・ その点記載しておりませんでした。 仰られます様に前者と考えておりました。 ただ、N点を1回で調べたいとは考えております。 (探索(1点)→実験→探索(1点)→・・・ではなく、探索(N点)→実験→実験・・・という感じです)
jbpb0

2021/05/17 10:39

> 2点目以降を見つける場合は観測点が必須と思われるので、 (実験→予測→実験・・・とできる系の場合はいけると思われます) https://ohke.hateblo.jp/entry/2018/08/04/230000 の「kappa」を変えれば、同じ測定値のセットから異なる測定候補を作れるので、それでバリエーションを増やしてみたら、いかがでしょうか? (分散最大点〜期待値最大点 の間で、候補をN点作る)
fana

2021/05/18 00:34

> >優先順位 > ①検索プログラムの簡易性>②結果の最適性>③検索プログラムの処理速度 既存データ群からの距離などに基づく(x1,x2)の「良さ」を適当に定義する →Nelderらの滑降シンプレックス法 あたりで適当に最適化をやる (処理は遅いけど,最適化処理であって,プログラムがすこぶる簡単,ということで.)
hhiro45fd

2021/05/19 05:24

>jbpb0様 昨日苦しみながらとりあえず試してみました。 ベイズについて理解が追い付いていない状態ですが・・・(苦笑 やってみた感じですが、 【良かった点】 ・UCBでkappaを弄ると、仰られるように良さげな候補が出てきました。 【課題】 ・ベイズ最適化がうまいこと収束しないことが結構あるっぽい (カーネルの作り方に大きく依存するっぽい) ・候補N点をどう出すかは頭をひねる必要がありそう (UCB最大から順番に候補点を出したら同じような位置ばっかり算出されました笑) 【改善策】 ・UCBをわざわざ使わなくても、分散最大で獲得関数を定義すれば大丈夫っぽい ・カーネルはRBFよりMatternのほうがよさげ ・分散のてっぺんだけに候補Nを限定することで、同じような位置からの候補点の算出を防げそう な感じとなりました。結構いけそうです。 もうちょっと弄ってみれば実用レベルにはなりそうです。 良いアイディア教えていただきましてありがとうございました<(_ _)><(_ _)>
hhiro45fd

2021/05/19 05:34

>fana様 コメントありがとうございます。 距離ベースでも昨日作ってみました。 「良さ」についてはアホみたいに簡単に定義(ここで書くのが恥ずかしいぐらい簡単です)を しましたが、結構うまく働いてくれました。 私も最適化で実装できないかなーと初めは探っていたのですが、 うまく定式化ができず、いったん手を止めてしまってます。 (私が最適化ド素人というのが一番の問題でしょうが・・・) もしお時間ありましたら、定式化についてアドバイスいただけますと幸いです。 ソルバーで解けてしまえば正直めちゃくちゃ楽になるなーとは思っています。
hhiro45fd

2021/05/19 06:02 編集

今のところのまとめ 【ガウス過程を用いる方法】 ①テストレベルでは少々改善点があるが、実装可能を確認 ・分散最大で獲得関数を定義すれば大丈夫っぽい ・カーネルはRBFよりMatternのほうがよさげ ・分散のてっぺんだけに候補Nを限定する 【データ間の距離を用いた方法】 ①テストレベルでは実装可能を確認 ・「良さ」の定義はかなりテキトウでも問題なし ②最適化を用いることができれば、もっと高精度高効率を狙える可能性もあり? 【データ密度を用いた方法】 ※未実装
hhiro45fd

2021/05/19 06:12

皆様から色々と案を頂けましたので解決済にしましたが、 他コメント等ありましたら追記を是非お願いいたします。
fana

2021/05/19 06:16 編集

> 「良さ」についてはアホみたいに簡単に定義 結果の厳密さがそれほど重要でもなさそうに見えますから,最適化の目的関数としては「とにかく既存から離れているほど値が小さくなるような(傾向がある)何か」を与えれば用途的に十分なのではないでしょうか. 例えば,2秒で考えたような目的関数「1.0 / (最も近い既存データからの距離+1)」とかでも目的に合うならOKでしょう. (プログラムが簡単という理由で挙げた滑降シンプレックス法とかを使うなら目的関数が微分可能でなくてもよいです.)
hhiro45fd

2021/05/19 07:13

>fana様 たびたびコメントありがとうございます。 コメントを読みなおして、自分のコードを改めて見直したら、 最適化の定式化を気づかぬうちにやってました(失笑 (目的関数を設定して、制約条件を設定して、最小化処理していました) 今回の件で、最適化ということが教科書的にではなく、体感として少しわかった気がします。 アドバイス頂きましてありがとうございました<(_ _)><(_ _)>
guest

回答1

0

ベストアンサー

10次元でやるということは、それぞれの軸の範囲を二等分すると全部で210 = 1024個の部分に分かれます。
それぞれの軸の範囲を四等分すると 4
10 = 1048576の部分に分かれます。
そう考えると、100個とか1000個の実験結果が分かっていても、やるべき場所の方がはるかに多いのではないでしょうか。
簡単に考えるなら、それぞれの軸の範囲を2等分して得られる1024個が尽くされていないならそこからやるので、そのために複雑な計算を行う必要は無いのではないかと思います。

また、hhiro45fdさんの画像のような二次元の場合であっても、次にやるべき場所が必ず(0.4,0.3)にならない場合もあることにご留意ください。
たとえば、これが地図の測量のような問題の場合、(0.4,0.3)の周りの高度にばらつきがなく起伏が少ない大平原であり、(0.8, 0.6)の近くの点にあたりは高度のばらつきが多くグランドキャニオンのような地形であるならば、そのあたりをもっと測量しなければならないということも考えられます。
これは実験の対象や目的次第ですのでhhiro45fdさんの実験では気にしなくて良いのでしょう。

投稿2021/05/18 12:11

ppaul

総合スコア24670

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

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

hhiro45fd

2021/05/19 05:52

回答ありがとうございます。 前半については仰る通りかと思います。 今回の話は「やるべき場所がはるかに多いこと」を 具体的に理解するための手段のようなものと考えて頂ければと思います。 「どの辺をまだ一番やっていないのか?、ほとんど全部やっていないのか?」 それを人間が理解するための方法模索のような感じです。 2等分して・・・という方法は全く考えていませんでした。 ちょっと考えてみます。 良いアイディア教えていただきましてありがとうございました<(_ _)><(_ _)>
hhiro45fd

2021/05/19 07:47

今のところのまとめ 【ガウス過程を用いる方法】 ①テストレベルでは少々改善点があるが、実装可能を確認 ・分散最大で獲得関数を定義すれば大丈夫っぽい ・カーネルはRBFよりMatternのほうがよさげ ・分散のてっぺんだけに候補Nを限定する 【データ間の距離を用いた方法】 ①テストレベルでは実装可能を確認 ・「良さ」の定義はかなりテキトウでも問題なし ・最適化計算の定式化に則れば、計算方法は自由自在 【データ密度を用いた方法】 ※未実装
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問