Si vous souhaitez ajuster la courbe des données d'échantillon avec polypoly, vous pouvez facilement le faire en utilisant polyfit de numpy. La courbe est représentée par le polynôme suivant. polyfit calculera $ a_n $ dans la formule ci-dessous.
y = \sum^{N}_{n=0} a_n x^n
Les valeurs renvoyées par polyfit sont répertoriées par ordre décroissant. La formule est la suivante.
y = \sum^N_{n=0} a_n x^{N-n}
Si vous voulez dessiner un graphique d'une courbe en utilisant le coefficient obtenu par polyfit, préparez la valeur de x dans numpy.linspace etc. et passez le coefficient et x à numpy.polyval pour calculer y.
La figure ci-dessous montre le résultat de l'ajustement de la courbe avec des exemples de données et une équation linéaire. Le coefficient peut être obtenu simplement en définissant numpy.polyfit (x, y, 1). x et y sont des données et 1 est l'ordre.
w = np.polyfit(x,y,1)
xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f]' % (w[0],w[1]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
Des exemples de données ont été créés comme suit.
def getData1(numPoints, w,b, nstdev, xmin=0.0, xmax=1.0 ):
x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)
y = w * x + b + n
return x, y
x, y = getData1(100, 1.5, 10, 10, xmin=0, xmax=100)
Résultat de l'ajustement de courbe avec un polypoly cubique
w = np.polyfit(x,y,3)
xs = np.linspace(np.min(x),np.max(x),100)
ys = np.polyval(w,xs)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y,label='input')
ax.plot(xs, ys, 'r-', lw=2, label='polyfit')
ax.set_title('polyfit w = [%.2f, %.2f, %.2f, %.2f]' % (w[0],w[1],w[2],w[3]))
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend(loc='best',frameon=False)
ax.grid(True)
Des exemples de données ont été créés comme suit.
def getData2(numPoints, Amp, freq, phase, nstdev, xmin=0.0, xmax=np.pi*2.0 ):
x = scipy.stats.uniform.rvs(loc=xmin, scale=xmax-xmin,size=numPoints)
n = scipy.stats.norm.rvs(size=numPoints, scale=nstdev)
y = Amp*np.sin(freq * x + phase) + n
return x, y
x, y = getData2(100, 10, 1.0, 0.0, 5, xmin=0, xmax=np.pi*2.0)
URL de référence https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html#numpy.polyval
Recommended Posts