最終的には、Python ではなく C で numpy ベクトル化と関数呼び出しを利用するために、以下のコードの明示的なループをすべて削除したいと考えています。
以下は、python で numpy を使用するために簡略化されています。次の二次関数があります。
def quadratic_func(a,b,c,x):
return a*x*x + b*x + c
入力データ x と同じサイズの出力データ y を指定して、a、b、c の選択を最適化しようとしています (もちろん、これは線形回帰によって行う必要がありますが、ユーモアがあります)。len(x)=100 とします。長さ 100 の結果を取得するために、スカラー a、b、c で簡単にベクトル化できます。
a、b、c が [-10,10] の範囲内にある必要があることがわかっているとします。グリッドを構築し、最小二乗誤差の点を選択して最適化します。
a=np.arange(-10.0, 10.01, 2.0)
nodes=np.array(np.meshgrid(a,a,a)).T.reshape(-1,3) #3-d cartesian product with array of nodes
1331 個のノードのそれぞれについて、長さ 100 の戻り値の 1331 個すべてを計算したいと思います。
res=[]
x=np.random.uniform(-5.0,5.0, 100)
for node in nodes:
res.append(quadratic_func(*node, x=x))
x で quadratic_func を呼び出した結果である 100 個の値を持つ 1331 個のアイテムのリストを取得するためにブロードキャストを利用するにはどうすればよいですか? 答えは、ベクトル化、ブロードキャストなどを使用して、私が探している桁違いの速度向上を得る必要があります。また、答えはquadratic_funcへの呼び出しを使用する必要があります-またはより一般的にはmy_func(* node、x = x)です。
実生活では、凸に近くなく、多くの極小値を持つ非線形関数を最適化しています。「正しい」極小値に到達できる場合に使用するのに最適な関数形式です。その方法は既に知っていますが、より速く到達したいと考えています!