Подтвердить что ты не робот

Многомерная (полиномиальная) наилучшая по форме кривая в python?

Как вы вычисляете линию наилучшего соответствия в python, а затем зарисуете ее на диаграмме рассеяния в matplotlib?

Я вычислял линейную линию наилучшего соответствия с использованием обычной регрессии с наименьшими квадратами:

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_      

Это многомерность (для каждого случая имеется много x-значений). Итак, X - список списков, а y - один список. Например:

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

Но как это сделать с полиномиальными функциями более высокого порядка. Например, не только линейный (x для мощности M = 1), но и биномиальный (x для мощности M = 2), квадратики (x - мощность M = 4) и т.д. Например, как получить кривые наилучшего соответствия из следующих?

Извлечен из архиереев Кристофера "Распознавание образов и машинное обучение", стр .7:

Extracted from Christopher Bishops's "Pattern Recognition and Machine Learning", p.7

4b9b3361

Ответ 1

Принятый ответ на этот вопрос предоставляет небольшую библиотеку с несколькими полями, которая будет делать именно то, что вам нужно, с помощью numpy, и вы можете подключить результат к графике, как я изложил ниже.

Вы просто передадите в свои массивы точек x и y и степень (порядок) соответствия, которую вы требуете, в multipolyfit. Это возвращает коэффициенты, которые затем можно использовать для построения с использованием numpy polyval.

Примечание. В приведенном ниже коде были внесены изменения, чтобы сделать многовариантную установку, но изображение графика было частью более раннего, не многомерного ответа.

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")

enter image description here


Примечание. Это было частью ответа ранее, но все же актуально, если у вас нет многомерных данных. Вместо coeffs = mpf(..., используйте coeffs = numpy.polyfit(x,y,3)

Для многовариантных наборов данных самый простой способ сделать это, вероятно, с numpy polyfit:

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

Полиномиальный край наименьших квадратов.

Положим многочлен p(x) = p[0] * x**deg +... + p[deg] степени deg в точки (x, y). Возвращает вектор коэффициентов p, который минимизирует квадратичную ошибку.