使用Scipy最小化线性数据组合的功能

时间:2015-09-21 16:40:55

标签: python linux optimization scipy linear-algebra

假设我有一些矩阵X,其中每一行代表一个时间序列。例如,X可以是大小为3 x 1000的矩阵,这意味着有3个时间序列,每个时间序列由1000个时间点组成。除了X之外,我在X中的每个时间序列都有一个标量。我想找到一个线性组合

a [0] * X [0,:] + a [1] * X [1,:] + ... + a [n-1] * X [n-1,:]

具有某个函数F的最小值。

所以,我尝试了以下

import numpy as np
from scipy.optimization import minimize
def f(x):
    return 0 # for testing purposes
def obj(a,x):
    y = a*x
    return f(y)
minimize(obj, np.array([1,1]), args=np.array([[1,1],[2,2]]), method='nelder-mead')

所以第二个参数是初始猜测x0(系数a)。 args给出的数据应该映射到x(如果我理解正确的话)并且在优化期间保持不变。

然而,我收到错误

ValueError: setting an array element with a sequence.

我想我的问题非常普遍,所以我希望有人能提供帮助!

1 个答案:

答案 0 :(得分:0)

这样的东西?

import scipy.optimize as opt

def f(val):
    return val**2

def obj(a, series):
    s = 0
    for row in series:
        for t in range(len(row)):
            s += f(a[t] * row[t])
    return s

ll_x = [[2, 3, 2, 6], [3, 5, 2, 7]]  # 2 series
l_a = [1 for _ in ll_x[0]]  # initial coeffs.

res = opt.minimize(obj, l_a, args=ll_x, method='nelder-mead')

for elem in sorted(res.items()):
    print(*elem)

(适用于Python 3.4.3)