【问题标题】:Function minimization using minimize from scipy使用来自 scipy 的最小化函数最小化
【发布时间】:2021-10-25 00:07:33
【问题描述】:

我想最小化以下成本函数

其中 h_u 和 h_v 是实数向量。 我在 Python 中执行此操作,但我不确定 scipy.optimize 包中的函数 minimize 是否是我需要的。

我的方法如下: 给定h_uh_v 作为两个具有维度的矩阵

print(h_u.shape, h_v.shape)
>>>(12458, 7) (12458, 7)

我定义目标函数

fun = lambda h: (h[0]*h[1]).mean()

然后我堆叠向量

h_in = np.stack((h_u, h_v), axis = 0)

并尽量减少

minimized = minimize(fun, x0 = h_in)

我不确定提供h_in 作为初始猜测x0 是否正确,因为它会产生错误

MemoryError: Unable to allocate 227. GiB for an array with shape (174412, 174412) and data type float64

有人能告诉我我是否正确执行了操作,我该如何规避错误? 谢谢!

【问题讨论】:

    标签: python optimization minimization


    【解决方案1】:

    使用 scipy.optimize.minimize 不适合您的问题,因为它适用于连续问题(其大多数方法使用梯度)。

    我没有计算内存使用量,但总的来说我会提出这样的建议;如果内存不足以容纳整个列表推导式,您可以将其分解为推导式内的一个循环并遍历其他向量,缓存结果并将它们与该向量的新找到的最小值进行比较。

    import numpy as np
    
    a = np.ones((5,2)).T
    a[0,:] *= 2
    
    b = np.arange(10).reshape((5,2)).T
    
    min_index_flat = np.argmin([sum(i*j) for i in a for j in b])
    
    min_index_a = min_index_flat // len(a)
    min_index_b = min_index_flat % len(b)
    

    编辑:假设您想找到所有可能组合中的最小值;我刚刚意识到这取决于您的集合epsilon,但如果您只想成对比较,代码会变得更容易:min_index_flat = np.argmin([sum(i*j) for i,j in zip(a,b)])

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2019-03-21
      • 2019-07-20
      • 2019-03-21
      相关资源
      最近更新 更多