Попытка использовать curve_fit для соответствия гауссовскому 3D и получение проблемы с трансляцией (Python)

#python #scipy #curve-fitting #gaussian #data-fitting

#python #scipy #подгонка кривой #гауссовский #подгонка данных

Вопрос:

Сегодня я потратил не менее 2 часов, пытаясь заставить эту 3D-гауссовскую подгонку работать, но пока безуспешно! Мои данные находятся в массиве NumPy с именем «data», а data [x, y, z] дает значение функции в местоположении (x, y, z) (все местоположения неотрицательны и имеют целочисленное значение). Я пытаюсь подогнать, используя 3D-гауссовский вид:

 # Our function gauss_3d is a function w = f(x,y,z)
# Returns the value "w" of the 3D Gaussian at point (x,y,z)
def gauss_3d(x, y, z, amplit, x0, y0, z0, sig_x, sig_y, sig_z, offset):
    sum = offset   amplit*np.exp(-(((x-x0)**2/(2*sig_x**2))   
            ((y-y0)**2/(2*sig_y**2)   ((z-z0)**2/(2*sig_z**2)))))
    return sum

  

Мой код подгонки кривизны выглядит следующим образом:

 dim = data.shape

# Create meshgrid
XX, YY, ZZ = np.meshgrid(np.arange(dim[2]), np.arange(dim[1]), np.arange(dim[0]))

# Create data_in, which consists of (x, y, z) points. data_in has shape (392,3)
#     i.e. 392 points of the form (x, y, z), where x,y,z are non-negative integers
data_in = np.vstack((XX.ravel(),YY.ravel(),ZZ.ravel())).T

# Create data_out, which is the ravelled data. data_out has shape (392,)
data_out = data.ravel()
print(data_in)

p_param, p_cov = opt.curve_fit(gauss_3d, data_in, data_out)
print("Fitted params:")
print(p_param)

  

Однако в настоящее время я получаю сообщение об ошибке «Ошибка значения: не удалось передать операнды вместе с формами (392,3) (392,)». Я проверил документацию, и там сказано, что Y и X должны иметь одинаковое измерение M, в моем случае они оба имеют 392 в качестве первого измерения M = 392. Так почему это не работает? data_in должен иметь размерность (392, 3), иначе я не могу поместить туда свои значения (x, y, z).

Комментарии:

1. Посмотрите здесь , поскольку на самом деле это работает немного иначе, чем подсказывает интуиция.

2. @mikuszefski Теперь я понимаю свою ошибку. Спасибо!