利用scipy.optimize.minimize和不同形状的多个变量

时间:2017-08-24 17:05:23

标签: python numpy scipy minimization

我很好奇有一种直接的方法可以将scipy.optimize.minimize与多个采用不同形状的变量结合起来。例如,让我们看一下矩阵分解问题。

我道歉,但我会在这里使用乳胶,希望有一天SO能够实施它。

我们可以将矩阵$ A_ {n \ times m} $解构为两个矩阵$ W_ {k \ times n} $和$ H_ {k \ times m} s.t. A \大约W ^ TH $

有许多解决WH的方法,但这只是一个示例问题。

我们可以通过首先定义一个成本函数来解决scipy.optimize.minimize这个问题,可能是该函数的一阶和二阶导数,然后初始化WH并使用{{1计算最小化函数的minimizeW的值。我们这样做:

H

因此,从最小化函数的输出看,我们成功计算出def f(x, *args): A, w_shape, w_size, h_shape = args W = x[:w_size].reshape(w_shape) H = x[w_size:].reshape(h_shape) sse = 0.5 * np.sum((A - W.T.dot(H))**2) return sse def f_prime(x, *args): A, w_shape, w_size, h_shape = args W = x[:w_size].reshape(w_shape) H = x[w_size:].reshape(h_shape) gw = H.dot(H.T).dot(W) - H.dot(A.T) gh = W.dot(W.T).dot(H) - W.dot(A) return np.concatenate([gw.flatten(), gh.flatten()]) A = np.array([13, 18, 17, 24, 21, 30]).reshape(3,2) W = np.random.rand(2,3) H = np.random.rand(2,2) x0 = np.concatenate([W.flatten(), H.flatten()]) out = so.minimize(f, x0, args=(A, W.shape, W.size, H.shape), jac=f_prime, method='BFGS') print(out['fun']) 2.0172245004128515e-12 W近似H(非常好)。我们也可以检查重建。

A

大!但正如您所看到的,我实现了一些技巧,用于将单个扁平数组传递到Wf = out['x'][:W.size].reshape(W.shape) Hf = out['x'][W.size:].reshape(H.shape) print(Wf.T.dot(Hf)) array([[ 13.00000041, 18.00000054], [ 17.00000062, 23.99999976], [ 21.00000084, 29.99999844]] 参数,然后在每个函数中将其拆分为x0W。这个例子非常简单,但在更复杂的问题中,这可能会有点恼人/丑陋。此外,它感觉很骇人。

有多个变量使用H的文档(请参阅Scipy lecture notes: 2.7. Mathematical optimization: finding minima of functions),而不是多个不同形状的数组。这一行也存在SO问题,如Multiple variables in SciPy's optimize.minimize,但同样没有提到变量是数组。

因此,我想知道是否有更优雅的方法将多个数组作为参数传递给minimize。类似于:

minimize

哪个不起作用,但似乎更直接。

0 个答案:

没有答案