我很好奇有一种直接的方法可以将scipy.optimize.minimize
与多个采用不同形状的变量结合起来。例如,让我们看一下矩阵分解问题。
我道歉,但我会在这里使用乳胶,希望有一天SO能够实施它。
我们可以将矩阵$ A_ {n \ times m} $解构为两个矩阵$ W_ {k \ times n} $和$ H_ {k \ times m} s.t. A \大约W ^ TH $
有许多解决W
和H
的方法,但这只是一个示例问题。
我们可以通过首先定义一个成本函数来解决scipy.optimize.minimize
这个问题,可能是该函数的一阶和二阶导数,然后初始化W
和H
并使用{{1计算最小化函数的minimize
和W
的值。我们这样做:
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]]
参数,然后在每个函数中将其拆分为x0
和W
。这个例子非常简单,但在更复杂的问题中,这可能会有点恼人/丑陋。此外,它感觉很骇人。
有多个变量使用H
的文档(请参阅Scipy lecture notes: 2.7. Mathematical optimization: finding minima of functions),而不是多个不同形状的数组。这一行也存在SO问题,如Multiple variables in SciPy's optimize.minimize,但同样没有提到变量是数组。
因此,我想知道是否有更优雅的方法将多个数组作为参数传递给minimize
。类似于:
minimize
哪个不起作用,但似乎更直接。