Pyro in sklearn.gaussian_process

Hi, I’m using pyro to optimize my agent model, below is my code:

X = data_1[‘params’] #130×3
Cp_E = data_1[‘Cp_E’] #the obs, which is 400×1
Y = data_1[‘Cp_M’] #130×400
X = torch.tensor(X, dtype=torch.float)
Y = torch.tensor(Y, dtype=torch.float)
Cp_E = torch.tensor(Cp_E, dtype=torch.float)
gaussian=GaussianProcessRegressor()
fiting=gaussian.fit(X, Y)

r1 = 0.
r2 = 0.
r3 = 0.
def model(r1, r2, r3):
   beta2 = pyro.sample(“beta2”, dist.Uniform(r1, 0.5))
   betaStar = pyro.sample(“betaStar”, dist.Uniform(r2, 0.5))
   a1 = pyro.sample(“a1”, dist.Uniform(r3, 1))
   Z = np.array([beta2, betaStar, a1])
   YX=gaussian.predict(Z.reshape(1, -1))
   #the YX has 400 numbers, which is 400×1
   YX = pyro.param(“YX”, torch.tensor(YX))
   return YX
conditioned_model = pyro.condition(model, data={“YX”: Cp_E})
#the Cp_E is the observed value, which is 400×1

def guide(r1, r2, r3):
   mean1 = pyro.param(“mean1”, torch.tensor(0.08))
   mean2 = pyro.param(“mean2”, torch.tensor(0.09))
   mean3 = pyro.param(“mean3”, torch.tensor(0.31))
   va1 = pyro.param(“va1”, torch.tensor(1.), constraint=constraints.positive)
   va2 = pyro.param(“va2”, torch.tensor(1.), constraint=constraints.positive)
   va3 = pyro.param(“va3”, torch.tensor(1.), constraint=constraints.positive)
   beta2 = pyro.sample(“beta2”, dist.Normal(mean1, va1))
   betaStar = pyro.sample(“betaStar”, dist.Normal(mean2, va2))
   a1 = pyro.sample(“a1”, dist.Normal(mean3, va3))

from pyro.infer import SVI, Trace_ELBO
svi = SVI(model=conditioned_model, guide=guide, optim=Adam({“lr”: .001, “betas”: (0.95, 0.999)}), loss=Trace_ELBO())
losses, beta2, betaStar, a1 = , , ,
num_steps = 5000
for t in range(num_steps):
   losses.append(svi.step(r1, r2, r3))
   beta2.append(pyro.param(“mean1”).item())
   betaStar.append(pyro.param(“mean2”).item())
   a1.append(pyro.param(“mean3”).item())

The problem is the “mean1”, “mean2” and “mean3” have the same value in these 5000 steps, and the losses are all inf.
But when I make the model as:

r1 = 0.0828
r2 = 0.09
r3 = 0.31
def model(r1, r2, r3):
   beta2 = pyro.sample(“beta2”, dist.Normal(r1, 1))
   betaStar = pyro.sample(“betaStar”, dist.Normal(r2, 1))
   a1 = pyro.sample(“a1”, dist.Normal(r3, 1))
   Z = np.array([beta2, betaStar, a1])
   YX=gaussian.predict(Z.reshape(1, -1))
   YX = pyro.param(“YX”, torch.tensor(YX))
   return YX

the losses are falling, the value of “mean” also changed, but did not achieve the optimized effect.
Actually I also want to real-time monitor the changes of “beta2”, “betaStar” and “a1” at each step, but I can’t get them by pyro.get_param_store().items(), so I just monitor the mean value of these parameters.

My problem has not been solved yet, I would like to ask any suggestions, thanks in advance.

What is GaussianProcessRegressor()? Is that a scikit-learn object? If so, you can’t use it in a Pyro model because PyTorch cannot propagate gradients through NumPy/SciPy functions.

Please see GPyTorch or pyro.contrib.gp for PyTorch/Pyro-compatible Gaussian process models.

Yes, it’s a scikit-learn object. I’m so sad to hear that.
I have tried the pyro.contrib.gp, but I did not realize its high-dimensional input and output, I will try again, thank you for your prompt reply.