¿Multivariable (polinomio) mejor curva de ajuste en python?

¿Cómo se calcula una línea de mejor ajuste en python y luego se grafica en un diagtwig de dispersión en matplotlib?

Calculé la línea lineal de mejor ajuste utilizando la Regresión de mínimos cuadrados ordinarios de la siguiente manera:

from sklearn import linear_model clf = linear_model.LinearRegression() x = [[t.x1,t.x2,t.x3,t.x4,t.x5] for t in self.trainingTexts] y = [t.human_rating for t in self.trainingTexts] clf.fit(x,y) regress_coefs = clf.coef_ regress_intercept = clf.intercept_ 

Esto es multivariado (hay muchos valores de x para cada caso). Entonces, X es una lista de listas, y y es una lista única. Por ejemplo:

 x = [[1,2,3,4,5], [2,2,4,4,5], [2,2,4,4,1]] y = [1,2,3,4,5] 

Pero, ¿cómo hago esto con funciones polinomiales de orden superior? Por ejemplo, no solo lineal (x a la potencia de M = 1), sino binomial (x a la potencia de M = 2), cuadrática (x a la potencia de M = 4), y así sucesivamente. Por ejemplo, ¿cómo obtengo las curvas de mejor ajuste de las siguientes?

Extraído de “Reconocimiento de patrones y aprendizaje automático” de Christopher Bishops, p.7:

La respuesta aceptada a esta pregunta proporciona una pequeña biblioteca multi fit poli que hará exactamente lo que necesita usando numpy, y puede conectar el resultado en el trazado como se describe a continuación.

Simplemente pasaría sus matrices de puntos x e y el grado (orden) de ajuste que requiera a multipolyfit . Esto devuelve los coeficientes que luego puede usar para trazar usando el polivalente de numpy.

Nota: el código que se muestra a continuación se ha modificado para realizar ajustes multivariados, pero la imagen de la ttwig era parte de la respuesta anterior, no multivariable.

 import numpy import matplotlib.pyplot as plt import multipolyfit as mpf data = [[1,1],[4,3],[8,3],[11,4],[10,7],[15,11],[16,12]] x, y = zip(*data) plt.plot(x, y, 'kx') stacked_x = numpy.array([x,x+1,x-1]) coeffs = mpf(stacked_x, y, deg) x2 = numpy.arange(min(x)-1, max(x)+1, .01) #use more points for a smoother plot y2 = numpy.polyval(coeffs, x2) #Evaluates the polynomial for each x2 value plt.plot(x2, y2, label="deg=3") 

introduzca la descripción de la imagen aquí


Nota: esto fue parte de la respuesta anterior, aún es relevante si no tiene datos multivariados. En lugar de coeffs = mpf(... , use coeffs = numpy.polyfit(x,y,3)

Para conjuntos de datos no multivariables, la forma más fácil de hacer esto es probablemente con polyfit de polyfit :

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)

Ajuste polinomial de cuadrados mínimos.

Ajustar un polinomio p(x) = p[0] * x**deg + ... + p[deg] de grado grado a puntos (x, y) . Devuelve un vector de coeficientes p que minimiza el error cuadrado.