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
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)
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)