# Bivariate nonlinear regression using Python

In my previous article: https://oscarnieves100.medium.com/univariate-nonlinear-regression-in-python-deb91d1085cd, I discussed how to do nonlinear regression in Python for univariate data using the module scipy.optimize and the function curve_fit. Now, I will extend that to bivariate regression using the same technique.

Unbeknownst to some people, Python’s curve_fit function can also be used for bivariate regression, not just univariate. However, the way to do it is a bit tricky because of the way in which we need to restructure our data. In this article, I will show how to adapt your data to the right format in order to get this to work.

# Setting up the data

Let us first import the necessary modules and define our data:

`import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitplt.style.use('seaborn-poster')# Input datax = np.array( [0.5, 1.0, 1.5] )y = np.array( [0, 0.1, 0.2, 0.3, 0.4, 0.5] )z1 = np.array([1.00120262, 0.98724237, 0.91583136, 0.78507447, 0.60688337,       0.39969003])z2 = np.array([1.00094847, 0.97392313, 0.85439126, 0.67117433, 0.43412121,       0.22630919])z3 = np.array([1.00001221, 0.96332839, 0.81539488, 0.58311224, 0.33212341,       0.1356312])`

I have specifically chosen here two independent variables x and y, with x containing 3 elements and y 6, and also the “data” we have for those observables is split into 3 rows, each of which is stored in z1, z2 and z3 respectively, making up 18 observation points for 18 different combinations of x and y.

We could visualize this data by plotting a surface, but in cases like this where there aren’t that many datapoints I like to plot them in 2D as follows:

`plt.figure(1)plt.scatter(y,z1,color="black",s=50,label="data, x = " + str(x[0]))plt.scatter(y,z2,color="blue",s=50,label="data, x = " + str(x[1]))plt.scatter(y,z3,color="red",s=50,label="data, x = " + str(x[2]))plt.xlabel(r"\$y\$",fontsize=30)plt.ylabel(r"\$z\$",fontsize=30)plt.legend(frameon=False, fontsize=20)`

that way we have a unique plot for z1, z2 and z3 for each of our x values. This is also useful for visually inspecting the shape of z as we vary both x and y. As before, I will assume some kind of…