如何使用Pytorch进行带约束优化的极大似然估计

mgdq6dx1  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(373)

我在研究Pytorch,我在试着构造一个代码来得到最大似然估计。
我想在优化过程中加入一些限制,以考虑参数限制(参数空间),但在pytorch.optim中,我们似乎没有这样的东西。
例如,我想得到一个正态分布的最大似然估计,其均值为mu,标准差为sigma,其中mu是一个真实的,sigma是一个正数。
这样,我想在我的代码中对sigma进行一个限制,使其始终为posti
这里我的代码:


##### PACKAGES

import numpy as np
from scipy.integrate import quad
from scipy.optimize import minimize_scalar
import torch
from matplotlib import pyplot as plt
import pandas as pd
import math 

##### SAMPLE

np.random.seed(3)
sample = np.random.normal(loc=5, scale=2, size=(1000, 1))

##### TENSORS

X = torch.tensor(sample, dtype=torch.float64, requires_grad=False) ## X: sample
mu_ = torch.tensor(np.array([0.5]), dtype=torch.float64, requires_grad=True) ## mu: mean
s_ = torch.tensor(np.array([5]), dtype=torch.float64, requires_grad=True) ## s: standart desviation

##### OPTMIZATION METHOD: SGD

learning_rate = 0.0002
OPT_OBJ = torch.optim.SGD([mu_, s_], lr = learning_rate)

##### OPTIMAZTION METHOD

for t in range(2000):
    NLL = X.size()[0]*s_.log()+((((X-mu_)/s_ ).pow(2))/2).sum() ## negative log-likelihood
    OPT_OBJ.zero_grad()
    NLL.backward()

    if t % 100 == 0:
        print("Log_Likehood: {}; Estimate mu: {}; Estimate sigma: {}".format(NLL.data.numpy(), mu_.data.numpy(), s_.data.numpy()))

    OPT_OBJ.step()

print("True value of mu and sigma: {} e {}".format(5, 2))
s4chpxco

s4chpxco1#

您可以尝试使用torch.clamp()对Tensor设置约束(文档位于:https://pytorch.org/docs/stable/generated/torch.clamp.html)的数据。
否则,如果你只想保持标准差sigma为正值,ReLU函数会取0和输入元素之间的最大值(请参阅https://pytorch.org/docs/stable/generated/torch.nn.ReLU.html?highlight=torch%20nn%20relu#torch.nn.ReLU)。

相关问题