使用Python的Matplotlib回归散点图?

时间:2014-08-12 13:11:19

标签: python matplotlib regression

enter image description here

我的问题

我尝试使用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图是这样的:

enter image description here

2 个答案:

答案 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()

Example

答案 1 :(得分:1)

可能您的xy未排序。

请勿忘记在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