高斯过程回归(GPR)实现中矩阵乘法的ValueError问题排查求助
高斯过程回归(GPR)实现中矩阵乘法的ValueError问题排查求助
我现在用Python实现高斯过程回归(GPR)模型,用的是平方指数核,但在predict方法的矩阵乘法步骤计算均值预测时遇到了ValueError。
我遇到的错误如下:
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 10 is different from 100)
代码细节
以下是引发错误的相关代码:
import numpy as np class SquaredExponentialKernel: def __init__(self, length_scale=1.0, variance=1.0): self.length_scale = length_scale self.variance = variance def __call__(self, x1, x2): dist_sq = np.sum((x1 - x2)**2) return self.variance * np.exp(-0.5 * dist_sq / self.length_scale**2) def cov_matrix(x1, x2, cov_function) -> np.array: return np.array([[cov_function(a, b) for a in x1] for b in x2]) class GPR: def __init__(self, data_x, data_y, covariance_function=SquaredExponentialKernel(), white_noise_sigma: float = 0): self.noise = white_noise_sigma self.data_x = data_x self.data_y = data_y self.covariance_function = covariance_function self._inverse_of_covariance_matrix_of_input_noise_adj = np.linalg.inv( cov_matrix(data_x, data_x, covariance_function) + self.noise * np.identity(len(self.data_x)) ) self._memory = None def predict(self, test_data: np.ndarray) -> np.ndarray: KXX_star = cov_matrix(test_data, self.data_x, self.covariance_function) KX_starX_star = cov_matrix(test_data, test_data, self.covariance_function) mean_test_data = KXX_star @ (self._inverse_of_covariance_matrix_of_input_noise_adj @ self.data_y) cov_test_data = KX_starX_star - KXX_star @ (self._inverse_of_covariance_matrix_of_input_noise_adj @ KXX_star.T) var_test_data = np.diag(cov_test_data) self._memory = {'mean': mean_test_data, 'covariance_matrix': cov_test_data, 'variance': var_test_data} return mean_test_data # Test data np.random.seed(69) data_x = np.linspace(-5, 5, 10).reshape(-1, 1) data_y = np.sin(data_x) + 0.1 * np.random.randn(10, 1) # Instantiate and predict gpr_se = GPR(data_x, data_y, covariance_function=SquaredExponentialKernel(), white_noise_sigma=0.1) test_data = np.linspace(-6, 6, 100).reshape(-1, 1) mean_predictions = gpr_se.predict(test_data)
维度分析
下面是出错的矩阵乘法步骤的维度拆解:
KXX_star由cov_matrix(test_data, self.data_x, covariance_function)计算得到,形状为(100, 10)。self._inverse_of_covariance_matrix_of_input_noise_adj在__init__方法中计算,形状为(10, 10)。self.data_y的形状为(10, 1)。
出错的代码行是:
mean_test_data = KXX_star @ (self._inverse_of_covariance_matrix_of_input_noise_adj @ self.data_y)
理论上这个计算应该得到形状为(100, 1)的结果,因为:
KXX_star形状是(100, 10),(self._inverse_of_covariance_matrix_of_input_noise_adj @ self.data_y)的计算结果形状是(10, 1)。
我实在搞不懂明明维度看起来是匹配的,为什么会出现维度不匹配的错误?该怎么修复呢?
我原本以为这个矩阵乘法应该能正常运行,因为从理论上看维度是兼容的:KXX_star(100,10)乘以(10,1)应该得到(100,1)的结果。但错误提示维度不匹配,说明哪里肯定出问题了。我检查过self.data_y、self._inverse_of_covariance_matrix_of_input_noise_adj和KXX_star的形状,也尝试过重新调整data_y的形状确保它是(10,1),但错误还是存在。我期望能得到对应100个测试数据点的、形状为(100,1)的均值预测向量,没有任何维度问题。
备注:内容来源于stack exchange,提问作者Max Michlits
相关产品推荐
相关产品推荐

