Оценка ответственности кластера в задаче максимизации ожидания с помощью простой смеси двух одномерных гауссианов - PullRequest
0 голосов
/ 07 апреля 2020

Я столкнулся со странной проблемой при оценке ответственности кластера как части алгоритма максимизации ожидания. Назначение простое. Два одномерных гауссиана задаются с параметрами mu_1 = 0, mu_2 = 1,13 и var_1 = 0,01, var_2 = 0,006 (это отклонения, а не стандартные отклонения). Обязанности кластера оцениваются следующим образом:

расчет ответственности

Я реализовал расчет следующим образом:

import numpy as np
import scipy.stats as scs
from scipy.special import logsumexp 

def cluster_responsibility(x, k, mus, sigmas):

    # Calculate the inputs for logsumexp
    a = np.zeros(len(mus))
    b = np.zeros(len(mus))

    for i in range(len(mus)):
        a[i] = -0.5 * (x - mus[i])**2 / sigmas[i]
        b[i] = 1/np.sqrt(2*np.pi*sigmas[i])

    # Calculate the log responsibility
    log_r = scs.norm.logpdf(x, mus[k], np.sqrt(sigmas[k])) - logsumexp(a=a, b=b)

    # Return responsibility
    return np.exp(log_r)

x = 5
mus = np.array([0.0, 1.13])
sigmas = np.array([0.01, 0.006])

r0 = cluster_responsibility(x, 0, mus, sigmas)
r1 = cluster_responsibility(x, 1, mus, sigmas)

print("r_0 = ", r0)
print("r_1 = ", r1)
print("Sum = ", r0 + r1)

Когда я пытаюсь использовать кластерное средство как x, я получаю правильные назначения, но что-то странное начинает происходить при попытке значений x> 5 - он начинает присваивать x левому кластеру со средним 0, а не более близкому кластеру со средним 1,13. Я не могу придумать причину, почему это было бы так. При попытке использовать отрицательные значения все они правильно назначаются кластеру со средним 0. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...