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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4193閲覧

scipy minimize 一度の実行で複数の結果を取得したい

taku_ant

総合スコア2

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/02 13:03

前提・実現したいこと

制約付き非線形関数の最小化問題で制約条件の係数の値を色々変えながら
scipy.optimize.minimizeでそれぞれの値に対応する最小値を全て取得して結果を配列に格納する

該当のソースコード

python

1import numpy as np 2from scipy.optimize import minimize 3 4def objective_function(x): 5 return - x[0]**0.5 * x[1]**0.5 6 7def constraint(x,a,b): 8 x,a = np.array(x),np.array(a) 9 return b - x@a 10 11reps = 100 #繰り返し回数 12 13a_init = [50,200] #制約条件係数の基準値 14a_shock = np.array([np.random.rand(reps)*50+50,np.zeros(reps)]).T #係数をランダムに変更 15a = a_init + a_shock 16b = 10000 17 18cons = lambda x,i: constraint(x,a[i],b) 19cons_list = [lambda x: cons(x,i) for i in range(len(a))] 20bnds = ((0,None),(0,None)) 21opts = lambda i: minimize(objective_function, #目的関数 22 (15,5), #初期値 23 method='SLSQP', 24 bounds=bnds, 25 constraints={'type':'eq', 'fun':cons_list[i]}) 26#以下を実行 27print(opts(0).x) 28# array([33.62294395, 25.00001409]) 29 30#異なるインデックスに対して再度実行すると別の値が返ってくる 31print(opts(1).x) 32# array([35.37724898, 25.0000091 ]) 33 34#しかし以下のように配列化すると全て同じ結果が返ってくる 35results = [opts(i).x for i in range(len(a))] 36print(results) 37# [array([37.31991237, 24.99999784]), array([37.31991237, 24.99999784]), ... 38 39#一度の実行で複数のインデックスについて計算すると同じ値が返ってくる 40print(f"インデックス1: {opts(1).x}\nインデックス2: {opts(2).x}") 41# インデックス1: [44.29645281 25.00000902] 42# インデックス2: [44.29645281 25.00000902]

試したこと

〇普通にfor loopしたり、リスト内記法で結果を取得すると全て同じ値になってしまう
〇lambda関数化して1つずつ結果を取り出すと問題なく毎回異なる結果が返ってくる
〇↑をforで回して結果を配列に格納してもすべて同じ値になってしまう

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

実行環境はGoogle colaboratoryです

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

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

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

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

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

guest

回答3

0

解決しているので蛇足かも知れませんが、ラムダ式の内包表現に問題ありです。

python

1def func(x, a): 2 print(f"x={x},a={a},id(a)={id(a)}") 3 4 5a = list(range(10)) 6print("a=", a) 7 8lfunc = lambda x, i: func(x, a[i]) 9lfuncs = [lambda x: lfunc(x, i) for i in range(len(a))] 10 11lfuncs[0](123) 12lfuncs[1](456) 13lfuncs[2](789)

結果

python

1a= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2x=123,a=9,id(a)=4452857216 3x=456,a=9,id(a)=4452857216 4x=789,a=9,id(a)=4452857216

投稿2020/07/03 03:27

編集2020/07/03 03:29
yymmt

総合スコア1615

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

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

0

自己解決

問題はどうやらcons_listだったようです。

【該当部分】

python

1cons_list = [lambda x: cons(x,i) for i in range(len(a))]

ここでリスト内記法を用いると中身の関数が全て同じになってしまうようです。
なので、cons_listは作らずにoptsを以下のようにすると異なる結果を一度に取得できました。

python

1import numpy as np 2from scipy.optimize import minimize 3 4def objective_function(x): 5 return - x[0]**0.5 * x[1]**0.5 6 7def constraint(x,a,b): 8 x,a = np.array(x),np.array(a) 9 return b - x@a 10 11reps = 100 #繰り返し回数 12 13a_init = [50,200] #制約条件係数の基準値 14a_shock = np.array([np.random.rand(reps)*50+50,np.zeros(reps)]).T #係数をランダムに変更 15a = a_init + a_shock 16b = 10000 17 18cons = lambda x,i: constraint(x,a[i],b) 19bnds = ((0,None),(0,None)) 20 21opts = lambda i: minimize(objective_function, #目的関数 22 (15,5), #初期値 23 method='SLSQP', 24 bounds=bnds, 25 constraints={'type':'eq', 'fun':lambda x:cons(x,i)}) 26 27res = [opts(i).x for i in range(reps)] 28res

実行結果

python

1#毎回結果が異なっている 2[array([37.59090689, 25.00025669]), array([40.62532566, 24.99999821]), array([45.94143763, 24.99998405]), array([38.30967904, 24.99999733]), ...

投稿2020/07/03 00:55

taku_ant

総合スコア2

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

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

0

ご質問のコードを何度実行しても再現できませんでした(全て同じ値が出力されました)。
(ある特定のa_shockが原因か、あるいは、モジュールのバージョンが原因かわかりません)
少なくともprint(opts(0).x)とprint(opts(1).x)が異なることはありませんでした。
本当にご質問のような結果が得られたのですか?

text

1[41.14691214 24.99999917] 2[41.14691214 24.99999917] 3[array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917]), array([41.14691214, 24.99999917])] 4インデックス1: [41.14691214 24.99999917] 5インデックス2: [41.14691214 24.99999917]

この結果を再現したa_shockの値

text

1array([[86.94631736, 0. ], 2 [88.24059994, 0. ], 3 [63.88071978, 0. ], 4 [97.57583615, 0. ], 5 [59.1515068 , 0. ], 6 [76.57500374, 0. ], 7 [62.57463254, 0. ], 8 [71.99813083, 0. ], 9 [79.11855668, 0. ], 10 [84.37097279, 0. ], 11 [56.33228482, 0. ], 12 [76.90794869, 0. ], 13 [88.78803925, 0. ], 14 [72.86546644, 0. ], 15 [64.55730109, 0. ], 16 [87.66662926, 0. ], 17 [68.26486145, 0. ], 18 [89.0884346 , 0. ], 19 [51.9560971 , 0. ], 20 [91.22909041, 0. ], 21 [75.41843306, 0. ], 22 [91.10976738, 0. ], 23 [73.51168527, 0. ], 24 [89.40328009, 0. ], 25 [53.81101371, 0. ], 26 [61.98393568, 0. ], 27 [54.71236022, 0. ], 28 [67.17937382, 0. ], 29 [98.55481394, 0. ], 30 [77.88477456, 0. ], 31 [73.64123646, 0. ], 32 [94.04620222, 0. ], 33 [58.52606914, 0. ], 34 [81.7636329 , 0. ], 35 [69.39601077, 0. ], 36 [72.49074165, 0. ], 37 [77.33081577, 0. ], 38 [77.02725975, 0. ], 39 [59.50171833, 0. ], 40 [95.2699818 , 0. ], 41 [97.16985503, 0. ], 42 [83.2670286 , 0. ], 43 [52.5908398 , 0. ], 44 [56.48330684, 0. ], 45 [87.88075307, 0. ], 46 [63.01896622, 0. ], 47 [89.89313833, 0. ], 48 [51.57691706, 0. ], 49 [81.922707 , 0. ], 50 [94.3653957 , 0. ], 51 [85.20211311, 0. ], 52 [78.60473673, 0. ], 53 [60.04666014, 0. ], 54 [54.09208572, 0. ], 55 [72.95415372, 0. ], 56 [75.09743132, 0. ], 57 [60.1501105 , 0. ], 58 [68.80185706, 0. ], 59 [83.84797023, 0. ], 60 [98.53367147, 0. ], 61 [65.52482817, 0. ], 62 [50.90285463, 0. ], 63 [82.66954479, 0. ], 64 [88.0250928 , 0. ], 65 [60.12744854, 0. ], 66 [95.11834392, 0. ], 67 [98.78607007, 0. ], 68 [98.39624051, 0. ], 69 [94.87834786, 0. ], 70 [76.22672687, 0. ], 71 [60.67453039, 0. ], 72 [99.30529285, 0. ], 73 [67.59547283, 0. ], 74 [70.21665278, 0. ], 75 [58.52796051, 0. ], 76 [82.91705426, 0. ], 77 [99.79190275, 0. ], 78 [94.23850625, 0. ], 79 [96.80085235, 0. ], 80 [88.94066684, 0. ], 81 [88.09091175, 0. ], 82 [52.63167066, 0. ], 83 [82.86003197, 0. ], 84 [91.62778404, 0. ], 85 [98.19051657, 0. ], 86 [69.39058311, 0. ], 87 [97.77421829, 0. ], 88 [83.57513457, 0. ], 89 [54.43381656, 0. ], 90 [54.03169961, 0. ], 91 [54.59933567, 0. ], 92 [78.88361243, 0. ], 93 [82.9944889 , 0. ], 94 [55.94026688, 0. ], 95 [56.15304813, 0. ], 96 [63.84645291, 0. ], 97 [56.79068478, 0. ], 98 [97.46527693, 0. ], 99 [86.68915797, 0. ], 100 [64.58626962, 0. ]])

投稿2020/07/02 17:33

編集2020/07/03 00:55
Penpen7

総合スコア698

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問