import numpy as np from scipy.optimize import minimize class GPR(object): def __init__(self, optimize=True): self.is_fit = False self.train_X, self.train_y = None, None self.params = {"l": 0.5, "sigma_f": 0.2} self.optimize = optimize def fit(self, X, y): # store train data self.train_X = np.asarray(X) self.train_y = np.asarray(y) def negative_log_likelihood_loss(params): self.params["l"], self.params["sigma_f"] = params[0], params[1] Kyy = self.kernel(self.train_X, self.train_X) + 1e-8 * np.eye(len(self.train_X)) loss = 0.5 * self.train_y.T.dot(np.linalg.inv(Kyy)).dot(self.train_y) + 0.5 * np.linalg.slogdet(Kyy)[ 1] + 0.5 * len(self.train_X) * np.log(2 * np.pi) return loss.ravel() if self.optimize: res = minimize(negative_log_likelihood_loss, [self.params["l"], self.params["sigma_f"]], bounds=((1e-4, 1e4), (1e-4, 1e4)), method='L-BFGS-B') self.params["l"], self.params["sigma_f"] = res.x[0], res.x[1] self.is_fit = True def predict(self, X): if not self.is_fit: print("GPR Model not fit yet.") return X = np.asarray(X) Kff = self.kernel(self.train_X, self.train_X) # (N, N) Kyy = self.kernel(X, X) # (k, k) Kfy = self.kernel(self.train_X, X) # (N, k) Kff_inv = np.linalg.inv(Kff + 1e-8 * np.eye(len(self.train_X))) # (N, N) mu = Kfy.T.dot(Kff_inv).dot(self.train_y) cov = Kyy - Kfy.T.dot(Kff_inv).dot(Kfy) return mu, cov def kernel(self, x1, x2): dist_matrix = np.sum(x1 ** 2, 1).reshape(-1, 1) + np.sum(x2 ** 2, 1) - 2 * np.dot(x1, x2.T) return self.params["sigma_f"] ** 2 * np.exp(-0.5 / self.params["l"] ** 2 * dist_matrix) if __name__ == '__main__': def y_2d(x, noise_sigma=0.0): x = np.asarray(x) y = np.sin(0.5 * np.linalg.norm(x, axis=1)) y += np.random.normal(0, noise_sigma, size=y.shape) return y train_X = np.random.uniform(-4, 4, (10, 3)) train_y = y_2d(train_X, noise_sigma=1e-4) print(train_X.shape, train_y.shape) test_X = np.random.uniform(-10, 10, (10, 3)) gpr = GPR(optimize=True) gpr.fit(train_X, train_y) mu, cov = gpr.predict(test_X) print(mu)
标签:高斯,sigma,回归,train,params,np,numpy,self,dot From: https://www.cnblogs.com/zhangxianrong/p/16996938.html