Значения полиномиальной регрессии, сгенерированные слишком далеко от координат - PullRequest
2 голосов
/ 10 января 2020

Согласно приведенному ниже коду для значения коэффициентов полиномиальной регрессии, когда я вычисляю значение регрессии в любой точке х. Полученное значение намного дальше от эквивалентной координаты y (особенно для приведенных ниже координат). Может ли кто-нибудь объяснить, почему разница настолько велика, можно ли ее минимизировать или есть какой-либо недостаток в понимании. Текущее требование не является разницей более 150 в каждой точке.


import  numpy as np
x=[0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100]
y=[0,885,3517,5935,8137,11897,10125,13455,14797,15925,16837,17535,18017,18285,18328,18914,19432,19879,20249,20539,20746]                                                                                                     
z=np.polyfit(x,y,3)
print(z) 

Я также пробовал различные различные коды, доступные в java, но значения коэффициентов везде одинаковы для этих данных. Пожалуйста, помогите с пониманием. Например,


0.019168 * N^3 + -5.540901 * N^2 + 579.846493 * N + -1119.339450<br>
N равно 5 Значение равно 1643.76649 Значение Y 885 N равно 10 Значение равно 4144.20338 Значение Y 3517 N равно 100; Значение = 20624,29985 Значение Y 20746

Ответы [ 2 ]

2 голосов
/ 10 января 2020

После того, как я рассмотрел ответ @Magnus, я уменьшил пределы, используемые для данных, в полиноме 3-го порядка. Как вы можете видеть, точки в моем грубо нарисованном красном круге не могут одновременно l ie на гладкой линии с соседними данными. Хотя я мог бы подгонять по данным плавные линии, такие как сигмоидальное уравнение Хилла, сама дисперсия (шум) данных, по-видимому, является ограничивающим фактором в достижении пиковой абсолютной ошибки 150 с этим набором данных.

plot

2 голосов
/ 10 января 2020

Подгонка полинома работает как положено. Здесь нет ошибок, просто большое отклонение в ваших данных. Возможно, вы захотите изменить ваши данные. Если вы добавите параметр full=True к np.polyfit, вы получите дополнительную информацию, включая невязки, которые по существу являются суммой ошибок квадратного соответствия. См. Этот SO сообщение для более подробной информации.

import matplotlib.pyplot as plt
import  numpy as np

x = [0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100]
y = [0,885,3517,5935,8137,11897,10125,13455,14797,15925,16837,17535,18017,18285,18328,18914,19432,19879,20249,20539,20746]

m = max(y)
y = [p/m for p in y] # rescaled y such that max(y)=1, and dimensionless

z, residuals, rank, sing_vals, cond_thres = np.polyfit(x,y,3,full=True)

print("Z: ",z) # [ 9.23914285e-07 -2.67082878e-04  2.79497972e-02 -5.39544708e-02]

print("resi:", residuals) # 0.02188 : quite decent, depending on WHAT you're measuring ..

Z = [z[3] + q*z[2] +  q*q*z[1] + q*q*q*z[0] for q in x]

fig = plt.figure()
ax = fig.add_subplot(111)

ax.scatter(x,y)
ax.plot(x,Z,'r')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...