Operaciones de matriz numpy que devuelven valores NaN; a pesar de no haber valores NaN en la entrada.
Estoy ejecutando una Regresión Lineal (usando el Análisis de Descenso Gradiente / GDA) utilizando datos importados de un archivo .csv (las variables data_axis
y data
representan las fechas y los precios del mercado de valores, respectivamente). El código a continuación devuelve [nan nan nan nan nan nan]
como el valor theta. El error cuadrado también devuelve nan
.
Mensajes de error: ‘se encontró desbordamiento en multiplicar’, ‘se encontró valor inválido en añadir’
import numpy as np
Xdata = np.array(data_axis)
Xdata = Xdata.reshape(-1,2)
print(Xdata.shape)
Ydata = np.array(data[0:783])
Ydata = Ydata[::-1]
print(Ydata.shape)
def phi(x):
return np.array([1,x[0],x[0],x[0]*x[0],x[0]*x[0],x[0]*x[0]*x[0]])
def gda(X, Y):
n = len(X)
theta = np.zeros(len(X[0]))
alpha = 0.5
iterations = 1000
for j in range(iterations):
for i in range(len(X)):
theta += alpha*(Y[i] - np.dot(theta,X[i]))*X[i]/n
return theta
def linear_regression_with_features(X, Y, phi):
phi_X = np.array([phi(x) for x in X])
return gda(phi_X,Y)
theta = linear_regression_with_features(Xdata, Ydata, phi)
def h(theta, x):
return np.dot(theta,phi(x))
error = np.array([Ydata[i] - h(theta,Xdata[i]) for i in range(len(Xdata))])
s_error = np.dot(error,error)
print('theta= ', theta)
print('square error= ', s_error)
plt.plot(Xdata,Ydata,'co')
plt.plot(h(theta,Xdata),'r-')
El código devuelve y grafica exitosamente una regresión lineal para entradas generadas aleatoriamente Xdata = np.random.rand(783,2)
, Ydata = np.array([2-4*x[0]+3*x[1]+x[0]*x[0]+2*x[0]*x[1]-3*x[1]*x[1] for x in X])
.
Verifiqué que no haya valores NaN en el archivo .csv. Busqué el mensaje de error y leí que algunas operaciones de Python y NumPy que involucran números extremadamente pequeños o extremadamente grandes pueden devolver un valor NaN como resultado. ¿Podría ser este mi problema? ¿O hay algo más que se pueda corregir?
davy.ai
Según los mensajes de error recibidos, es probable que el problema esté relacionado con números extremadamente pequeños o grandes que no son manejados adecuadamente por las operaciones de NumPy en el código. Una forma de solucionar esto sería verificar y manejar cualquier posible división por cero o errores de desbordamiento.
Algunas posibles soluciones podrían incluir ajustar la tasa de aprendizaje alpha, escalar los datos de entrada para evitar valores extremadamente pequeños, o verificar si hay valores NaN o infinitos en los datos de entrada antes de ejecutar la regresión. También puede ser útil imprimir los valores intermedios de theta y error durante la regresión para ver si se están produciendo valores inusuales.