0
私は、与えられたデータに複数のガウス分布を当てようとしています。プログラムのこの部分は、500番目のモデルに到達すると約3 GBのメモリを使用しています。ここでは良いフィット感を得られないだろう、ランダムに生成されたデータ、と私のプログラムの簡体バージョンがあるが、それは時間の問題について説明します。Pythonフィッティング:最適化ループ
import sys
sys.setrecursionlimit(5000)
import matplotlib.pyplot as plt
import numpy as np
import random
from random import uniform
x=[random.uniform(2200.,3100.) for p in range(0, 1000)]
y=[random.uniform(1.,1000.) for p in range(0, 1000)]
import sherpa.ui as ui
import numpy as np
ui.load_arrays(1,x,y) # 1 is the first data
d1=ui.get_data()
d1.staterror=0.002*d1.y # define error on y just for plotting purpose, not required for fit
ui.plot_data()
ui.set_stat("leastsq") # leasr square method for fit
ui.set_model(ui.powlaw1d.pow1) # fit powerlaw.. pow1 is the shortcut name
# ui.show_all() will show you all the parameters for the model
pow1.ref=2500
ui.fit()
# fitting templates
x2=[random.uniform(2200.,3100.) for p in range(0, 1000)]
y2=[random.uniform(1.,1000.) for p in range(0, 1000)]
model1="pow1" # initiliaze the model for fitting all the gaussians
sign="+"
sigma=45.
g_pos=x2
g_ampl=[] # we will store the fit value here
ui.freeze(model1) # freeze the powerlaw
for n in range(1,1000): # this excludes the upper limit
ui.create_model_component("gauss1d","g{}".format(n))
ui.set_par("g{}.pos".format(n),x2[n],frozen=True)
ui.set_par("g{}.ampl".format(n),y2[n])
ui.set_par("g{}.fwhm".format(n),sigma,frozen=True)
model1=model1+sign+"g{}".format(n)
if y2[n] == 0.:
g_ampl.append(0.) # list zero amplitude for this model
else:
g=ui.create_model_component("gauss1d","g{}".format(n)) # do this to store g_ampl of this model only
ui.set_source(model1) # overwriting with actual model
ui.fit()
ui.fit()
ui.fit()
g_ampl.append(g.ampl.val)
ui.freeze(model1) # freeze the model and go to the next gaussian
私はそれを作るためにこの部分を最適化する方法を考え出すことができません効率的で時間の節約になります。私がそれをより速く走らせるのを助けるどんな考えも感謝されるでしょう。
あなたのコードは実行されません。あなたはあなたの質問を編集して[最小限の完全な検証可能な例](http://stackoverflow.com/help/mcve)が含まれていることを確認できますか?あなたが何をしようとしているのか、あなたが使っているパッケージを理解することは非常に難しいです。 –
この[リンク](https://wiki.python.org/moin/PythonSpeed/PerformanceTips)が役立つことを願っています。 まず、 "範囲"を "xrange"に変更する –
@CurtF。、私はコードを編集し、(プログラムのように)ランダムに生成されたデータ上で実行することができます。私はコメントを含めた。助けてくれたら教えてください。 – Phyast10