Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用优化-python实现_Python_Numpy_Optimization_Gradient - Fatal编程技术网

通用优化-python实现

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

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

人工调谐程序示例:

1) 输入矩阵

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

3) 以np.dot(输入,权重)/sum(np.dot(输入,权重))正常的方式变换输入向量的权重
[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]
对于示例数据的比例,以下是解决方案:

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()
来解决,但它需要将你的问题简化为一个线性的euqation。

我不清楚你在问什么<代码>问题是-权重向量的值应该加在特定的数字上,比如说2
这是什么意思?为什么正常化很重要?通常,您需要安装一个规范化器,然后该规范化器就可以转换新数据了。另外:这是为了研究/学习目的吗?因为有很多好的软件为你做这件事。我的意思是我的权重在它们的和中是固定的-这些值的和应该正好是2。这听起来像是一个np难问题,一般来说是不可行的!这也不再是一个凸优化问题。当然,你可以得到一个近似解,加上一个惩罚项,这个惩罚项对这个值的偏差是有效的。但是。。我认为仍然是非凸的(这意味着:很难优化)。编辑:也许我的感觉是错的。如果使用惩罚项,它应该是凸的。这是为了生物信息学研究——我不想在我的帖子里充斥生物学,它通常只是使问题的核心复杂化。现在,通过用近似解猜测适当的值,在excel表格中解决了这个问题。我想知道是否有更好的方法梯度下降通常用于非应变优化,所以您可能需要使用一些惩罚方法。制定一个二次规划是很容易的,就像上面推荐的那样惩罚偏差。OP在数学方面很吃力,而且看起来肯定像是想学习的人。我建议为未来的读者添加一些解释,毕竟堆栈溢出不是一种代码编写服务。感谢您的回复!我将在更大的数据集上测试它,并让您知道。正如安德拉斯所提到的,我也将欣赏任何理论见解。本规范中隐藏了一些假设/模型决策(损失+惩罚与1.0五分系数一起最小化?),提及这些将非常棒。在我看来,即使是一个有numpy意识的(非大师级)用户,在看到类似
np\r\uu
的东西时也会挣扎。尽管如此:有趣的代码。哦,对不起,我忘了提到解决方案不应该有负值。让我粘贴手动调谐输入/输出的示例: