You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高斯过程回归(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)

维度分析

下面是出错的矩阵乘法步骤的维度拆解:

  1. KXX_star由cov_matrix(test_data, self.data_x, covariance_function)计算得到,形状为(100, 10)。
  2. self._inverse_of_covariance_matrix_of_input_noise_adj在__init__方法中计算,形状为(10, 10)。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:53:06