Я пишу программу обработки данных для масс-спектрометрии анализа остаточных газов. В частности, я пытаюсь смоделировать потребление газа посредством ионизации как экспоненциальную функцию затухания:
y = a * exp(-p*t) + b
где:
t — независимая переменная, время в секундах после уравновешивания газа t=0
y — зависимая переменная, интенсивность газа в амперах.
a, b и p — подходящие параметры.
Целью этой подгонки кривой является определение интенсивности y_0 в точке пересечения t=0. Это количество газа, которое мы измерили бы, если бы газ не нуждался в уравновешивании.
Это хорошо работает для большинства анализов, однако иногда это происходит. имеет тенденцию «переопределять» первые несколько данных и давать нереально высокие показатели потребления:
Обратите внимание, что прогнозируемый перехват на 11 порядков превышает любые фактические данные.
Одно из предлагаемых решений этой проблемы (которое не было выполнено) работа) заключалась в том, чтобы предоставить процедуре подгонки (curve_fit или lmfit) следующие первоначальные предположения:
Хотя это не работает, как следует из первоначальных предположений, процедура подбора кривой все равно убегает с значение p — это первоначальное предположение о p всегда гораздо более разумно, чем то, которое возвращается процедурой «оптимизации».
Я изучал байесовский метод подходы и хотели бы использовать эти первоначальные предположения и их отклонения как априорные знания для наказания совпадений, которые слишком сильно отклоняются от этих предположений - или, по крайней мере, от первоначального предположения p.
Проблема в том, что я совершенно новичок в этом и совершенно не понимаю, как это будет реализовано. Будем очень признательны за любые рекомендации.
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
# exponential decay
def model(t, a, b, p):
return a * np.exp(p * t) + b
# a must be positive; p must be negative
def set_boundaries():
return [0, -np.inf, -np.inf], [np.inf, np.inf, 0]
# generate the sum term S and the first left-hand side matrix of the linear system lhs1_p
def initial_guess_p_S_and_lhs1_p(t, y):
S = [0]
for i in range(1, len(t)):
S.append(S[i-1] + 0.5 * (t - t) * (y + y))
S = np.array(S)
# linearize the problem and generate an initial guess of p
def initial_guess_p(t, y):
S, lhs1_p = initial_guess_p_S_and_lhs1_p(t, y)
lhs2 = [
np.sum(S*y),
np.sum(t*y),
np.sum(y)
]
init_p, _, _ = np.linalg.solve(lhs1_p, lhs2)
return init_p
# generate the left-hand side matrix of the linear system lhs1_ab
def initial_guess_ab_lhs1_ab(t, init_p):
return [
[len(t), np.sum(np.exp(init_p*t))],
[np.sum(np.exp(init_p*t)), np.sum(np.exp(2*init_p*t))]
]
# generate initial guesses of a and b
def initial_guesses_ab(t, y, init_p):
lhs1_ab = initial_guess_ab_lhs1_ab(t, init_p)
lhs2 = [
np.sum(y),
np.sum(y*np.exp(init_p*t))
]
init_b, init_a = np.linalg.solve(lhs1_ab, lhs2)
return init_a, init_b
# generate the residuals of the model
def initial_residuals(t, y, a, b, p):
return y - model(t, a, b, p)
# generate the initial guess of the variance of the residuals
def init_p_error(t, y, init_p, initial_resids):
S, lhs1_p = initial_guess_p_S_and_lhs1_p(t, y)
init_p_variance, _, _ = np.linalg.inv(lhs1_p) * np.sum(initial_resids**2)
return init_p_variance
# generate the initial guess of the variance of the residuals
def init_ab_error(t, init_p, initial_resids):
lhs1_ab = initial_guess_ab_lhs1_ab(t, init_p)
init_b_variance, init_a_variance = np.linalg.inv(lhs1_ab) * np.sum(initial_resids**2)
return init_a_variance, init_b_variance
# Add the main function to test the above functions
def main():
t = np.linspace(0, 10, 100)
a, b, p = 2.5, 1.0, -0.5
y = model(t, a, b, p) + 0.1 * np.random.normal(size=t.size)
init_p = initial_guess_p(t, y)
init_a, init_b = initial_guesses_ab(t, y, init_p)
Я пишу программу обработки данных для масс-спектрометрии анализа остаточных газов. В частности, я пытаюсь смоделировать потребление газа посредством ионизации как экспоненциальную функцию затухания: y = a * exp(-p*t) + b
где: [list] [*]t — независимая переменная, время в секундах после уравновешивания газа t=0 [*]y — зависимая переменная, интенсивность газа в амперах. [*]a, b и p — подходящие параметры. [/list] Целью этой подгонки кривой является определение интенсивности y_0 в точке пересечения t=0. Это количество газа, которое мы измерили бы, если бы газ не нуждался в уравновешивании. Это хорошо работает для большинства анализов, однако иногда это происходит. имеет тенденцию «переопределять» первые несколько данных и давать нереально высокие показатели потребления: [img]https://i.sstatic.net/lsw23q9F.png[/img]
Обратите внимание, что прогнозируемый перехват на 11 порядков превышает любые фактические данные. Одно из предлагаемых решений этой проблемы (которое не было выполнено) работа) заключалась в том, чтобы предоставить процедуре подгонки (curve_fit или lmfit) следующие первоначальные предположения: [img]https://i.sstatic.net/LRoVZXBd.jpg[/img]
Хотя это не работает, как следует из первоначальных предположений, процедура подбора кривой все равно убегает с значение p — это первоначальное предположение о p всегда гораздо более разумно, чем то, которое возвращается процедурой «оптимизации». Я изучал байесовский метод подходы и хотели бы использовать эти первоначальные предположения и их отклонения как априорные знания для наказания совпадений, которые слишком сильно отклоняются от этих предположений - или, по крайней мере, от первоначального предположения p. Проблема в том, что я совершенно новичок в этом и совершенно не понимаю, как это будет реализовано. Будем очень признательны за любые рекомендации. import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt
# exponential decay def model(t, a, b, p): return a * np.exp(p * t) + b
# a must be positive; p must be negative def set_boundaries(): return [0, -np.inf, -np.inf], [np.inf, np.inf, 0]
# generate the sum term S and the first left-hand side matrix of the linear system lhs1_p def initial_guess_p_S_and_lhs1_p(t, y): S = [0] for i in range(1, len(t)): S.append(S[i-1] + 0.5 * (t[i] - t[i - 1]) * (y[i] + y[i - 1])) S = np.array(S)
# linearize the problem and generate an initial guess of p def initial_guess_p(t, y): S, lhs1_p = initial_guess_p_S_and_lhs1_p(t, y) lhs2 = [ np.sum(S*y), np.sum(t*y), np.sum(y) ]
init_p, _, _ = np.linalg.solve(lhs1_p, lhs2)
return init_p
# generate the left-hand side matrix of the linear system lhs1_ab def initial_guess_ab_lhs1_ab(t, init_p): return [ [len(t), np.sum(np.exp(init_p*t))], [np.sum(np.exp(init_p*t)), np.sum(np.exp(2*init_p*t))] ]
# generate initial guesses of a and b def initial_guesses_ab(t, y, init_p): lhs1_ab = initial_guess_ab_lhs1_ab(t, init_p)
lhs2 = [ np.sum(y), np.sum(y*np.exp(init_p*t)) ]
init_b, init_a = np.linalg.solve(lhs1_ab, lhs2)
return init_a, init_b
# generate the residuals of the model def initial_residuals(t, y, a, b, p): return y - model(t, a, b, p)
# generate the initial guess of the variance of the residuals def init_p_error(t, y, init_p, initial_resids): S, lhs1_p = initial_guess_p_S_and_lhs1_p(t, y) init_p_variance, _, _ = np.linalg.inv(lhs1_p) * np.sum(initial_resids**2)
return init_p_variance
# generate the initial guess of the variance of the residuals def init_ab_error(t, init_p, initial_resids): lhs1_ab = initial_guess_ab_lhs1_ab(t, init_p) init_b_variance, init_a_variance = np.linalg.inv(lhs1_ab) * np.sum(initial_resids**2)
return init_a_variance, init_b_variance
# Add the main function to test the above functions def main(): t = np.linspace(0, 10, 100) a, b, p = 2.5, 1.0, -0.5 y = model(t, a, b, p) + 0.1 * np.random.normal(size=t.size)
init_p = initial_guess_p(t, y) init_a, init_b = initial_guesses_ab(t, y, init_p)
Я пишу программу обработки данных для масс-спектрометрии анализа остаточных газов. В частности, я пытаюсь смоделировать потребление газа посредством ионизации как экспоненциальную функцию затухания:
y = a * exp(-p*t) + b
Я использую pyAgrum для анализа байесовских сетей, сообщение об ошибке, которое я получаю, связано с тем, что когда я разделяю свои данные с размером теста 0,2, существуют некоторые комбинации моих переменных (в частности, комбинация COL =0, RA=4,...
Пользователь нарисует кривую Я просто хочу нарисовать границу вокруг кривой на определенном расстоянии от кривой, например 10 пикселей. Я хочу использовать описанный выше подход к изображению.
У меня есть список точек кривой. См. образец изображения...
Я работаю в Python, я получаю точки данных для кривой, показанной фиолетовым цветом, которая представляет собой G (t). Показанная G (t) на самом деле представляет собой полиномиальную аппроксимацию экспериментальных точек данных. А красная кривая...