복붙노트

[PYTHON] Numpy를 사용한 대형 데이터 세트 다항식 피팅

PYTHON

Numpy를 사용한 대형 데이터 세트 다항식 피팅

원시 데이터에 2 차 다항식을 맞추고 Matplotlib을 사용하여 결과를 출력하려고합니다. 내가 맞추려고하는 데이터 세트에는 약 백만 포인트가 있습니다. 웹을 통해 많은 예제를 사용할 수있어 간단해야합니다. 그러나 웬일인지 나는 그것을 올바르게 이해할 수 없다.

다음과 같은 경고 메시지가 나타납니다.

이것은 내 결과입니다.

이것은 Excel을 사용하여 출력됩니다.

내 코드는 아래를 참조하십시오. 나는 무엇이 없는가 ??

xData = df['X']
yData = df['Y']
xTitle = 'X'
yTitle = 'Y'
title = ''
minX = 100
maxX = 300
minY = 500
maxY = 2200

title_font = {'fontname':'Arial', 'size':'30', 'color':'black', 'weight':'normal',
              'verticalalignment':'bottom'} # Bottom vertical alignment for more space
axis_font = {'fontname':'Arial', 'size':'18'}

#Poly fit

# calculate polynomial
z = np.polyfit(xData, yData, 2)
f = np.poly1d(z)
print(f)

# calculate new x's and y's
x_new = xData
y_new = f(x_new)   

#Plot
plt.scatter(xData, yData,c='#002776',edgecolors='none')
plt.plot(x_new,y_new,c='#C60C30')

plt.ylim([minY,maxY])
plt.xlim([minX,maxX])

plt.xlabel(xTitle,**axis_font)
plt.ylabel(yTitle,**axis_font)
plt.title(title,**title_font)

plt.show()      

해결법

  1. ==============================

    1.플롯 할 배열을 정렬해야합니다. 다음은 정렬 된 배열과 정렬되지 않은 배열을 플로팅하는 것의 비교입니다. 정렬되지 않은 경우의 플롯은 완전히 왜곡되어 보입니다. 그러나 맞는 함수는 물론 동일합니다.

    플롯 할 배열을 정렬해야합니다. 다음은 정렬 된 배열과 정렬되지 않은 배열을 플로팅하는 것의 비교입니다. 정렬되지 않은 경우의 플롯은 완전히 왜곡되어 보입니다. 그러나 맞는 함수는 물론 동일합니다.

            2
    -3.496 x + 2.18 x + 17.26
    

    import matplotlib.pyplot as plt
    import numpy as np; np.random.seed(0)
    
    x = (np.random.normal(size=300)+1)
    fo = lambda x: -3*x**2+ 1.*x +20. 
    f = lambda x: fo(x) + (np.random.normal(size=len(x))-0.5)*4
    y = f(x)
    
    fig, (ax, ax2) = plt.subplots(1,2, figsize=(6,3))
    ax.scatter(x,y)
    ax2.scatter(x,y)
    
    def fit(ax, x,y, sort=True):
        z = np.polyfit(x, y, 2)
        fit = np.poly1d(z)
        print(fit)
        ax.set_title("unsorted")
        if sort:
            x = np.sort(x)
            ax.set_title("sorted")
        ax.plot(x, fo(x), label="original func", color="k", alpha=0.6)
        ax.plot(x, fit(x), label="fit func", color="C3", alpha=1, lw=2.5  )  
        ax.legend()
    
    
    fit(ax, x,y, sort=False)
    
    fit(ax2, x,y, sort=True) 
    
    
    plt.show()
    
  2. ==============================

    2.문제는 아마도 x 축을 따라 0에서 약간 떨어진 위치로 옮겨지는 데이터에 대해 전력 기준을 사용하는 것입니다. numpy.polynomial에서 Polynomial 클래스를 사용하면 적합하기 전에 데이터의 크기를 조정하고 이동하여 도움이되며 축척과 사용 된 시프트를 추적 할 수 있습니다. 정규 형식의 계수를 원하면 해당 형식으로 변환해야합니다.

    문제는 아마도 x 축을 따라 0에서 약간 떨어진 위치로 옮겨지는 데이터에 대해 전력 기준을 사용하는 것입니다. numpy.polynomial에서 Polynomial 클래스를 사용하면 적합하기 전에 데이터의 크기를 조정하고 이동하여 도움이되며 축척과 사용 된 시프트를 추적 할 수 있습니다. 정규 형식의 계수를 원하면 해당 형식으로 변환해야합니다.

  3. from https://stackoverflow.com/questions/42998607/large-dataset-polynomial-fitting-using-numpy by cc-by-sa and MIT license