Tôi đang cố gắng làm cho phù hợp gaussian trên nhiều điểm dữ liệu. Ví dụ. Tôi có một mảng dữ liệu 256 x 262144. Nơi 256 điểm cần được trang bị cho một phân phối gaussian, và tôi cần 262144 của chúng.Làm cách nào để tôi có thể thực hiện một hình vuông nhỏ nhất phù hợp với nhiều bộ dữ liệu nhanh?
Đôi khi đỉnh của phân phối gaussian nằm ngoài phạm vi dữ liệu, vì vậy để có được đường cong kết quả trung bình chính xác là cách tiếp cận tốt nhất. Ngay cả khi đỉnh nằm trong phạm vi, đường cong phù hợp cho một sigma tốt hơn bởi vì các dữ liệu khác không nằm trong phạm vi.
Tôi làm việc này cho một điểm dữ liệu, sử dụng mã từ http://www.scipy.org/Cookbook/FittingData.
Tôi đã cố gắng lặp lại thuật toán này, nhưng có vẻ như nó sẽ mất thứ gì đó theo thứ tự 43 phút để giải quyết vấn đề này. Có cách viết nhanh nào đã thực hiện điều này song song hay hiệu quả hơn không?
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]
optimize.leastsq(f, p)
def nd_fit(function, parameters, y, x = None, axis=0):
"""
Tries to an n-dimensional array to the data as though each point is a new dataset valid across the appropriate axis.
"""
y = y.swapaxes(0, axis)
shape = y.shape
axis_of_interest_len = shape[0]
prod = numpy.array(shape[1:]).prod()
y = y.reshape(axis_of_interest_len, prod)
params = numpy.zeros([len(parameters), prod])
for i in range(prod):
print "at %d of %d"%(i, prod)
fit(function, parameters, y[:,i], x)
for p in range(len(parameters)):
params[p, i] = parameters[p]()
shape[0] = len(parameters)
params = params.reshape(shape)
return params
Lưu ý rằng dữ liệu không nhất thiết phải là 256x262144 và tôi đã thực hiện một số fudging xung quanh trong nd_fit để thực hiện công việc này.
Mã tôi sử dụng để có được điều này để làm việc là
from curve_fitting import *
import numpy
frames = numpy.load("data.npy")
y = frames[:,0,0,20,40]
x = range(0, 512, 2)
mu = Parameter(x[argmax(y)])
height = Parameter(max(y))
sigma = Parameter(50)
def f(x): return height() * exp (-((x - mu())/sigma()) ** 2)
ls_data = nd_fit(f, [mu, sigma, height], frames, x, 0)
Lưu ý: Các giải pháp đăng tải dưới đây bởi @JoeKington là rất tốt và giải quyết rất nhanh. Tuy nhiên nó dường như không hoạt động trừ khi khu vực quan trọng của gaussian nằm trong khu vực thích hợp. Tôi sẽ phải kiểm tra nếu có nghĩa là vẫn còn chính xác mặc dù, vì đó là điều chính tôi sử dụng này cho.
Bạn có thể đăng mã bạn đã sử dụng không? –