我的问题
我尝试使用scipy模块中的curve_fit函数进行回归,现在我得到了一个分散的情节,我无法弄明白,为什么我在这里得到一个分散的情节?
我的代码
def scipyFunction(x,y):
plot(x, y, 'o', label='Original data', markersize=10)
x = [float(xn) for xn in x] #every element (xn) in x becomes a float
y = [float(yn) for yn in y] #every element (yn) in y becomes a float
x = np.array(x) #tranform data into numpy array
y = np.array(y) #transform data into numpy array
def functionForScipy(x,a,b,c,d):
return a*x**3 + b*x**2 + c*x + d
#make the curve_fit
popt,pcov = curve_fit(functionForScipy,x,y)
'''
The result is :
popt[0] = a, popt[1] = b, popt[2] = d of the function,
so f(x) = popt[0]*x**3 + popt[1]*x**2 + popt[2]*x + popt[3].
'''
print(popt)
plt.plot(x, popt[0]*x**3 + popt[1]*x**2 + popt[2]*x + popt[3], label="Fitted Curve") # same as lin eabove
plt.legend(loc='upper left')
plt.show()
x和y图是这样的:
答案 0 :(得分:2)
我怀疑这是因为x
数组中的值不是单调递增的(也就是说每个后续数字都大于最后一个)。
您需要在绘制x值之前对它们进行排序,否则它们将遍布整个地方,如下例所示。
import numpy as np
import matplotlib.pyplot as plt
def func(x):
return x**2
x = np.array([0, 5, 2, 1, 3, 4])
y = func(x)
plt.plot(x, y, 'b-', label='Unsorted')
x.sort()
y = func(x)
plt.plot(x, y, 'r-', label='Sorted')
plt.legend()
plt.show()
答案 1 :(得分:1)
可能您的x
和y
未排序。
请勿忘记在x
y
上应用与{/ 1}}相同的排序。实现这一目标zip
非常方便。您可以在函数开头添加以下内容:
comb = zip(x,y)
comb.sort(key=lambda x:x[0]) #sort according to x
x, y = zip(*comb) #both x and y are sorted now according to x