scipy.optimize.leastsq Примерка: minpack.error

Я пытаюсь запустить код, как показано ниже, это простая подгонка по методу наименьших квадратов, для которой я прыгаю, чтобы получить коэффициент инвертированных переменных.

import numpy as np
def model(vars, x): 
  model = vars[0]*x[0]+vars[1]*x[1]+vars[2]
  return model
def residuals(vars, x, data):
  err = data - vars[0]*x[0]+vars[1]*x[1]+vars[2]
  return err

from scipy.optimize import leastsq
vars = [0.0, 0.0, 0.0]
x = np.genfromtxt('C:\Arrayx.txt')
data = np.resize(np.genfromtxt('C:\Data.txt'),(5,1))
out = leastsq(residuals, vars, args=(x, data))

Arrayx.txt имеет следующее содержимое:

240 0
7   86
241 184
478 92
244 90

Data.txt имеет следующее содержимое:

1.765
1.901
2.17
2.09
2.01

Я получил эти 2 сообщения об ошибках, когда я запускаю код:minpack.error: Результат от вызова функции не является правильным массивом с плавающей точкой.ValueError: объект слишком глубокий для нужного массива. Я новичок в Python, любая помощь по этой проблеме будет принята с благодарностью!

1 ответ

На самом деле ваша проблема не в leastsq, а в том, как работает размерность массива numpy.

x а также data оба двумерных массива, из-за того, как вы их загрузили (по крайней мере, для xв любом случае это должно быть 2d; data не делает). Numpy индексация (строка, столбец). Ваш x[0] а также x[1]Я предполагаю, что должен был получить доступ к первому и второму столбцам x, фактически получить доступ к первой и второй (из 5) строк. Numpy пытается быть полезным, когда вы добавляете эти массивы 1x2 в массив данных 5x1. Результатом является выход из residuals что leastsq не может обработать (попробуйте запустить остатки самостоятельно).

Скорее всего, вам нужно получить доступ к первому и второму столбцам, умножить их на правильные элементы var, а затем добавить (пять) чисел к пяти числам в данных. Чтобы получить столбец х, вы должны сделать что-то вроде x[:,0] (все строки, столбец 0). Проблема в том, что это возвращает одномерный массив, и вы явно сделали data двумерный с одним столбцом и пятью строками с размером np.resize. Вам это не нужно - данные на самом деле только одномерные, поэтому мы можем удалить изменение размера. Результат следующий:

import numpy as np
def model(vars, x): 
  model = vars[0]*x[:,0]+vars[1]*x[:,1]+vars[2]
  return model
def residuals(vars, x, data):
  err = data - vars[0]*x[:,0]+vars[1]*x[:,1]+vars[2]
  return err

from scipy.optimize import leastsq
vars = np.array([0.0, 0.0, 0.0])
x = np.genfromtxt('Arrayx.txt')
data = np.genfromtxt('Data.txt')
out = leastsq(residuals, vars, args=(x, data))
Другие вопросы по тегам