Умножающиеся подмассивы тензора - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь реализовать многомерную модель гауссовой смеси и пытаюсь вычислить функцию распределения вероятностей с использованием тензоров. Есть n точек данных, k кластеров и d измерений. Пока у меня два тензора. Один - это (n,k,d) тензор центрированных точек данных, а другой - kxdxd тензор ковариационных матриц. Я могу вычислить матрицу вероятностей nxk, выполнив команду

centered = np.repeat(points[:,np.newaxis,:],K,axis=1) - mu[np.newaxis,:] # KxNxD
prob = np.zeros(n,k)
constant = 1/2/np.pow(np.pi, d/2)
for n in range(centered.shape[1]):
    for k in range(centered.shape[0]):
        p = centered[n,k,:][np.newaxis] # 1xN
        power = -1/2*(p @ np.linalg.inv(sigma[k,:,:]) @ p.T)
        prob[n,k] = constant * np.linalg.det(sigma[k,:,:]) * np.exp(power)

, где sigma - это треугольная матрица kxdxd ковариаций, а centered - мои точки. Какой способ Pythoni c можно сделать с помощью тензорных возможностей numpy?

1 Ответ

0 голосов
/ 24 февраля 2020

Просто пара быстрых наблюдений:

  • Я не вижу, чтобы вы использовали p в цикле; это ошибка? Использование n вместо?

  • T в centered[n,k,:].T ничего не делает; с этим индексом массив равен 1d

  • Я не уверен, что np.linal.inv может обрабатывать партии массивов, что позволяет np.linalg.inv(sigma).

  • @ разрешает пакеты, только если последние 2 затемнения входят в dot (с обычным правилом last of A, 2nd to the last of B; можно также использовать einsum.

  • снова np.linalg.det обрабатывает партии?

...