In [23]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

La più semplice tipologia di interpolazione è quella lineare. Negli esempi che seguono si eplorano interploazioni più complesse.

In [24]:
"""
Generazione di numeri casuali
"""
x = np.arange(-5.0, 5.0, 0.1)
y = 2*(x) + 4

"""
Si generano numeri casuali e si associano
ad ogni valore di y
"""
y_noise = 2 * np.random.normal(size=x.size)
ydata = y + y_noise

#plt.figure(figsize=(8,6))
plt.plot(x, ydata,  'bo')
plt.plot(x,y, 'r') 
plt.ylabel('Variabile Dipendente')
plt.xlabel('Variabile Indipendente')
plt.show()

Se una regressione non ĆØ lineare significa che l'andamento dell'interpolazione non ĆØ una retta. Nel seguente esempio la curva inerpolante ĆØ una cubica

$ y=a \cdot x^3+b \cdot x^2+c \cdot x +d $ con a,b,c,d opportuni coefficienti numerici Qui di seguito a=b=c=1, d=3

In [31]:
x = np.arange(-5.0, 5.0, 0.1)

y = 1*(x**3) + 1*(x**2) + 1*x + 3
y_noise = 20 * np.random.normal(size=x.size)
ydata = y + y_noise
plt.plot(x, ydata,  'bo')
plt.plot(x,y, 'r') 
plt.ylabel('Variabile Dipendente')
plt.xlabel('Variabile Indipendente')
plt.show()

La regressione quadratica segue una legge del tipo $ y \propto x^2 $. vale a dire una parabola di equazione $y=a \cdot x^2+b \cdot x+ c$

In [42]:
x = np.arange(-5.0, 5.0, 0.1)

y = np.power(x,2)
y_noise = 2 * np.random.normal(size=x.size)
ydata = y + y_noise
plt.plot(x, ydata,  'bo')
plt.plot(x,y, 'r') 
plt.ylabel('y')
plt.xlabel('x')
plt.show()

L'interpolazione tramite funzione di potenza saĆ  del tipo $y= a+b \cdot c^x $ con $c>0$. Nell'esempio seguente si tratta di $y=e^x $

In [41]:
X = np.arange(-5.0, 5.0, 0.1)

##You can adjust the slope and intercept to verify the changes in the graph

Y= np.exp(X)
y_noise = 4 * np.random.normal(size=x.size)
ydata=Y+y_noise
plt.plot(X,ydata,'bo')
plt.plot(X,Y,'r') 
plt.ylabel('y')
plt.xlabel('x')
plt.show()

La regressione logaritmica:$y=a+b \cdot log(x) $

In [56]:
X = np.arange(0.01, 10.0, 0.1)

Y = np.log(X)
y_noise = 0.2 * np.random.normal(size=x.size)
ydata=Y+y_noise
plt.plot(X,ydata,'bo')
plt.plot(X,Y,'r') 
plt.ylabel('y')
plt.xlabel('x')
plt.show()

La sigmoide/logistica $a + b \over {1+c^{(x-d)}} $

In [67]:
X = np.arange(-5.0, 5.0, 0.1)


Y = 1-4/(1+np.power(3, X-2))

y_noise = 0.201 * np.random.normal(size=x.size)
ydata=Y+y_noise
plt.plot(X,ydata,'bo')
plt.plot(X,Y,'r') 
plt.ylabel('y')
plt.xlabel('x')
plt.show()
In [ ]: