Обобщение гауссовой смеси для принятия любого количества аргументов приводит к проблемам с производительностью.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обобщение гауссовой смеси для принятия любого количества аргументов приводит к проблемам с производительностью.

Сообщение Anonymous »

Я оптимизирую гауссову смесь, используя оценку максимального правдоподобия. Первоначально я использовал следующую модель:

Код: Выделить всё

def normal(x, mu, sigma):
"""
Gaussian (normal) probability density function.

Args:
x (np.ndarray): Data points.
mu (float): Mean of the distribution.
sigma (float): Standard deviation of the distribution.

Returns:
np.ndarray: Probability density values.
"""
return (1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-0.5 * ((x - mu) / sigma) ** 2)

def model(x, a, mu1, s1, mu2, s2):
return a*normal(x, mu1, s1) + (1-a)*normal(x, mu2, s2)
Это прекрасно работает и находит хорошее соответствие менее чем за секунду.
Теперь я хотел динамически генерировать такую ​​функцию для любого количества пиков.

Код: Выделить всё

def generate_gaussian_mix(n):
def gaussian_mix(x, *params):

if len(params) != 3 * n - 1:
print(params)
raise ValueError(f"Expected {3 * n - 1} parameters, but got {len(params)}.")

params = np.asarray(params)
mu = params[0::3]  # Means
sigma = params[1::3]  # Standard deviations
a = params[2::3]  # Weights
a = np.hstack((a, 1 - np.sum(a)))

return np.sum((a / (np.sqrt(2 * np.pi) * sigma))*np.exp(-0.5 * ((x - mu) / sigma) ** 2))

return np.vectorize(gaussian_mix)
Вычисление этой модели на моем ноутбуке занимает более трех минут с таким же количеством пиков и событий. Какие шаги по оптимизации я мог бы предпринять, чтобы уменьшить величину этой второй функции? Есть ли хороший способ избежать векторизации? Есть ли у вас идеи, как избежать повторного нарезания?
для полноты картины это функция оптимизации:

Код: Выделить всё

def neg_log_event_likelyhood(model, event, theta):
x = -np.log(model(event, *theta))
return x

def fit_distribution_anneal(model, events, bounds, data_range = None, **kwargs):
def total_log_likelyhood(theta, model, events):
return np.sum(neg_log_event_likelyhood(model, events, theta))

if data_range is not None:
events = np.copy(events)
events = events[np.logical_and(events > data_range[0], events < data_range[1])]

result = dual_annealing(total_log_likelyhood, bounds, args=(model, events), **kwargs)
params = result.x

return params
Отжиг требуется, а не минимизируется из-за невыпуклого характера проблемы.

Подробнее здесь: https://stackoverflow.com/questions/792 ... formance-i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»