首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:在str和int实例之间不支持带有简单ODE跟踪错误<=的<=

python:在str和int实例之间不支持带有简单ODE跟踪错误<=的<=
EN

Stack Overflow用户
提问于 2020-06-22 08:04:49
回答 1查看 128关注 0票数 0

我有一个简单的ODE,它有一些未知的参数(r,C,mu和伽马),可以预测经过清洗后表面细菌的衰变和再生。我有不同时间点(0h、1h、2h、4h、8h和24h)细菌数量的实验数据。我试图使用EasyABC软件包估计参数分布r,C,d和g,用近似的by计算序列蒙特卡罗模拟方法。

ODE的定义如下:

实验数据如下:

#序言

代码语言:javascript
复制
from pyabc import (ABCSMC,
                   RV, Distribution,
                   MedianEpsilon,
                   LocalTransition)
from pyabc.visualization import plot_kde_2d, plot_data_callback
import matplotlib.pyplot as plt
import os
import tempfile
import numpy as np
from scipy.integrate import odeint
import math
db_path = ("sqlite:///" +
           os.path.join(tempfile.gettempdir(), "test.db"))

#实验数据

代码语言:javascript
复制
initial_contamination=59 #For ODE
measurement_data = np.array([19,5,5,2,9]) #To compare simulation against
s=[26,2.3,4.67,4.33,4.27] #Standard deviation used in Distance
precision=5000

measurement_times = np.array([0,1,2,4,8,24]) #Hours after cleaning

#定义ODE:

代码语言:javascript
复制
def ode_model(contamination,t,r,C,mu,gamma):
    Contamination = contamination;
    return(Contamination*r*(1-Contamination/C)-mu*math.exp(-gamma*t)*Contamination)

def deterministic_run(parameters):#precision,initial_contamination,r,C,mu, gamma):
    precision=5000
    tmax = 24
    time_space = np.linspace(0,tmax,precision+1)
    sim=odeint(ode_model,initial_contamination,time_space,args=(parameters["r"],parameters["C"],parameters["mu"],parameters["gamma"]))
    num_at_1=sim[int(precision*1/50.0)]
    num_at_2=sim[int(precision*2/50.0)]
    num_at_4=sim[int(precision*4/50.0)]
    num_at_8=sim[int(precision*8/50.0)]
    num_at_24=sim[int(precision*24/50.0)]
    return([num_at_1,num_at_2,num_at_4,num_at_8,num_at_24])

#定义先验分布

代码语言:javascript
复制
parameter_prior = Distribution(r=RV("uniform", 0, 4),
                               C=RV("uniform", 6, 15),
                               mu=RV("uniform", 0, 4),
                               gamma=RV("uniform", 0, 4))

parameter_prior.get_parameter_names()

#定义欧氏距离:

代码语言:javascript
复制
def Distance(x,y,s):

    # computes the Euclidean distance between two lists of the same length

    if len(x) == len(y):

        return math.sqrt(sum([(((x[i]-y[i])/s[i])**2) for i in range(len(x))]))

    else:

        return 'lists not the same length'

#设置ABC配置

代码语言:javascript
复制
abc = ABCSMC(models=deterministic_run,
             parameter_priors=parameter_prior,
             distance_function=Distance,
             population_size=50,
             transitions=LocalTransition(k_fraction=.3),
             eps=MedianEpsilon(500, median_multiplier=0.7))



abc.new(db_path, {"Contamination": measurement_data})

#运行ABC

代码语言:javascript
复制
h = abc.run(minimum_epsilon=0.1, max_nr_populations=5)

我所犯的错误

TypeError:“str”和“int”实例之间不支持“<=”

这指的是acceptor.py的第100行

def初始化( self,t: int,get_weighted_distances: Callable[[],pd.DataFrame],distance_function: method,x_0: dict):“”初始化。该方法最初由ABCSMC框架调用,可用于校准受主到初始统计信息。默认情况是什么都不做。

代码语言:javascript
复制
    Parameters
    ----------

    t: int
        The timepoint to initialize the acceptor for.
    get_weighted_distances: Callable[[], pd.DataFrame]
        Returns on demand the distances for initializing the acceptor.
    distance_function: Distance
        Distance object. The acceptor should not modify it, but might
        extract some meta information.
    x_0: dict
        The observed summary statistics.
    """
    pass

但我不知道这是怎么回事。任何想法都将不胜感激。

编辑:完全回溯:

代码语言:javascript
复制
runfile('/Users/YYY/Downloads/Beth/Code/pyABC_Cleaning.py', wdir='/Users/YYY/Downloads/Beth/Code')
INFO:Sampler:Parallelizing the sampling on 8 cores.
INFO:History:Start <ABCSMC(id=1, start_time=2020-06-22 09:19:29.808488, end_time=None)>
INFO:ABC:t: 0, eps: 500.
Process Process-1:
Traceback (most recent call last):
Process Process-4:
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
Traceback (most recent call last):
Process Process-2:
Process Process-3:
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
Process Process-5:
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
Process Process-6:
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
Process Process-7:
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
Process Process-8:
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
TypeError: '<=' not supported between instances of 'str' and 'int'
Traceback (most recent call last):
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 37, in work
    new_sim = simulate_one()
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
TypeError: '<=' not supported between instances of 'str' and 'int'
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 598, in simulate_one
    weight_function)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 683, in _evaluate_proposal
    x_0)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/model.py", line 213, in accept
    par=pars)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 306, in __call__
    distance_function, eps, x, x_0, t, par)
  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/acceptor/acceptor.py", line 242, in accept_use_current_time
    accept = d <= eps(t)
TypeError: '<=' not supported between instances of 'str' and 'int'
Traceback (most recent call last):

  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicorebase.py", line 100, in get_if_worker_healthy
    item = queue.get(True, 5)

  File "/Users/YYY/opt/anaconda3/lib/python3.7/multiprocessing/queues.py", line 105, in get
    raise Empty

Empty


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "/Users/YYY/Downloads/Beth/Code/pyABC_Cleaning.py", line 115, in <module>
    h = abc.run(minimum_epsilon=0.1, max_nr_populations=5)

  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/smc.py", line 890, in run
    pop_size, simulate_one, max_eval)

  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/base.py", line 151, in sample_until_n_accepted
    sample = f(self, n, simulate_one, max_eval, all_accepted)

  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicore_evaluation_parallel.py", line 121, in sample_until_n_accepted
    val = get_if_worker_healthy(processes, queue)

  File "/Users/YYY/opt/anaconda3/lib/python3.7/site-packages/pyabc/sampler/multicorebase.py", line 104, in get_if_worker_healthy
    raise ProcessError("At least one worker is dead.")

ProcessError: At least one worker is dead.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-22 08:31:51

错误来自这条线,是由返回字符串的距离函数造成的。您将距离定义为:

代码语言:javascript
复制
def Distance(x,y,s):
    # computes the Euclidean distance between two lists of the same length
    if len(x) == len(y):
        return math.sqrt(sum([(((x[i]-y[i])/s[i])**2) for i in range(len(x))]))
    else:
        return 'lists not the same length'

因此,我猜您将在else情况下结束,返回字符串并使用您看到的错误杀死工作人员。您必须检查您的xy,以找出导致它们长度不同的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62509934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档