`ValueError` в умножении матриц для реализации регрессии гауссовского процесса в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 `ValueError` в умножении матриц для реализации регрессии гауссовского процесса в Python

Сообщение Anonymous »

Я реализую модель гауссовской регрессии процесса (GPR) в Python, используя квадратичное экспоненциальное ядро. Однако я сталкиваюсь с ошибкой ValueError на этапе умножения матрицы метода прогнозирования, особенно при попытке вычислить среднее значение прогноза.
Ошибка I' Я вижу это:

Код: Выделить всё

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, self.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), умноженный на (10, 1), должно выход (100, 1). Однако ошибка указывает на несоответствие размеров, подразумевая, что что-то не выравнивается так, как ожидалось. Я проверил фигуры на self.data_y, self._inverse_of_covariance_matrix_of_input_noise_adj и KXX_star. Также попробовал изменить форму data_y, чтобы обеспечить ее согласованность (10, 1), но ошибка не устранена. Я ожидал получить средние прогнозы в виде вектора формы (100, 1) для test_data без каких-либо проблем с размерами.

Подробнее здесь: https://stackoverflow.com/questions/791 ... implementa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»