Python 收敛于极小值

Python 收敛于极小值,python,minimize,Python,Minimize,下面的代码假设给我函数达到其最小值的两个变量的最小值。但是,当我运行它时,我经常无法获得正确的值,并出现以下错误: tnc:达到的最大功能评估数 我想问题是程序收敛速度不够快。我怎样才能解决这个问题?(我给出的值尽可能接近我预期的初始参数) 将numpy导入为np 从scipy.optimize导入最小化 从随机输入高斯 从matplotlib导入pyplot作为plt 从scipy.stats导入norm 输入数学 值=[] 而len(值)

下面的代码假设给我函数达到其最小值的两个变量的最小值。但是,当我运行它时,我经常无法获得正确的值,并出现以下错误:

tnc:达到的最大功能评估数

我想问题是程序收敛速度不够快。我怎样才能解决这个问题?(我给出的值尽可能接近我预期的初始参数)

将numpy导入为np
从scipy.optimize导入最小化
从随机输入高斯
从matplotlib导入pyplot作为plt
从scipy.stats导入norm
输入数学
值=[]
而len(值)<10000:
数值=高斯(10,20)
如果-100<值<100:
values.append(值)
n、 容器,补丁=plt.hist(值50,facecolor='green')
x=np.arange(-100100,0.01)
料仓宽度=料仓[5]-料仓[4]
中心=[]
错误=[]
对于范围内的i(len(n)):
中心=中心+[(2个箱子[i]+箱子宽度)/2]
error=error+[np.sqrt(n[i])]
def高斯(x,μ,σ,范数):
f=范数*1/np.sqrt(2*np.pi)*1/sigma*np.exp(-(x-mu)**2/2/sigma**2)
返回f
类def(x):
f=0
对于范围内的i(len(n)):
f=f-(np.log(1/np.sqrt(2*np.pi))+0.5*np.log(1/(x[1]**2))-(n[i]-高斯(中心[i],x[0],x[1],x[2])**2/(2*x[1]**2))
返回f
初始值=np.数组([10,20,159681])
res=minimize(比如,initial_val,method='TNC',bounds=((1,None),(1,None),(1,None)),options={'xtol':1e-8,'disp':True})
mu=res.x[0]
西格玛=res.x[1]
norm=res.x[2]
x_轴=np.arange(-100100,0.01)
y=标准*1/np.sqrt(2*np.pi)*1/sigma*np.exp(-(x-mu)**2/2/sigma**2)
平面图(x,y)
如果(关于成功):
打印“是”
其他:
打印“否”
打印res.x
plt.show()

在退出之前,它要进行多少次迭代?当最小化时,可以考虑传递一个
maxiter
参数。例如,
options={'xtol':1e-8,'disp':True,'maxiter':1000}
。也可以考虑设置<代码>界限< /代码>parameter@Ryan我使用了MaxIt,它似乎不再给我这个错误,但现在我得到了:TNC:线性搜索故障编辑可能会考虑将<代码>回调< /代码>参数设置为自定义函数,打印出正在发生的事情。(当前参数向量和相应的目标函数结果)在每次迭代后;这可能有助于故障排除/参数修改
import numpy as np
from scipy.optimize import minimize
from random import gauss
from matplotlib import pyplot as plt
from scipy.stats import norm
import math

values = []
while len(values) < 10000:
    value = gauss(10, 20)
    if -100 < value < 100:
        values.append(value)

n, bins, patches = plt.hist(values, 50, facecolor='green')
x=np.arange(-100,100,0.01)
binWidth=bins[5]-bins[4]
centre=[]
error=[]
for i in range(len(n)):
    centre=centre+[(2 * bins[i] + binWidth) / 2]
    error = error + [np.sqrt(n[i])]

def gauss(x, mu, sigma, norm):
    f = norm * 1 / np.sqrt(2 * np.pi) * 1 / sigma * np.exp(-(x - mu) ** 2 / 2 / sigma ** 2)
    return f

def like(x):
    f = 0
    for i in range(len(n)):
        f = f - (np.log(1 / np.sqrt(2 * np.pi)) + 0.5 * np.log(1 / (x[1] ** 2)) - (n[i] - gauss(centre[i], x[0], x[1], x[2])) ** 2 / (2 * x[1] **2))
    return f

initial_val = np.array([10, 20, 159681])

res = minimize (like,initial_val, method='TNC', bounds=((1, None), (1, None),(1, None)), options={'xtol': 1e-8, 'disp': True})

mu = res.x[0]
sigma = res.x[1]
norm = res.x[2]
x_axis = np.arange(-100, 100, 0.01)
y = norm * 1 / np.sqrt(2 * np.pi) * 1 / sigma * np.exp(-(x - mu) ** 2 / 2 / sigma ** 2)
plt.plot(x, y)

if(res.success):
    print "YES"
else:
    print "NO"
print res.x
plt.show()