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))