예제 #1
0
    def get_forward_backward(self, data):
        pcond = [None] * (len(data) - 1)
        forward = [None] * len(data)
        backward = [None] * len(data)
        mu = np.repeat(np.repeat(self.mu, self.nbc_u, axis=0),
                       self.nbc_u,
                       axis=1)
        sigma = np.repeat(np.repeat(self.sigma, self.nbc_u, axis=0),
                          self.nbc_u,
                          axis=1)
        forward[0] = np.sum(np.multiply(
            (self.t.T * self.p).T,
            np_multivariate_normal_pdf_marginal(data[0], mu, sigma,
                                                (len(data[0]) - 1))),
                            axis=1)
        forward[0] = forward[0] / np.sum(forward[0])
        backward[len(data) - 1] = np.array([1] * self.t.shape[0])
        for l in range(1, len(data)):
            k = len(data) - 1 - l
            if pcond[l - 1] is None:
                auxpb = np.multiply(
                    (self.t.T * self.p).T,
                    np_multivariate_normal_pdf(data[l - 1:l + 1].flatten(), mu,
                                               sigma))
                auxpb2 = np.sum(np.multiply(
                    (self.t.T * self.p),
                    np_multivariate_normal_pdf_marginal(
                        data[l - 1], mu, sigma, (len(data[l - 1]) - 1))),
                                axis=1)
                pcond[l - 1] = (auxpb.T / auxpb2).T

            if pcond[k] is None:
                auxpb = np.multiply(
                    (self.t.T * self.p).T,
                    np_multivariate_normal_pdf(data[k:k + 2].flatten(), mu,
                                               sigma))
                auxpb2 = np.sum(np.multiply(
                    (self.t.T * self.p).T,
                    np_multivariate_normal_pdf_marginal(
                        data[k], mu, sigma, (len(data[k]) - 1))),
                                axis=1)
                pcond[k] = (auxpb.T / auxpb2).T

            forward[l] = np.dot(pcond[l - 1].T, forward[l - 1])
            forward[l] = forward[l] / np.sum(forward[l])

            backward[k] = np.dot(pcond[k], backward[k + 1])
            backward[k] = backward[k] / np.sum(backward[k])

        return forward, backward, pcond
예제 #2
0
    def generate_sample(self, length, dimY):
        hidden = [None] * length
        visible = [None] * length
        cls = [a.flatten() for a in np.indices(self.t.shape)]
        test = np.random.multinomial(1, (self.t.T * self.p).T[cls[0], cls[1]])
        hidden[0] = cls[0][test.tolist().index(1)]
        hidden[1] = cls[1][test.tolist().index(1)]
        v = multivariate_normal.rvs(self.mu[hidden[0], hidden[1]],
                                    self.sigma[hidden[0],
                                               hidden[1]]).reshape(-1, dimY)
        visible[0] = v[0].tolist()
        visible[1] = v[1].tolist()
        for i in range(2, length):
            auxpb = np.multiply(
                (self.t.T * self.p).T,
                np_multivariate_normal_pdf_marginal(visible[i - 1], self.mu,
                                                    self.sigma, (dimY - 1)))
            pcond = (auxpb.T / np.sum(auxpb, axis=1)).T
            test = np.random.multinomial(1, pcond[hidden[i - 1], :])
            hidden[i] = test.tolist().index(1)
            mean = self.mu[hidden[i - 1], hidden[i]][dimY:] + self.sigma[
                hidden[i - 1], hidden[i]][:dimY, dimY:] @ (
                    self.sigma[hidden[i - 1], hidden[i]][dimY:, dimY:]
                    @ np.linalg.inv(self.sigma[hidden[i - 1],
                                               hidden[i]][:dimY, :dimY])
                ) @ (visible[i - 1] - self.mu[hidden[i - 1], hidden[i]][:dimY])
            cov = self.sigma[hidden[i - 1], hidden[i]][dimY:, dimY:] @ np.sqrt(
                1 - (self.sigma[hidden[i - 1], hidden[i]][:dimY, dimY:]
                     @ self.sigma[hidden[i - 1], hidden[i]][:dimY, dimY:]))
            visible[i] = multivariate_normal.rvs(mean,
                                                 cov).reshape(dimY).tolist()

        return np.array(hidden), np.array(visible)
예제 #3
0
 def simul_hidden_apost(self, data, backward, pcond):
     res = [None] * len(data)
     aux = np.sum(np.multiply(
         (self.t.T * self.p).T,
         np_multivariate_normal_pdf_marginal(data[0], self.mu, self.sigma,
                                             (len(data[0]) - 1))),
                  axis=1) * backward[0]
     test = np.random.multinomial(1, aux / np.sum(aux))
     res[0] = test.tolist().index(1)
     for i in range(1, len(data)):
         aux = pcond[i - 1] * backward[i]
         aux = (aux.T / (backward[i - 1] * np.sum(aux))).T
         test = np.random.multinomial(
             1, aux[res[i - 1]] / np.sum(aux[res[i - 1]]))
         res[i] = test.tolist().index(1)
     return np.array(res)