首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python数据拟合

Python数据拟合
EN

Stack Overflow用户
提问于 2017-05-30 17:47:25
回答 2查看 86关注 0票数 0

当我试图用抛物线来拟合这个数据时,我得到了一个可怕的拟合。我首先制作一个数据的直方图,这是一个对象的位置,然后使用抛物线拟合绘制该位置的直方图bin计数的负对数值。我使用的代码是这样的:

代码语言:javascript
复制
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-')
EN

回答 2

Stack Overflow用户

发布于 2017-06-01 04:43:58

我不知道你为什么要计算直方图。但这里有一个不需要计算直方图的工作示例。

代码语言:javascript
复制
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)

此外,如果对time_向量进行了非均匀采样,并且希望对其进行均匀采样以进行拟合,则可以执行以下操作:fittime_ = np.linsapce(np.min(time_), np.max(time_)),然后是yfit = parabola(fittime_, *popt)

票数 1
EN

Stack Overflow用户

发布于 2017-06-01 05:52:49

您还可以使用矩阵求逆。

代码语言:javascript
复制
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()

矩阵形式为

代码语言:javascript
复制
X*A=Y
A=(Xt*X)-1*Xt*Y

如果需要,你可以有一个更好的想法here。它并不总是有效的,您可能想要应用某种形式的regularization

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44258855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档