LINUX.ORG.RU

Вопрос по МНК в NumPy

 ,


0

1

Собственно, надо с помощью МНК и тестового датасета (один - положение пика, другой - размер) вычислить размеры пиков с других каналов. Есть такой код:

from numpy import polyfit, polyval
a = [1589, 1749, 1915, 2082, 2196, 2247, 2416, 2577, 2740, 2900, 3013, 3061, 3222, 3300, 3382, 3542, 3704, 3817, 3863, 4023, 4180, 4339, 4496, 4607, 4653, 4810, 4963, 5116, 5266, 5370, 5413, 5562, 5705, 5846, 5983]
b = [40, 60, 80, 100, 114, 120, 140, 160, 180, 200, 214, 220, 240, 250, 260, 280, 300, 314, 320, 340, 360, 380, 400, 414, 420, 440, 460, 480, 500, 514, 520, 540, 560, 580, 600]
coeffs = polyfit(a, b, 2)
c = [3648, 3656, 3671, 3678]
d = polyval(coeffs, c)
print(d)

При запуске он работает правильно и выводит

[292.45662586 293.46364392 295.35247158 296.23422302]

НО! В мануале к функциям значится, что предпочителен новый API numpy.polynomial. Пробую переписать в соответствии с этим API:

from numpy.polynomial.polynomial import Polynomial, polyval
a = [1589, 1749, 1915, 2082, 2196, 2247, 2416, 2577, 2740, 2900, 3013, 3061, 3222, 3300, 3382, 3542, 3704, 3817, 3863, 4023, 4180, 4339, 4496, 4607, 4653, 4810, 4963, 5116, 5266, 5370, 5413, 5562, 5705, 5846, 5983]
b = [40, 60, 80, 100, 114, 120, 140, 160, 180, 200, 214, 220, 240, 250, 260, 280, 300, 314, 320, 340, 360, 380, 400, 414, 420, 440, 460, 480, 500, 514, 520, 540, 560, 580, 600]
coeffs = Polynomial.fit(a, b, 2)
c = [3648, 3656, 3671, 3678]
d = polyval(c, coeffs)
print(d)

И получаю выхлоп:

[Polynomial([309.86246448, 277.69372744,   9.356855  ], domain=[1589., 5983.], window=[-1.,  1.], symbol='x')
 Polynomial([309.86246448, 277.69372744,   9.356855  ], domain=[1589., 5983.], window=[-1.,  1.], symbol='x')
 Polynomial([309.86246448, 277.69372744,   9.356855  ], domain=[1589., 5983.], window=[-1.,  1.], symbol='x')
 Polynomial([309.86246448, 277.69372744,   9.356855  ], domain=[1589., 5983.], window=[-1.,  1.], symbol='x')]

И вроде всё по мануалу, вроде всё окей. Что я сделал не так и как исправить и получить нормальный вывод значений?

Заранее спасибо!

★★★

Проблема в том, что вы сразу что-то программируете на python, вместо того чтобы выяснить что вам надо (и только после этого реализовать это на пайтон).

Как мне кажется, ваши coeffs - это массив из 3х элементов-степеней при нулевой, первой степенях и квадрате. Polyval вычисляет coeffs[0] + coeffs[1]*x + coeffs[2]*x^2 (или степени наоборот, лень читать).

Вы далее решили заменить polyval на новую «более лучшую» функцию (которая вычисляет многочлен иным способом?) … и заменили функцию polyfit :)

sshestov ★★
()
Ответ на: комментарий от sshestov

polyval есть И в numpy как таковом, и в numpy.polynomial.polynomial. И даже описывается плюс-минус одинаково.

Да,это СУПЕРКОНТРИНТУИТИВНО. Но прикол был не в этом. Прикол в том, что в отличие от polyfit, выхлоп Polynomial.fit сам по себе функция, принимающая на вход число или numpy.array. И туда просто надо подставить значения, то есть, рабочий код таков:

from numpy.polynomial.polynomial import Polynomial, polyval
from numpy import array
a = [1589, 1749, 1915, 2082, 2196, 2247, 2416, 2577, 2740, 2900, 3013, 3061, 3222, 3300, 3382, 3542, 3704, 3817, 3863, 4023, 4180, 4339, 4496, 4607, 4653, 4810, 4963, 5116, 5266, 5370, 5413, 5562, 5705, 5846, 5983]
b = [40, 60, 80, 100, 114, 120, 140, 160, 180, 200, 214, 220, 240, 250, 260, 280, 300, 314, 320, 340, 360, 380, 400, 414, 420, 440, 460, 480, 500, 514, 520, 540, 560, 580, 600]
func = Polynomial.fit(a, b, 2)
c = [3648, 3656, 3671, 3678]
print(func(array(c)))

И да: это не менее контринтуитивно.

Dorif ★★★
() автор топика