3 votos

Ajuste de curvas scipy no lineales de varias variables

He estado tratando de ajustar mis datos a una ecuación personalizada, que es la siguiente y=(a1/x)+a2*x2+b con ajuste de curva. He usado ajuste de curva con 1 variable independiente y funciona perfectamente, pero no puedo averiguar cómo usarlo con 2.

 def func (x1,x2,a1,a2,b):
    y=(a1/x)+a2*x2+b
    return y

x=df[["característica1","característica2"]].values
y=df["objetivo"].values
x_train,x_test,y_train,y_test=train_test_split(x,y, test_size=0.30, random_state=42)```

2voto

5xum Puntos 158

```html

Aquí hay un ajustador de superficie 3D utilizando tu ecuación y mis datos de prueba que realiza un gráfico de dispersión 3D, un gráfico de superficie 3D y un gráfico de contorno. Deberías poder hacer clic y arrastrar los gráficos 3D con el ratón y rotarlos en el espacio 3D para inspección visual.

import numpy, scipy, scipy.optimize
import matplotlib
from mpl_toolkits.mplot3d import  Axes3D
from matplotlib import cm # para colorear mapas 3D de superficies de azul a rojo
import matplotlib.pyplot as plt

graphWidth = 800 # las unidades son píxeles
graphHeight = 600 # las unidades son píxeles

# líneas de gráfico de contorno 3D
numberOfContourLines = 16

xData = numpy.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0])
yData = numpy.array([11.0, 12.1, 13.0, 14.1, 15.0, 16.1, 17.0, 18.1, 90.0])
zData = numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.0, 9.9])

# colocar los datos en una lista única
data = [xData, yData, zData]

def SurfacePlot(func, data, fittedParameters):
    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)

    matplotlib.pyplot.grid(True)
    axes = Axes3D(f)

    # extraer datos de la lista única
    x_data = data[0]
    y_data = data[1]
    z_data = data[2]

    xModel = numpy.linspace(min(x_data), max(x_data), 20)
    yModel = numpy.linspace(min(y_data), max(y_data), 20)
    X, Y = numpy.meshgrid(xModel, yModel)

    Z = func(numpy.array([X, Y]), *fittedParameters)

    axes.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=1, antialiased=True)

    axes.scatter(x_data, y_data, z_data) # mostrar datos junto con superficie graficada

    axes.set_title('Gráfico de Superficie (haz clic y arrastra con el ratón)') # agregar un título para el gráfico de superficie
    axes.set_xlabel('Datos X') # etiqueta de datos del eje X
    axes.set_ylabel('Datos Y') # etiqueta de datos del eje Y
    axes.set_zlabel('Datos Z') # etiqueta de datos del eje Z

    plt.show()
    plt.close('all') # limpiar después de usar pyplot o pueden haber problemas de memoria y procesamiento

...

```

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X