Не ожидаемый результат, полученный с помощью curve_fit scipy

#python #scipy #curve-fitting

#python #scipy #подгонка кривой

Вопрос:

Я пытался выполнить многомерную логарифмическую регрессию для своих данных с помощью scipy curve_fit и в результате ожидал получить линию, но получил кривую. Вот код, который я использовал :

 Quercetin=[23,195,6,262,272,158,79,65,136,198]
Naringenin=[11,4,8,6,6,7,6,9,7,9]
Rutin=[178,165,93,239,202,3325,4427,7607,3499,1762]
TEAC=[23,189,37,265,290,267,362,388,364,321]

import matplotlib.pyplot as plt
import scipy
from scipy.optimize import curve_fit
import numpy as np
def func(x, a, b, c, d,e):
    m=np.log(a*x[0] b*x[1] c*x[2])
    return d*(m) e
x=scipy.array([Quercetin, Naringenin,Rutin])
y=scipy.array(TEAC)
popt, pcov = curve_fit(func, x ,y)
print (popt)

plt.plot(func(x,*popt),y,'ro-')
plt.show()
  

И я получаю этот результат:
введите описание изображения здесь

пока я хочу получить что-то вроде этого :

введите описание изображения здесь

Может кто-нибудь, пожалуйста, дать мне подсказку о том, что я делаю неправильно? Если это имеет значение, я использую Python 3.5 от Anaconda в Windows 10.

Ответ №1:

(Я предполагаю, что вопрос действительно касается построения графика). Вы просите matplotlib нанести красные точки ( 'ro' ), соединенные прямыми линиями ( - ). Matplotlib обязывает и соединяет их в любом порядке, в котором они указаны.

Если вы хотите построить линию, просто постройте ее отдельно:

 In [58]: yres = func(x, *popt)

In [59] plt.plot(yres, y, 'ro')
Out[59]: [<matplotlib.lines.Line2D at 0x7f5c0796b828>]

In [60]: plt.plot([0, 400], [0, 400], '-')
Out[60]: [<matplotlib.lines.Line2D at 0x7f5c07a9c860>]
  

Комментарии:

1. Спасибо. Я действительно упустил из виду, что способ, которым я использовал для построения, будет отображать точки, соединенные линиями! Но здесь, как я вижу, будет нанесена линия, которая просто y = x , в то время как я хочу нанести линию, подобранную curve_fit .