Я столкнулся со странной проблемой при оценке ответственности кластера как части алгоритма максимизации ожидания. Назначение простое. Два одномерных гауссиана задаются с параметрами 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. Есть идеи?