#python #numpy #polynomials #coefficients
#python #numpy #многочлены #коэффициенты
Вопрос:
Использование Python 3.10.0 и NumPy 1.21.4.
Я пытаюсь понять, почему Polynomial.fit()
вычисляются совершенно разные значения коэффициентов polyfit()
.
В следующем коде:
import numpy as np
def main():
x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])
c1 = np.polynomial.polynomial.polyfit(x, y, 2)
c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2).coef
print(c1)
print(c2)
if __name__ == '__main__':
main()
c1
содержит:
[-3.33620814e 03 3.44704650e 00 -2.18221029e-04]
который создает строку наилучшего соответствия при подключении a bx cx^2
, которую я предсказал, пока c2
содержит:
[8443.4986422 2529.67242075 -872.88411679]
что приводит к совершенно другой строке при подключении к той же формуле.
Документация, похоже, подразумевает, что Polynomial.fit()
это новый предпочтительный способ вычисления строки, но он продолжает выводить неправильные коэффициенты (если только мое понимание полиномиальной регрессии не является полностью неправильным).
Если я неправильно использую функции, каков правильный способ их использования?
Если я правильно использую обе функции, зачем мне использовать Polynomial.fit()
over polyfit()
, поскольку документация, похоже, подразумевает, что я должен?
Ответ №1:
Согласно Polynomial.fit()
документации, он возвращает:
Ряд, представляющий наименьшие квадраты, соответствующие данным, и имеющий домен и окно, указанные в вызове. Если представляют интерес коэффициенты для немасштабированных и несмещенных базисных многочленов, сделайте
new_series.convert().coef
это.
Вы можете найти в https://numpy.org/doc/stable/reference/routines .многочлены.html#переход-от-numpy-poly1d-к-numpy-многочлену, который
коэффициенты задаются в масштабированной области, определяемой линейным отображением между окном и областью. преобразование можно использовать для получения коэффициентов в области немасштабированных данных.
Вы можете проверить
import numpy as np
def main():
x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])
c1 = np.polynomial.polynomial.polyfit(x, y, 2)
c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2).convert().coef
c3 = np.polynomial.polynomial.Polynomial.fit(x, y, 2, window=(x.min(), x.max())).coef
print(c1)
print(c2)
print(c3)
if __name__ == '__main__':
main()
# [-3.33620814e 03 3.44704650e 00 -2.18221029e-04]
# [-3.33620814e 03 3.44704650e 00 -2.18221029e-04]
# [-3.33620814e 03 3.44704650e 00 -2.18221029e-04]
Вероятно, самой важной причиной для использования Polynomial.fit()
является его поддержка в текущей версии NumPy и рассмотрение polyfit
как устаревшей
Ответ №2:
import numpy as np
def main():
x = np.array([3000, 3200, 3400, 3600, 3800, 4000, 4200, 4400, 4600, 4800, 5000, 5200, 5400, 5600, 5800, 6000, 6200, 6400, 6600, 6800, 7000])
y = np.array([5183.17702344, 5280.24520952, 5758.94478531, 6070.62698406, 6584.21169885, 8121.20863245, 7000.57326186, 7380.01493624, 7687.97802847, 7899.71417408, 8506.90860692, 8421.73816463, 8705.58403352, 9275.46094996, 9552.44715196, 9850.70796049, 9703.53073907, 9833.39941224, 9900.21604921, 9901.06392084, 9974.51206378])
c1 = np.polynomial.polynomial.polyfit(x, y, 2)
c2 = np.polynomial.polynomial.Polynomial.fit(x, y, 2, domain=[]).coef
print(c1)
print(c2)
main()
Вы также можете получить коэффициенты, передав пустой список domain
ключевому слову, которое заставляет класс использовать свой домен по умолчанию [-1,1]
и выдает эти выходные данные
[-3.33620814e 03 3.44704650e 00 -2.18221029e-04]
[-3.33620814e 03 3.44704650e 00 -2.18221029e-04]