我在研究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))
1条答案
按热度按时间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)。