【问题标题】:Marginal Likelihood optimization with python使用 python 进行边际似然优化
【发布时间】:2021-02-10 17:26:39
【问题描述】:

我正在尝试优化边际似然来估计高斯过程回归的参数。 所以我用这种方式定义了边际对数似然:

def marglike(par,X,Y):
l,sigma_n = par
n = len(X)
dist_X = (X.T - X)**2
k = np.exp(-(1/(2*(l**2)))*dist_X)
inverse = np.linalg.inv(k + (sigma_n**2)*np.eye(len(k))) 
ml = (1/2)*np.dot(np.dot(Y.T,inverse),Y) + (1/2)*np.log(np.linalg.det(k + (sigma_n**2)*np.eye(len(k)))) + (n/2)*np.log(2*np.pi)
return ml

其中要优化的参数是“l”和“sigma_n”。 有了一些初始值和数据,函数会返回一些值:

X = np.linspace(1,10,20)
F = np.sin(X)
start = np.array([1,0.05]) #initial parameters values

marglike(start,X,F)

marglike(start,X,F)
Out[75]: array([[1872.6511786]])

但是当我尝试使用“最小化”优化参数时,我得到了这个:

re = minimize(marglike,start,args=(X,F),method="BFGS",options = {'disp':True})

re = minimize(marglike,start,args=(X,F),method="BFGS",options = {'disp':True})
Optimization terminated successfully.
     Current function value: 22.863446
     Iterations: 8
     Function evaluations: 60
     Gradient evaluations: 15

re.x
Out[89]: array([1.        , 0.70845989])

我不知道为什么,但参数“l”似乎没有优化,但它与我修复的起始值匹配。

有什么建议吗?

【问题讨论】:

    标签: python optimization scipy-optimize-minimize gaussian-process


    【解决方案1】:

    您需要先将 X 重塑为 2d 才能使 X.T-X 工作。此外,您还需要在优化中添加一个称为方差的参数(下面代码中的var)。如果下面的代码解决了您的问题,请告诉我。

    from scipy.optimize import minimize
    
    def marglike(par,X,Y):
      # print(par)
      l,var,sigma_n = par
      n = len(X)
      dist_X = (X - X.T)**2
      # print(dist_X)
      k = var*np.exp(-(1/(2*(l**2)))*dist_X)
      inverse = np.linalg.inv(k + (sigma_n**2)*np.eye(len(k))) 
      ml = (1/2)*np.dot(np.dot(Y.T,inverse),Y) + (1/2)*np.log(np.linalg.det(k + (sigma_n**2)*np.eye(len(k)))) + (n/2)*np.log(2*np.pi)
      return ml
    
    X = np.linspace(1,10,20).reshape(-1,1) # Reshaping
    F = np.sin(X)
    start = np.array([1.1,1.6,0.05]) #initial parameters values
    print(marglike(start,X,F))
    
    re = minimize(marglike,start,args=(X,F),method="L-BFGS-B",options = {'disp':True})
    re.x
    

    【讨论】:

    • 您好,首先感谢您的回答。代码似乎以这种方式工作。关于新参数“var”,我避免将其放入,因为可以通过封闭形式计算它(Robert B. Gramacy 的代理)。一旦我输入公式,我不应该把它平方吗? (与“l”和“sigma_n”一样)
    • 还有,sigma_n的结果是负值,既然是方差,怎么可能?
    • 我不知道是否可以以封闭形式计算 var。感谢您让我知道,您能否指导我找到我可以知道如何准确执行此操作的资源。如果我们想将 var 解释为方差,则无需平方,但如果作为标准差 (sigma),我们需要对其进行平方。现在,关于 sigma_n 为负数,我们需要在最小化方法中设置边界以避免这种情况。一般来说,我已经看到 (10^-5, 10^5) 的界限,但将其设置为正值也应该有效
    • 啊,好吧,我想我明白了,所以对于相同的逻辑,我应该删除 sigma_n 和 l 的平方形式?!关于封闭式,您可以查看这本书:Robert B. Gramacy 为应用科学提供的代理高斯过程建模、设计和优化如果找不到,我可以为您提供!
    • 不,如果我们想维持社区中对 sigma_n(噪声)、l(长度尺度)和 sigma_f(标准差)的解释方式,我们不应该删除正方形。虽然我不确定,但我认为 square 也有助于优化中的梯度计算。我想说参考著名的库 GPy 并深入研究源代码。非常感谢这本书。它看起来很适合应用科学!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2022-09-26
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多