我试图在许多数据点上进行高斯拟合.例如,我有一个256 x 262144数据阵列.256点需要拟合高斯分布,我需要262144.
有时高斯分布的峰值在数据范围之外,因此要获得准确的平均结果,曲线拟合是最好的方法.即使峰值在范围内,曲线拟合也会提供更好的西格玛,因为其他数据不在范围内.
我使用http://www.scipy.org/Cookbook/FittingData中的代码为一个数据点工作.
我试图重复这个算法,但看起来需要大约43分钟才能解决这个问题.是否有一种已经写好的快速方法可以并行或更有效地执行此操作?
from scipy import optimize
from numpy import *
import numpy
# Fitting code taken from: http://www.scipy.org/Cookbook/FittingData
class Parameter:
def __init__(self, value):
self.value = value
def set(self, value):
self.value = value
def __call__(self):
return self.value
def fit(function, parameters, y, x = None):
def f(params):
i = 0
for p in parameters:
p.set(params[i])
i += 1
return y - function(x)
if x is None: x = arange(y.shape[0])
p = [param() for param in parameters] …Run Code Online (Sandbox Code Playgroud) 是否有Ruby库允许我对一组数据进行线性或非线性最小二乘近似.
我想做的是以下内容:
我不想尝试移植一些C/C++/Java库来获得这个功能,所以我希望有一些我可以使用的现有Ruby库.
我是scipy和matplotlib的新手,我一直在尝试将函数与数据相匹配.Scipy Cookbook中的第一个例子非常有效,但是当我尝试从文件中读取点时,我给出的初始系数(下面的p0)似乎从未真正改变,协方差矩阵总是INF.
我试图在一条线后拟合数据,但无济于事.我导入数据的方式有问题吗?如果是这样,有没有更好的方法呢?
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy as sy
with open('data.dat') as f:
noms = f.readline().split('\t')
dtipus = [('x', sy.float32)] + [('y', sy.float32)]
data = sy.loadtxt(f,delimiter='\t',dtype=dtipus)
x = data['x']
y = data['y']
def func(x, a, b, c):
return a*x**b + c
p0 = sy.array([1,1,1])
coeffs, matcov = curve_fit(func, x, y, p0)
yaj = func(x, coeffs[0], coeffs[1], coeffs[2])
print(coeffs)
print(matcov)
plt.plot(x,y,'x',x,yaj,'r-')
plt.show()
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在使用Scipy CurveFit将高斯曲线拟合到数据中,并且有兴趣分析拟合的质量.我知道CurveFit返回一个有用的pcov矩阵,从中可以将参数popt [0]的每个拟合参数的标准偏差计算为sqrt(pcov [0,0]).
例如代码片段:
import numpy as np
from scipy.optimize import curve_fit
def gaussian(self, x, *p):
A, sigma, mu, y_offset = p
return A*np.exp(-(x-mu)**2/(2.*sigma**2)) + y_offset
p0 = [1,2,3,4] #Initial guess of parameters
popt, pcov = curve_fit(gaussian, x,y, p0) #Return co-effs for fit and covariance
‘Parameter A is %f (%f uncertainty)’ % (popt[0], np.sqrt(pcov[0, 0]))
Run Code Online (Sandbox Code Playgroud)
这给出了拟合曲线方程中每个系数拟合参数的不确定性的指示,但我想知道如何最好地获得整体"拟合参数质量",以便我可以比较不同曲线方程之间的拟合质量(例如高斯,超高斯等)
在一个简单的层面上,我可以计算每个系数的不确定性百分比,然后平均,虽然我想知道是否有更好的方法?从在线搜索,以及特别有用的"适合度"维基百科页面,我注意到有很多措施来描述这一点.我想知道是否有人知道是否有任何内置到Python包/有任何一般建议的好方法来量化曲线拟合.
谢谢你的帮助!
如何使用scipy.optimize中的leastsq函数将直线和二次方拟合到下面的数据集中?我知道如何使用polyfit来做到这一点.但我需要使用leastsq函数.
以下是x和y数据集:
x: 1.0,2.5,3.5,4.0,1.1,1.8,2.2,3.7
y: 6.008,15.722,27.130,33.772,5.257,9.549,11.098,28.828
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
我正在为一些有限大小的物理系统进行计算机模拟,之后我正在对无穷大进行外推(热力学极限).一些理论认为数据应该随着系统规模线性扩展,所以我做的是线性回归.
我的数据有噪音,但对于每个数据点,我可以估算出错误.因此,例如数据点看起来像:
x_list = [0.3333333333333333, 0.2886751345948129, 0.25, 0.23570226039551587, 0.22360679774997896, 0.20412414523193154, 0.2, 0.16666666666666666]
y_list = [0.13250359351851854, 0.12098339583333334, 0.12398501145833334, 0.09152715, 0.11167239583333334, 0.10876248333333333, 0.09814170444444444, 0.08560799305555555]
y_err = [0.003306749165349316, 0.003818446389148108, 0.0056036878203831785, 0.0036635292592592595, 0.0037034897788415424, 0.007576672222222223, 0.002981084130692832, 0.0034913019065973983]
Run Code Online (Sandbox Code Playgroud)
假设我试图在Python中执行此操作.
我知道的第一种方式是:
m, c, r_value, p_value, std_err = scipy.stats.linregress(x_list, y_list)
Run Code Online (Sandbox Code Playgroud)
我理解这给了我结果的错误栏,但这没有考虑初始数据的错误栏.
我知道的第二种方式是:
m, c = numpy.polynomial.polynomial.polyfit(x_list, y_list, 1, w = [1.0 / ty for ty in y_err], full=False)
Run Code Online (Sandbox Code Playgroud)这里我们使用每个点的误差条的倒数作为在最小二乘近似中使用的权重.因此,如果一个点不是那么可靠,那么它不会对结果造成太大影响,这是合理的.
但我无法弄清楚如何获得结合这两种方法的东西.
我真正想要的是第二种方法的作用,意思是当每个点都影响不同权重的结果时使用回归.但与此同时,我想知道我的结果有多准确,这意味着,我想知道结果系数的误码是什么.
我怎样才能做到这一点?
有人可以解释如何使用numpy.polyfit获取Chi ^ 2/doF?
Excel为对的值集生成散点图.它还提供了为趋势线生成最佳拟合趋势线和公式的选项.它还产生气泡图,其考虑了每个值提供的重量.但是,权重对趋势线或公式没有影响.以下是一组示例值及其映射和权重.
Value Map Weight
0 1 10
1 2 10
2 5 10
3 5 20
4 6 20
5 1 1
Run Code Online (Sandbox Code Playgroud)
使用Excel的趋势线,值5的映射对公式有太大影响.有没有办法生成反映各自权重的公式?
作为帮助,我引入了连续五个值的加权平均值.但他们是更好的方式吗?
当我运行类似的东西
import numpy
from sklearn import linear_model
A= #something
b= #something
clf=linear_model.Lasso(alpha=0.015, fit_intercept=False, tol=0.00000000000001,
max_iter=10000000000000, positive=True)
clf.fit(A,b)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
usr/local/lib/python2.7/dist-packages/scikit_learn-0.14.1-py2.7-linux-x86_64.egg/
sklearn/linear_model/coordinate_descent.py:418: UserWarning: Objective did not
converge. You might want to increase the number of iterations
' to increase the number of iterations')
Run Code Online (Sandbox Code Playgroud)
有趣的是,A从来没有排名低效.(我认为)
我想执行Deming回归(或任何等效的回归方法,包括X和Y变量的不确定性,例如York回归).
在我的应用程序中,我有一个非常好的科学理由来故意将拦截设置为零.但是,我无法找到将其设置为零的方法,无论是在R包中deming,当我-1在公式中使用时都会出错:
df=data.frame(x=rnorm(10), y=rnorm(10), sx=runif(10), sy=runif(10))
library(deming)
deming(y~x-1, df, xstd=sy, ystd=sy)
Error in lm.wfit(x, y, wt/ystd^2) : 'x' must be a matrix
Run Code Online (Sandbox Code Playgroud)
在其他包(如mcr::mcreg或IsoplotR::york或MethComp::Deming)中,输入是两个向量x和y,因此我无法输入模型矩阵或修改公式.
你对如何实现这个有任何想法吗?谢谢.
least-squares ×10
python ×7
scipy ×4
numpy ×3
coefficients ×1
excel ×1
gaussian ×1
graph ×1
python-3.x ×1
r ×1
regression ×1
ruby ×1
scikit-learn ×1