【问题标题】:General optimization - implementation in python一般优化 - 在 python 中的实现
【发布时间】:2016-10-02 00:05:24
【问题描述】:

我目前正在努力解决梯度下降实现问题,更多的是在数学方面。我有一个输入值矩阵,例如 - [[1,1,0,2],[2,3,5,1],[2,1,8,0]]。我想计算将最小化输出向量误差的权重,最小化函数是标准线性模型,所以我的假设是最小化-> np.dot(input,weights)-y。问题是 - 权重向量的值应该添加到特定的数字,比如 2。输出向量也被归一化,例如np.dot(input,weights)/sum(np.dot(input,weights)) - 然后将该结果与所需的输出向量进行比较。我应该如何在 python/numpy 中定义这个任务?

人工调整程序示例:

1) 输入矩阵 [[4,0,2,0,2,0],[2,0,0,2,2,0],[2,0,0,2,2,0],[4,0,2,0,0,0],[0,0,2,0,0,2],[0,4,0,0,0,2],[0,2,0,0,0,2],[0,2,2,0,0,0],[0,0,2,0,0,2],[4,0,2,0,0,0]]

2) 期望的输出[12.94275893,8.07054252,9.281123898,10.53654162,8.698251382,14.67643103,7.158870124,10.26752354,8.324615155,10.0433418]

3) 以 np.dot(input,weights)/sum(np.dot(input,weights)) 的方式转换输入向量的权重 [11,21,18,0,20,14]- 总和固定为 84

4) 最终输出,合理地偏离 2) [15.15,7.83,7.83,10.10,8.08,14.14,8.84,9.85,8.08,10.10]

【问题讨论】:

  • 我不清楚你在问什么。 The problem is - values of weight vector should add to specific number, say 2 什么意思?为什么规范化很重要?通常,您正在安装一个规范器,然后准备好转换新数据。另外:这是出于研究/学习目的吗?因为有很多优秀的软件可以为您做到这一点。
  • 我的意思是我的权重在它们的总和中是固定的 - 这些值的总和应该正好是 2。
  • 这听起来像是一个 np-hard 问题,一般来说这是不可能解决的!它也不再是一个凸优化问题。当然,您可以获得一个近似解,添加一个惩罚项,该惩罚项对与该值的偏差有效。但是好吧..我认为仍然是非凸的(这意味着:很难优化)。 编辑: 也许我的感觉是错误的。如果使用惩罚项,它应该是凸的。
  • 这是用于生物信息学研究的——我不想用生物学来淹没我的帖子,它通常只会使问题的核心复杂化。现在它通过用近似解猜测适当的值在 excel 表中解决。我想知道是否有更好的方法
  • 梯度下降通常用于非约束优化,因此您可能需要使用一些惩罚方法。很容易制定一个二次规划,像上面推荐的那样惩罚偏差。

标签: python numpy optimization gradient


【解决方案1】:

对于示例数据的规模,解决方案如下:

import numpy as np
from scipy import optimize

a = np.array([[1,1,0,2],[2,3,5,1],[2,1,8,0]], dtype=float)
target = np.random.randn(3)
target /= target.sum()

def f(p):
    p = np.r_[p, 2 - p.sum()]
    res = a.dot(p)
    res /= res.sum()
    return res - target

r, _ = optimize.leastsq(f, np.zeros(3))
print(target)
print(np.r_[r, 2 - r.sum()])

输出:

[-0.21987606  0.70869974  0.51117632]
[ 2.15713915  7.47554671  0.38959227 -8.02227813]

这是您的真实数据的代码:

import numpy as np
from scipy import optimize

a = np.array([[4,0,2,0,2,0],
              [2,0,0,2,2,0],
              [2,0,0,2,2,0],
              [4,0,2,0,0,0],
              [0,0,2,0,0,2],
              [0,4,0,0,0,2],
              [0,2,0,0,0,2],
              [0,2,2,0,0,0],
              [0,0,2,0,0,2],
              [4,0,2,0,0,0]], dtype=float)

target = np.array([12.94275893,8.07054252,9.281123898,10.53654162,8.698251382,
                   14.67643103,7.158870124,10.26752354,8.324615155,10.0433418])

target /= target.sum()

def make_vector(x):
    return np.r_[x, 84 - x.sum()]

def calc_target(x):
    res = a.dot(make_vector(x))
    res /= res.sum()
    return res

def error(x):
    return calc_target(x) - target

x, _ = optimize.leastsq(error, np.zeros(a.shape[1] - 1))
print(make_vector(x))
print(calc_target(x) * 100)
print((calc_target(x) - target) * 100)

输出:

[  9.40552097  20.32874298  19.8199082   13.13991088  10.00062863
  11.30528834]
[ 12.90025777   8.63333209   8.63333209  10.2474406    8.25642656
  13.78390749   8.39140263  10.65003363   8.25642656  10.2474406 ]
[-0.04250116  0.56278957 -0.64779181 -0.28910102 -0.44182483 -0.89252354
  1.23253251  0.38251009 -0.0681886   0.2040988 ]

看来numpy.linalg.lstsq()也可以解决这个问题,但是需要把你的问题简化为一个线性的euqations。

【讨论】:

  • OP 在数学方面苦苦挣扎,而且绝对看起来像是想学习的人。我建议为未来的读者添加一些解释,毕竟 Stack Overflow 不是代码编写服务。
  • 感谢您的回复!我将在更大的数据集上对其进行测试并告诉你。正如安德拉斯所说,我也将欣赏任何理论见解。
  • 这段代码中隐藏了一些假设/模型决策(损失 + 惩罚与 1.0 惩罚因子一起最小化?),提及这些真的很棒。甚至(在我看来)具有 numpy 意识(非专家)的用户在看到 np_r_ 之类的内容时也会感到挣扎。尽管如此:有趣的代码。
  • 哦,对不起,我忘了提到解决方案不应该有负值。让我粘贴手动调整输入/输出的示例:
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
相关资源
最近更新 更多