मैं कई डेटा बिंदुओं पर एक गाऊशियन फिट करने की कोशिश कर रहा हूं। जैसे मेरे पास डेटा का 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]
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
ध्यान दें कि डेटा जरूरी 256x262144 नहीं है और मैं इस काम करने के लिए nd_fit में आसपास कुछ हेरफेर किया है।
कोड मैं काम करने के लिए इसे पाने के लिए इस्तेमाल करते हैं
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)
नोट: समाधान @JoeKington से नीचे तैनात महान है और वास्तव में तेजी से हल करती है। हालांकि यह तब तक काम नहीं करता जब तक कि गाऊशियन का महत्वपूर्ण क्षेत्र उपयुक्त क्षेत्र के अंदर न हो। मुझे यह जांचना होगा कि क्या मतलब अभी भी सटीक है, क्योंकि यह मुख्य बात है जिसका मैं उपयोग करता हूं।
क्या आप इस्तेमाल किए गए कोड को पोस्ट कर सकते हैं? अधिक जानकारी के लिए –