Как разместить несколько независимых переменных в функции scipy — curve_fit?

#python #pandas #numpy #scipy #curve-fitting

Вопрос:

Я пытаюсь подогнать различные типы функций между зависимой и независимой переменной. В рамках этого, чтобы понять, как curve fit работает с функциями, я написал следующий код. Я взял 1 столбец из фрейма данных в качестве y (который является зависимой переменной) и еще 3 столбца в качестве независимых переменных (x1, x2, x3). Моя цель-подобрать лучшие веса для x1, x2 и x3, чтобы предсказать y.

Элементы фрейма данных, рассмотренные в примере, содержат 9995 строк в каждом столбце. Я сохранил максимум 10000 итераций.

Когда я попробовал код, я получил сообщение об ошибке,

Ошибка времени выполнения: Оптимальные параметры не найдены: Количество вызовов функции достигло maxfev = 10000.

 import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd
import numpy as np
from sympy import *
x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol('x3')

comb_bt_data1 = pd.read_csv("J:PhDPost II Qualifier MultifactorOutputsmerged_BT_Df.csv")
comb_bt_data2 = pd.read_csv("J:PhDPost II Qualifier MultifactorOutputsmerged_BT_Df2016-17.csv")
comb_bt_data = pd.concat([comb_bt_data1,comb_bt_data2])
# print(comb_bt_data.describe())
comb_bt_data = comb_bt_data.drop(['Unnamed: 0'],axis=1)
BT_df= comb_bt_data[['insituDepth','diff_D10H18V','diff_D10H23H','diff_D10H23V','diff_D10H36H','diff_D10H36V',
                     'diff_D10H89H','diff_D10H89V','diff_D18H36H','diff_D18H36V','diff_D18H89H','diff_D18H89V',
                     'diff_D23H89H','diff_D23H89V','diff_D36H89H','diff_D36H89V',
                     'diff_D10V18H','diff_D10V23H','diff_D10V23V','diff_D10V36H','diff_D10V36V','diff_D10V89H','diff_D10V89V',
                     'diff_D18V36H','diff_D18V36V','diff_D18V89H','diff_D18V89V','diff_D23V89H','diff_D23V89V','diff_D36V89H','diff_D36V89V','Elevation','Latitude','Longitude']]

#sample testing for understanding how this works
#selected only 3 columns from the dataframe (which are independent variables) and another column as #target variable
BT_df = BT_df[BT_df['insituDepth']>0]
x = BT_df[['Elevation','Latitude','Longitude']].to_numpy()
y = BT_df['insituDepth'].to_numpy()
print("shape of y",y.shape)

def func(x, a, b, c):
    print("inside func now printing x:",x.shape)
    x1 =x[:,0]
    print("shape of x1",x1.shape)
    x2 = x[:,1]
    x3 = x[:,2]
    return x1 **a   x2**b   x3**c
popt, pcov = curve_fit(func, x, y, maxfev=10000)
print(popt)
 

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

1. вы пытаетесь подогнать показатели . Сначала преобразуйте данные, используя логарифмы для выходных и входных данных, и установите преобразованное уравнение Log y = a logx b log y c log x