def gaussian_mixture_2d_ref(*inputs): w, m1, m2, s1, s2, c, x1, x2 = inputs z1 = vec_sub_mat(x1, m1, lhs_bwd=False) / s1 z2 = vec_sub_mat(x2, m2, lhs_bwd=False) / s2 z1 = (z1 - c * z2)**2.0 z2 = 1.0 - c**2.0 z3 = 2.0 * numpy.pi * s1 * s2 * z2 ** 0.5 r = w * functions.exp(- z1 / (2.0 * z2)) / z3 return r
def check(self, context): v = chainer.Variable(context(self.v)) m = chainer.Variable(context(self.m)) n = vec_sub_mat(v, m) assert_allclose(n.data, context(self.n)) n.grad = context(self.g) n.backward() assert_allclose(m.grad, -n.grad) assert_allclose(v.grad, context(self.h))