Python 3.x 在FOR循环中运行PYMC3时内存泄漏

Python 3.x 在FOR循环中运行PYMC3时内存泄漏,python-3.x,for-loop,memory-leaks,theano,pymc3,Python 3.x,For Loop,Memory Leaks,Theano,Pymc3,我使用PYMC3来拟合网球运动员的发球得分率,使用贝塔曲线的贝叶斯拟合。每次代码在播放器中循环时,内存使用都会稍微增加。我正在尝试在3个不同的场地上为400多名玩家进行此操作,大约200名玩家之后,我的内存就用完了。我不明白为什么每次循环迭代后内存没有被重新设置,因为我认为我没有使用以前循环迭代的信息。 我认为问题可能与追踪有关。我在某个地方看到建议,我不应该让trace=pm.sample(…),而应该只让pm.sample(…),然后在程序运行后获取数据。我不知道如何实现该修复,我希望有一个

我使用PYMC3来拟合网球运动员的发球得分率,使用贝塔曲线的贝叶斯拟合。每次代码在播放器中循环时,内存使用都会稍微增加。我正在尝试在3个不同的场地上为400多名玩家进行此操作,大约200名玩家之后,我的内存就用完了。我不明白为什么每次循环迭代后内存没有被重新设置,因为我认为我没有使用以前循环迭代的信息。 我认为问题可能与追踪有关。我在某个地方看到建议,我不应该让trace=pm.sample(…),而应该只让pm.sample(…),然后在程序运行后获取数据。我不知道如何实现该修复,我希望有一个更直接的解决方案,解决我想象中的一个相当常见的问题(尽管我在网上没有看到太多关于它的问题)

代码的相关位如下所示。提前感谢你的帮助

import pymc3 as pm
prior_parameters = beta.fit(chart_data, floc = 0, fscale = 1)
prior_a, prior_b = prior_parameters[0:2]
for i in range(server_by_surface_pct.shape[0]):
    #srv_count is number of serves taken by player i on surface j
    srv_count = pivot_srv_count.iat[i, j]  
    #Go to next iteration of loop if no serves for player i on surface j
    if np.isnan(srv_count):
        continue
    #ace_pct is the percent of serves from player i on surface j that are aces
    ace_pct = server_by_surface_pct.iat[i,j]
    #calculate ace_count (number of aces) by player i on surface j
    ace_count = round(srv_count*ace_pct,0)
    #zero aces is possible so replace NANs with ZERO
    if np.isnan(ace_count):
        ace_count = 0.0
    #pm = PYMC3 -- this is the Bayesian fitting model
    with pm.Model() as model:
        theta_prior = pm.Beta('prior', prior_a, prior_b)
        observations = pm.Binomial('obs',n = srv_count, p = theta_prior, observed = ace_count)
        start = pm.find_MAP()
        step = pm.NUTS(scaling=start)
        trace = pm.sample(1000, step=step, start=start, progressbar=True)      
    #mean of the trace is the new fitted serve percent for player i on surface j
    server_by_surface_pct_fitted.iat[i,j] = np.mean(trace['prior'])

我正在挖掘关于重新创建内存泄漏的内容,但想提到的是,对于这个模型,
np.mean(trace['prior'])=prior\u a/(prior\u b+prior\u a+srv\u count)
,它根本不需要MCMC采样。谢谢你为我挖掘这个。但是由于先验分布a和先验分布b是beta分布的参数,被用作先验分布,我认为这个公式不成立。我可能错了。假设平均利率约为7%。当一名球员以3%的王牌率完成循环,并计算出50次发球时,他的平均发球轨迹值大约为4%。但一名得分率为3%且发球数为100次的球员只能得到3.5%的平均得分。Previor_a和Previor_b在每个曲面上都应该是常数。我正在研究如何重新创建内存泄漏,但我想提到的是,对于这个模型,
np.mean(trace['previor'])=Previor_a/(Previor_b+Previor_a+srv_count)
,这根本不需要MCMC采样。谢谢你为我研究colcarroll。但是由于先验分布a和先验分布b是beta分布的参数,被用作先验分布,我认为这个公式不成立。我可能错了。假设平均利率约为7%。当一名球员以3%的王牌率完成循环,并计算出50次发球时,他的平均发球轨迹值大约为4%。但一名得分率为3%且发球数为100次的球员只能得到3.5%的平均得分。每个表面上的前_a和前_b应保持不变。