给定shape = (t,m,n)
的数据,我需要找到一个形状为(n,)
的矢量变量,该变量将数据和矢量的凸函数最小化。我已经使用cvxopt(和cvxpy)来使用2D输入执行凸优化,但是似乎它们不支持3D数组。有没有办法使用这些或其他类似的程序包来实现这种凸优化?
给出形状为(t,m,n)
和(t,m)
的数据以及形状为(n,)
的var,这是我需要最小化的函数类型的简化:
import numpy as np
obj_func(var,data1,data2):
#data1.shape = (t,m,n)
#data2.shape = (t,m)
#var.shape = (n,)
score = np.sum(data1*var,axis=2) #dot product along axis 2
time_series = np.sum(score*data2,axis=1) #weighted sum along axis 1
return np.sum(time_series)-np.sum(time_series**2) #some function
这似乎应该是一个简单的凸优化,但是不幸的是,cvxopt / cvxpy中的N维数组不支持这些函数。有办法实现吗?
答案 0 :(得分:0)
我认为,如果您只是将data1
的形状暂时改成2d,就可以了,例如
import numpy as np
import cvxpy as cp
t, m, n = 10, 8, 6
data1 = np.ones((t, m, n))
data2 = np.ones((t, m))
x = cp.Variable(n)
score = cp.reshape(data1.reshape(-1, n) * x, (t, m))
time_series = cp.sum(cp.multiply(score, data2), axis=1)
expr = cp.sum(time_series) - cp.sum(time_series ** 2)
print(repr(expr))
输出:
Expression(CONCAVE, UNKNOWN, ())