예제 #1
0
    def query(self, **kwds):

        # Ensure the evidence variables are actually
        # present
        invalid_vars = [v for v in kwds.keys() if v not in self.nodes]
        if invalid_vars:
            raise VariableNotInGraphError(invalid_vars)

        mu, sigma = self.get_joint_parameters()

        # Iteratively apply the evidence...
        result = dict()
        result['evidence'] = kwds

        for k, v in kwds.items():
            x = MeansVector([[v]], names=[k])
            sigma_yy, sigma_yx, sigma_xy, sigma_xx = (sigma.split(k))
            mu_y, mu_x = mu.split(k)
            # See equations (6) and (7) of CK
            mu_y_given_x = MeansVector(
                (mu_y + sigma_yx * sigma_xx.I * (x - mu_x)).rows,
                names=mu_y.name_ordering)
            sigma_y_given_x = CovarianceMatrix(
                (sigma_yy - sigma_yx * sigma_xx.I * sigma_xy).rows,
                names=sigma_yy.name_ordering)
            sigma = sigma_y_given_x
            mu = mu_y_given_x

        result['joint'] = dict(mu=mu, sigma=sigma)
        return result
 def test_get_joint_parameters(self, river_graph):
     mu, sigma = river_graph.get_joint_parameters()
     assert mu == MeansVector([[3], [4], [9], [14]],
                              names=['a', 'b', 'c', 'd'])
     assert sigma == CovarianceMatrix(
         [[4, 4, 8, 12], [4, 5, 8, 13], [8, 8, 20, 28], [12, 13, 28, 42]],
         names=['a', 'b', 'c', 'd'])
    def test_query(self, river_graph):
        result = river_graph.query(a=7)
        mu = result['joint']['mu']
        sigma = result['joint']['sigma']
        assert mu == MeansVector([[8], [17], [26]], names=['b', 'c', 'd'])
        assert sigma == CovarianceMatrix([[1, 0, 1], [0, 4, 4], [1, 4, 6]],
                                         names=['b', 'c', 'd'])

        result = river_graph.query(a=7, c=17)
        mu = result['joint']['mu']
        sigma = result['joint']['sigma']
        assert mu == MeansVector([[8], [26]], names=['b', 'd'])
        assert sigma == CovarianceMatrix([[1, 1], [1, 2]], names=['b', 'd'])

        result = river_graph.query(a=7, c=17, b=8)
        mu = result['joint']['mu']
        sigma = result['joint']['sigma']
        assert mu == MeansVector([[26]], names=['d'])
        assert sigma == CovarianceMatrix([[1]], names=['d'])
 def test_assignment_of_joint_parameters(self, river_graph):
     assert river_graph.nodes['b'].func.joint_mu == MeansVector(
         [[3], [4]], names=['a', 'b'])
     assert river_graph.nodes[
         'b'].func.covariance_matrix == CovarianceMatrix([[4, 4], [4, 5]],
                                                         names=['a', 'b'])