2017-05-30 6 views
0

The fit that I am gettingPythonのデータは

をフィッティング私は、このデータへの放物線に合うようにしようとしている恐ろしいフィットを取得しています。 私は最初にオブジェクトの位置であるデータのヒストグラムを作成し、ヒストグラムのビン数の負のログ値を放物線の当てはめを使ってその位置にプロットします。 私が使用していたコードはこれです:ここ

time,pos=postime() 
plt.plot(time, pos) 
poslen=len(pos) 
plt.xlabel('Time') 
plt.ylabel('Positions') 
plt.show() 


n,bins,patches = plt.hist(pos,bins=100) 
n=n.tolist() 
plt.show() 
l=len(bins) 
s=len(n) 
posx=[] 
i=0 
j=0 
pbin=[] 
sig=[] 
while j < (l-1): 
    pbin.append((bins[j]+bins[j+1])/2) 
    j=j+1 

while i < s: 

    if n[i]==0: 
     pbin[i]=0 
    else: 
     sig.append(np.power(1/n[i],2)) 
     n[i]=n[i]/poslen 

     n[i]=np.log(n[i]) 
     n[i]=n[i]*(-1) 
    i=i+1 


n[:]=[y for y in n if y != 0] 
pbin[:]=[y for y in pbin if y != 0]  

from scipy.optimize import curve_fit 
def parabola(x, a , b): 
    return a * (np.power(x,2)) + b 

popt, pcov = curve_fit(parabola, pbin, n) 
print popt 

plt.plot(pbin,n) 
plt.plot(pbin, parabola(pbin, *popt), 'r-') 
+0

リンクをクリックしてください。 –

+0

ようこそ、あなたは完全なコードを提供できますか? ([最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を参照してください) – Nuageux

+0

ありがとうございます。 私はしました –

答えて

1

私はあなたがヒストグラムを計算している理由はわからない...しかし、ヒストグラムの計算を必要としない実施例です。 fittime_ = np.linsapce(np.min(time_), np.max(time_))その後、yfit = parabola(fittime_, *popt)を:あなたのtime_ベクトルが均一にサンプリングされていない場合

enter image description here

import numpy as np 
from scipy.optimize import curve_fit 
from matplotlib import pyplot 


time_ = np.arange(-5, 5, 0.1) 
pos = time_**2 + np.random.rand(len(time_))*5 

def parabola(x, a, b): 
    return a * (np.power(x, 2)) + b 

popt, pcov = curve_fit(parabola, time_, pos) 
yfit = parabola(time_, *popt) 

pyplot.plot(time_, pos, 'o') 
pyplot.plot(time_, yfit) 

はまた、あなたはそれが一様に、あなたが行うことができますフィット感のためにサンプリングすることにしたいです。

+0

私はデータのさらなる分析のためにヒストグラムが必要です。 –

0

また、行列反転を使用することもできます。

import numpy as np 
import matplotlib.pyplot as plt 
x = np.linspace(-5,5,100) 
Y = (np.power(x,2) + np.random.normal(0,1,x.shape)).reshape(-1,1) 

X = np.c_[np.ones(x.shape), x, np.power(x,2)] 
A = np.linalg.inv(X.transpose().dot(X)).dot(X.transpose().dot(Y)) 
Yp = X.dot(A) 

fig = plt.figure() 
ax = fig.add_subplot() 
plt.plot(x,Y,'o',alpha=0.5) 
plt.plot(x,Yp) 
plt.show() 

行列形式は、必要な場合は、より良いアイデアhereを持つことができます

X*A=Y 
A=(Xt*X)-1*Xt*Y 

です。それはいつもうまくいくわけではなく、regularizationの何らかの形を適用したいかもしれません。