#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