Soy un poco nuevo así que me disculpo si esta pregunta ya ha sido respondida, he echado un vistazo y no he podido encontrar específicamente lo que estaba buscando.Cómo forzar la intercepción cero en la regresión lineal?
Tengo algunos datos más o menos lineales de la forma
x = [0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0, 4.0, 6.0, 8.0, 10.0, 20.0, 40.0, 60.0, 80.0]
y = [0.50505332505407008, 1.1207373784533172, 2.1981844719020001, 3.1746209003398689, 4.2905482471260044, 6.2816226678076958, 11.073788414382639, 23.248479770546009, 32.120462301367183, 44.036117671229206, 54.009003143831116, 102.7077685684846, 185.72880217806673, 256.12183145545811, 301.97120103079675]
estoy usando scipy.optimize.leastsq
para ajustar una regresión lineal para esto:
def lin_fit(x, y):
'''Fits a linear fit of the form mx+b to the data'''
fitfunc = lambda params, x: params[0] * x + params[1] #create fitting function of form mx+b
errfunc = lambda p, x, y: fitfunc(p, x) - y #create error function for least squares fit
init_a = 0.5 #find initial value for a (gradient)
init_b = min(y) #find initial value for b (y axis intersection)
init_p = numpy.array((init_a, init_b)) #bundle initial values in initial parameters
#calculate best fitting parameters (i.e. m and b) using the error function
p1, success = scipy.optimize.leastsq(errfunc, init_p.copy(), args = (x, y))
f = fitfunc(p1, x) #create a fit with those parameters
return p1, f
y funciona muy bien (aunque no estoy seguro si scipy.optimize es lo correcto para usar aquí, ¿podría ser un poco exagerado?).
Sin embargo, debido a la forma en que se encuentran los datos, no me da una interceptación del eje y en 0. Sin embargo, sé que tiene que ser cero en este caso, if x = 0 than y = 0
.
¿Hay alguna manera de forzar esto?
Si sabe que su origen es 0, ¿por qué lo tienes como un parámetro libre en su función de encajar? ¿Podrías eliminar 'b' como parámetro libre? – Jdog
Ah. sí. ¡Por supuesto! Me disculpo, esta es una respuesta realmente obvia. A veces no veo la madera para los árboles: -/Esto funciona bien. ¡Muchas gracias por señalármelo! –
Acabo de ver el gráfico de los datos en una respuesta. No relacionado con la pregunta, deberías probar un polinomio de segundo orden para que encaje. Por lo general, uno puede decir que el intercepto es nulo si está en el orden de su error, y creo que en un ajuste de parábola lo obtendrá. – chuse