fmin (scipy) 并理解 python 中函数的参数传递

问题描述 投票:0回答:1

这几天我一直在尝试理解

fmin
的参数传递。

这是为了我们的练习而给出的:

import numpy as np
import matplotlib.pyplot as plt

from scipy.optimize import fsolve, fmin
from scipy.misc import derivative
from numpy import array

MU = 1.3
SIGMA = 4.5
N = 1000
N_BINS=20

data = np.random.normal(MU, SIGMA, N)
#print(data)

法线函数的定义(从绘图来看似乎可行):

def normalpdf(x,mu,sigma): 
    return ((1/(sigma*np.sqrt(2*np.pi)))*(np.exp(-(((x-mu)**2))/(2*sigma**2))))

plt.plot(data, normalpdf(data,MU,SIGMA),'.', color='purple')

似然函数的定义(不确定它是否正确,请参阅下面的注释以及其他学生版本的替代方案,我确实得到了一个图,所以从技术上讲,它是一个工作函数):

def vect_q():
    q=[MU,SIGMA]
    return q

Logln=0
def LogL(q):
    return  Logln + (- np.log(normalpdf(data,q[0],q[1])))` 

#q=vect_q()
#result_LogL=LogL(q)
#print (result_LogL)       
                   
#LnL=sorted(LogL(q))
#plt.plot(LnL)

这是带有

fmin
的块不起作用。查看我尝试过的所有内容,并进一步查看不同的错误消息。

x0 = 1
q=vect_q
minimum = fmin(LogL,x0,(q[0],q[1]))
print(minimum)

我尝试过的:

所以我搜索

fmin
-错误并得到了与我的情况类似的答案:Scipy fmin参数传递 但还是不行(数组的显式表示法,而且
args
似乎不是问题)。

从1和2我推断出我不能使用向量,从另一个我不明白元组和列表之间的区别(我读到元组是不可修改的,但我不知道为什么我有它)。但我认为我真正的问题是给出的 1 个位置参数而不是 2 个(或 3 个)?

这就是我尝试过的(我想要的是该

LogL
函数的最小值)

  1. TypeError: can only concatenate tuple (not "function") to tuple
q=vect_q
minimum = fmin(LogL,x0,q)
  1. TypeError: 'function' object is not subscriptable
q=vect_q
minimum = fmin(LogL,x0,(q[0],q[1]))
  1. TypeError: can only concatenate tuple (not "list") to tuple
minimum = fmin(LogL,x0,args=q)
  1. TypeError: LogL() takes 1 positional argument but 2 were given
minimum = fmin(LogL,x0,args=(q,))
  1. TypeError: can only concatenate tuple (not "list") to tuple
minimum = fmin(LogL,x0,args=[MU,SIGMA])
  1. TypeError: LogL() takes 1 positional argument but 3 were given
minimum = fmin(LogL,x0,(MU,SIGMA)) 
  1. TypeError: can only concatenate tuple (not "float") to tuple
minimum = fmin(LogL,x0,args=(MU))
  1. ValueError: setting an array element with a sequence.
minimum = fmin(LogL,x0,args=())

从其他学生那里,我得到了这个解决方案:

def LogL(q):
    return -np.sum(np.log(normalpdf(data, q[0],q[1])))
minimum = fmin(LogL, [MU,SIGMA])

所以我想知道为什么它对我不起作用,为什么那个学生似乎得到了一个值而不是一个函数,以及为什么它仍然可以获得最小值。

python scipy parameter-passing
1个回答
0
投票

删除所有代码并编写

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

MU = 1.3
SIGMA = 4.5
N = 1000
N_BINS=20

rand = np.random.default_rng(seed=0)  # for repeatability
data = np.random.normal(loc=MU, scale=SIGMA, size=N)

# Log-likelihood of a normal distribution
loc, scale = norm.fit(data=data)

fig, ax = plt.subplots()
ax.hist(data, density=True)
x = np.linspace(start=MU - 12, stop=MU + 12, num=200)
ax.plot(x, norm.pdf(x, loc=loc, scale=scale))
plt.show()

plot of histogram

© www.soinside.com 2019 - 2024. All rights reserved.