Пример #1
0
    def testProductCopula(self):
        U = dists.J([dists.Uniform(0, 1), dists.Uniform(0, 1)])
        self.assertEqual(U.mean(), 0.25)
        self.assertEqual(U.var(), 1./9 - 1./16)

        U = dists.J([dists.TNormal(0, 2, -5, 5)])
        self.assertEqual(U.mean(), 0)
        self.assertEqual(U.var(), 4)

        U = dists.J([dists.TNormal(1, 2, -4, 6), dists.TNormal(2, 3, -3, 7)])
        self.assertEqual(U.mean(), 2)
        self.assertEqual(U.var(), 5. * 13. - 1. * 4.)
Пример #2
0
    def test2DNormalDist(self):
        # prepare data
        U = dists.J(
            [dists.Normal(2.0, .5, -1, 4),
             dists.Normal(1.0, .5, -1, 3)])

        U = dists.J(
            [dists.Normal(0.5, .5, -1, 2),
             dists.Normal(0.5, .4, -1, 2)])

        np.random.seed(1234567)
        trainSamples = U.rvs(300)
        testSamples = U.rvs(1000)

        # build parameter set
        dist = SGDEdist.byLearnerSGDEConfig(
            trainSamples,
            config={
                "grid_level": 5,
                "grid_type": "modlinear",
                "refinement_numSteps": 0,
                "refinement_numPoints": 10,
                "regularization_type": "Laplace",
                "crossValidation_lambda": 0.000562341,
                "crossValidation_enable": False,
                "crossValidation_kfold": 5,
                "crossValidation_silent": False,
                "sgde_makePositive": False,
                "sgde_makePositive_candidateSearchAlgorithm": "joined",
                "sgde_makePositive_interpolationAlgorithm": "setToZero",
                "sgde_makePositive_generateConsistentGrid": False,
                "sgde_makePositive_verbose": True,
                "sgde_unitIntegrand": True
            },
            bounds=U.getBounds())
        fig = plt.figure()
        plotDensity2d(U)
        fig.show()

        fig = plt.figure()
        plotSG2d(dist.grid,
                 dist.alpha,
                 addContour=True,
                 show_negative=True,
                 show_grid_points=True)
        fig.show()

        print("2d: mean = %g ~ %g" % (U.mean(), dist.mean()))
        print("2d: var = %g ~ %g" % (U.var(), dist.var()))
        plt.show()
        print("KL = %g" % U.klDivergence(dist, testSamples, testSamples))
        print("CE = %g" % dist.crossEntropy(testSamples))
        print("MSE = %g" % dist.l2error(U, testSamples, testSamples))
Пример #3
0
    def testDiscretization(self):
        epsilon = 1e-14
        U = dists.J([dists.Uniform(-1, 2), dists.Uniform(0, 3)])
        _, error = U.discretize(level=1, hasBorder=True)
        assert error < epsilon

        epsilon = 1e-3
        U = dists.J([dists.TNormal(0.5, 0.1, 0, 1)])
        sgde, error = U.discretize(level=10)
        assert error < epsilon

        epsilon = 1e-1
        U = dists.J([dists.TNormal(0.5, 0.1, 0, 1), dists.Beta(5, 10)])
        _, error = U.discretize(10)
        assert error < epsilon
Пример #4
0
    def test2DNormalDist(self):
        # prepare data
        U = dists.J(
            [dists.Normal(1.0, .1, 0, 2),
             dists.Normal(0.5, .01, 0, 1)])

        trainSamples = U.rvs(300)
        testSamples = U.rvs(1000)

        # build parameter set
        dist = dists.KDEDist(trainSamples, bounds=U.getBounds())
        samples = dist.rvs(1000, shuffle=True)

        #         fig = plt.figure()
        #         plotDensity2d(U)
        #         fig.show()
        #
        #         fig = plt.figure()
        #         plotDensity2d(dist)
        #         plt.scatter(samples[:, 0], samples[:, 1])
        #         fig.show()

        print("quad = %s" % (dblquad(lambda x, y: dist.pdf([x, y]), 0, 2,
                                     lambda _: 0, lambda _: 1), ))
        print("mean = %g ~ %g" % (U.mean(), dist.mean()))
        print("var = %g ~ %g" % (U.var(), dist.var()))
        print("KL = %g" % U.klDivergence(dist, testSamples, testSamples))
        print("CE = %g" % dist.crossEntropy(testSamples))
        print("MSE = %g" % dist.l2error(U, testSamples, testSamples))

        plt.show()
Пример #5
0
    def test_2DNormalDist_variance(self):
        # prepare data
        U = dists.J(
            [dists.Normal(2.0, .5, -1, 4),
             dists.Normal(1.0, .5, -1, 3)])
        #         U = dists.J([dists.Normal(0.5, .5, -1, 2),
        #                      dists.Normal(0.5, .4, -1, 2)])

        # define linear transformation
        trans = JointTransformation()
        for a, b in U.getBounds():
            trans.add(LinearTransformation(a, b))

        # get a sparse grid approximation
        grid = Grid.createPolyGrid(U.getDim(), 10)
        grid.getGenerator().regular(5)
        gs = grid.getStorage()

        # now refine adaptively 5 times
        p = DataVector(gs.getDimension())
        nodalValues = np.ndarray(gs.getSize())

        # set function values in alpha
        for i in range(gs.getSize()):
            gs.getPoint(i).getStandardCoordinates(p)
            nodalValues[i] = U.pdf(trans.unitToProbabilistic(p.array()))

        # hierarchize
        alpha = hierarchize(grid, nodalValues)

        #         # make positive
        #         alpha_vec = DataVector(alpha)
        #         createOperationMakePositive().makePositive(grid, alpha_vec)
        #         alpha = alpha_vec.array()

        dist = SGDEdist(grid, alpha, bounds=U.getBounds())

        fig = plt.figure()
        plotDensity2d(U)
        fig.show()

        fig = plt.figure()
        plotSG2d(dist.grid,
                 dist.alpha,
                 addContour=True,
                 show_negative=True,
                 show_grid_points=True)
        fig.show()

        print("2d: mean = %g ~ %g" % (U.mean(), dist.mean()))
        print("2d: var = %g ~ %g" % (U.var(), dist.var()))
        plt.show()
Пример #6
0
    def test2DNormalMoments(self):
        mean = 0
        var = 0.5

        U = dists.J([dists.Normal(mean, var, -2, 2),
                     dists.Normal(mean, var, -2, 2)])

        trainSamples = U.rvs(10000)
        dist = KDEDist(trainSamples)

        # -----------------------------------------------
        self.assertTrue(np.abs(U.mean() - dist.mean()) < 1e-2, "KDE mean wrong")
        self.assertTrue(np.abs(U.var() - dist.var()) < 1e-2, "KDE variance wrong")
Пример #7
0
    def test2DPPF(self):
        # prepare data
        C = np.array([[0.1, 0.08], [0.08, 0.1]]) / 10.
        U = dists.MultivariateNormal([0.5, 0.5], C, 0, 1)

        train_samples = U.rvs(1000)

        fig = plt.figure()
        plotDensity2d(U)
        plt.title('true density')
        fig.show()

        dist = SGDEdist.byLearnerSGDEConfig(train_samples,
                                            config={
                                                "grid_level": 5,
                                                "grid_type": "linear",
                                                "refinement_numSteps": 0,
                                                "refinement_numPoints": 10,
                                                "regularization_type":
                                                "Laplace",
                                                "crossValidation_lambda":
                                                0.000562341,
                                                "crossValidation_enable":
                                                False,
                                                "crossValidation_kfold": 5,
                                                "crossValidation_silent": True
                                            },
                                            bounds=U.getBounds())
        fig = plt.figure()
        plotDensity2d(dist)
        plt.title('estimated SGDE density')
        fig.show()

        samples = dists.J([dists.Uniform(0, 1), dists.Uniform(0, 1)]).rvs(1000)

        fig = plt.figure()
        plt.plot(samples[:, 0], samples[:, 1], "o ")
        plt.title('uniformly drawn samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        transformed_samples = dist.ppf(samples)

        fig = plt.figure()
        plt.plot(transformed_samples[:, 0], transformed_samples[:, 1], "o ")
        plt.title('transformed samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()
        plt.show()
Пример #8
0
    def test2DCDFandPPF(self):
        # prepare data
        C = np.array([[0.1, 0.08], [0.08, 0.1]]) / 10.
        U = dists.MultivariateNormal([0.5, 0.5], C, 0, 1)
        train_samples = U.rvs(1000)

        fig = plt.figure()
        plotDensity2d(U)
        plt.title('true density')
        fig.show()

        dist = KDEDist(train_samples, bounds=U.getBounds())

        fig = plt.figure()
        plotDensity2d(dist)
        plt.title('estimated KDE density')
        fig.show()

        samples = dists.J([dists.Uniform(0, 1),
                           dists.Uniform(0, 1)]).rvs(1000)

        fig = plt.figure()
        plt.plot(samples[:, 0], samples[:, 1], "o ")
        plt.title('u space')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        transformed_samples = dist.ppf(samples)

        fig = plt.figure()
        plt.plot(transformed_samples[:, 0], transformed_samples[:, 1], "o ")
        plt.title('x space (transformed)')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        samples = dist.cdf(transformed_samples)

        fig = plt.figure()
        plt.plot(samples[:, 0], samples[:, 1], "o ")
        plt.title('u space (transformed)')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        plt.show()
Пример #9
0
    def tesst2DPPF(self):
        # prepare data
        numDims = 2
        mean = 0.5
        C = np.array([[0.1, 0.08], [0.08, 0.1]]) / 10.
        stddev = np.sqrt(C[0, 0])
        U = dists.MultivariateNormal(np.ones(numDims) * mean, C, 0, 1)

        dist = NatafDist.normal_marginals(mean,
                                          stddev,
                                          C,
                                          bounds=U.getBounds())

        fig = plt.figure()
        plotDensity2d(U)
        plt.title('true density')
        fig.show()

        fig = plt.figure()
        plotDensity2d(dist)
        plt.title('estimated Nataf density')
        fig.show()

        samples = dists.J([dists.Uniform(0, 1), dists.Uniform(0, 1)]).rvs(1000)

        fig = plt.figure()
        plt.plot(samples[:, 0], samples[:, 1], "o ")
        plt.title('uniformly drawn samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        transformed_samples = dist.ppf(samples)

        fig = plt.figure()
        plt.plot(transformed_samples[:, 0], transformed_samples[:, 1], "o ")
        plt.title('transformed samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        plt.show()
Пример #10
0
    def test2DPPF(self):
        # prepare data
        C = np.array([[0.1, 0.08], [0.08, 0.1]]) / 10.
        U = dists.MultivariateNormal([0.5, 0.5], C, 0, 1)

        fig = plt.figure()
        plotDensity2d(U)
        plt.title('true density')
        fig.show()

        dist = KDEDist(U.rvs(1000),
                       kernelType=KernelType_EPANECHNIKOV,
                       bounds=U.getBounds())

        fig = plt.figure()
        plotDensity2d(dist)
        plt.title('estimated KDE density')
        fig.show()

        samples = dists.J([dists.Uniform(0, 1),
                           dists.Uniform(0, 1)]).rvs(1000)

        fig = plt.figure()
        plt.plot(samples[:, 0], samples[:, 1], "o ")
        plt.title('uniformly drawn samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        transformed_samples = dist.ppf(samples)

        fig = plt.figure()
        plt.plot(transformed_samples[:, 0], transformed_samples[:, 1], "o ")
        plt.title('transformed samples')
        plt.xlim(0, 1)
        plt.ylim(0, 1)
        fig.show()

        plt.show()
Пример #11
0
    def test2DCDFandPPF(self, plot=True):
        # prepare data
        C = np.array([[0.1, 0.08], [0.08, 0.1]]) / 10.
        U = dists.MultivariateNormal([0.5, 0.5], C, 0, 1)
        train_samples = U.rvs(1000)

        if plot:
            fig = plt.figure()
            plotDensity2d(U)
            plt.title('true density')
            fig.show()

        dist = SGDEdist.byLearnerSGDEConfig(train_samples,
                                            config={
                                                "grid_level": 5,
                                                "grid_type":
                                                "polyClenshawCurtis",
                                                "refinement_numSteps": 0,
                                                "refinement_numPoints": 10,
                                                "regularization_type":
                                                "Laplace",
                                                "crossValidation_lambda":
                                                0.000562341,
                                                "crossValidation_enable":
                                                False,
                                                "crossValidation_kfold": 5,
                                                "crossValidation_silent": True,
                                                "sgde_makePositive": False
                                            },
                                            bounds=U.getBounds())

        if plot:
            fig = plt.figure()
            plotDensity2d(dist)
            plt.title('estimated SGDE density')
            fig.show()

        samples = dists.J([dists.Uniform(0, 1), dists.Uniform(0, 1)]).rvs(500)

        if plot:
            fig = plt.figure()
            plt.plot(samples[:, 0], samples[:, 1], "o ")
            plt.title('u space')
            plt.xlim(0, 1)
            plt.ylim(0, 1)
            fig.show()
        else:
            print("-" * 80)
            print(samples)

        transformed_samples = dist.ppf(samples, shuffle=False)

        if plot:
            fig = plt.figure()
            plt.plot(transformed_samples[:, 0], transformed_samples[:, 1],
                     "o ")
            plt.title('x space (transformed)')
            plt.xlim(0, 1)
            plt.ylim(0, 1)
            fig.show()
        else:
            print("-" * 80)
            print(transformed_samples)

        samples = dist.cdf(transformed_samples, shuffle=False)

        if plot:
            fig = plt.figure()
            plt.plot(samples[:, 0], samples[:, 1], "o ")
            plt.title('u space (transformed)')
            plt.xlim(0, 1)
            plt.ylim(0, 1)
            fig.show()

            plt.show()
        else:
            print("-" * 80)
            print(samples)
Пример #12
0
    def test2DNormalMoments(self):
        mean = 0
        var = 0.5

        U = dists.J(
            [dists.Normal(mean, var, -2, 2),
             dists.Normal(mean, var, -2, 2)])

        np.random.seed(1234567)
        trainSamples = U.rvs(1000)
        dist = SGDEdist.byLearnerSGDEConfig(trainSamples,
                                            config={
                                                "grid_level": 5,
                                                "grid_type": "linear",
                                                "refinement_numSteps": 0,
                                                "refinement_numPoints": 10,
                                                "regularization_type":
                                                "Laplace",
                                                "crossValidation_lambda":
                                                0.000562341,
                                                "crossValidation_enable":
                                                False,
                                                "crossValidation_kfold": 5,
                                                "crossValidation_silent": True,
                                                "sgde_makePositive": True
                                            },
                                            bounds=U.getBounds())
        samples_dist = dist.rvs(1000, shuffle=True)
        kde = KDEDist(trainSamples)
        samples_kde = kde.rvs(1000, shuffle=True)
        # -----------------------------------------------
        self.assertTrue(
            np.abs(U.mean() - dist.mean()) < 1e-2, "SGDE mean wrong")
        self.assertTrue(
            np.abs(U.var() - dist.var()) < 4e-2, "SGDE variance wrong")
        # -----------------------------------------------

        # print the results
        print("E(x) ~ %g ~ %g" % (kde.mean(), dist.mean()))
        print("V(x) ~ %g ~ %g" % (kde.var(), dist.var()))
        print(
            "log  ~ %g ~ %g" %
            (kde.crossEntropy(trainSamples), dist.crossEntropy(trainSamples)))
        print("-" * 60)

        print(dist.cov())
        print(kde.cov())

        sgde_x1 = dist.marginalizeToDimX(0)
        kde_x1 = kde.marginalizeToDimX(0)

        plt.figure()
        plotDensity1d(U.getDistributions()[0], label="analytic")
        plotDensity1d(sgde_x1, label="sgde")
        plotDensity1d(kde_x1, label="kde")
        plt.title("mean: sgde=%g, kde=%g; var: sgde=%g, kde=%g" %
                  (sgde_x1.mean(), kde_x1.mean(), sgde_x1.var(), kde_x1.var()))
        plt.legend()

        fig = plt.figure()
        plotDensity2d(U, addContour=True)
        plt.title("analytic")

        fig = plt.figure()
        plotDensity2d(kde, addContour=True)
        plt.scatter(samples_kde[:, 0], samples_kde[:, 1])
        plt.title("kde")

        fig = plt.figure()
        plotDensity2d(dist, addContour=True)
        plt.scatter(samples_dist[:, 0], samples_dist[:, 1])
        plt.title(
            "sgde (I(f) = %g)" %
            (np.prod(U.getBounds()) * doQuadrature(dist.grid, dist.alpha), ))

        plt.show()
Пример #13
0
def test_sgdeLaplace():
    l2_samples = 10000
    # sample_range = np.arange(10, 500, 50)
    sample_range = [10, 20, 50, 100, 200, 500]
    points = {}
    grids = ["linear",
             "modlinear", # keine OperationQuadrature
             "poly",
             "modpoly",
             "polyBoundary",
             "polyClenshawCurtis",
             "modPolyClenshawCurtis",
             "polyClenshawCurtisBoundary",
             "bsplineClenshawCurtis",
             "modBsplineClenshawCurtis" # keine OperationMultipleEval
    ]

    U = dists.J([dists.Lognormal.by_alpha(0.5, 0.1, 0.001),
                 dists.Lognormal.by_alpha(0.5, 0.1, 0.001)])
    l2_errors = {}
    for grid in grids:
        l2_errors[grid] = []
        points[grid] = []

    l2_errors["kde"] = []
    samples = 1000
    for samples in sample_range:
    # for lvl in range(5, 6):
        trainSamples = U.rvs(samples)
        # testSamples = U.rvs(l2_samples)
        for grid_name in grids:
            # build parameter set
            print("--------------------Samples: {} Grid: {}--------------------".format(samples, grid_name))
            dist_sgde = SGDEdist.byLearnerSGDEConfig(trainSamples,
                                                     bounds=U.getBounds(),
                                                     unitIntegrand=True,
                                                     config={"grid_level": 1,
                                                             "grid_type": grid_name,
                                                             "grid_maxDegree": 6,
                                                             "refinement_numSteps": 0,
                                                             "refinement_numPoints": 10,
                                                             "solver_threshold": 1e-10,
                                                             "solver_verbose": False,
                                                             "regularization_type": "Laplace",
                                                             "crossValidation_lambda": 1e-6,
                                                             "crossValidation_enable": True,
                                                             "crossValidation_kfold": 4,
                                                             "crossValidation_lambdaSteps": 10,
                                                             "crossValidation_silent": False})
            points[grid_name].append(dist_sgde.grid.getSize())
            # l2_errors[grid_name].append(dist_sgde.l2error(U, testSamplesUnit=testSamples))
            l2_errors[grid_name].append(dist_sgde.l2error(U, n=l2_samples))
            # plt.figure()
            # plotDensity2d(U, levels=(10, 20, 40, 50, 60))
            # plt.figure()
            # plotDensity2d(dist_sgde, levels=(10, 20, 40, 50, 60))
            # plt.show()

        dist_kde = dists.KDEDist(trainSamples,
                                 kernelType=KernelType_GAUSSIAN,
                                 bandwidthOptimizationType=BandwidthOptimizationType_SILVERMANSRULE)
        l2_errors["kde"].append(dist_kde.l2error(U, testSamplesUnit=testSamples))

    for grid_name in grids:
        plt.plot(sample_range, l2_errors[grid_name], label=grid_name)
        # plt.plot(points[grid], l2_errors[grid_name],".-", label=grid_name)

    plt.plot(sample_range, l2_errors["kde"], label="KDE")

    # plt.plot([x for x in range(1,300, 100)], [l2_errors["kde"][0] for i in range(1,4)], label="KDE")

    plt.xlabel("# Gitterpunkte")
    plt.ylabel("L2-Fehler")
    plt.yscale("log")
    plt.legend()
    plt.show()