Exemple #1
0
    def riemannian(covmats,
                   tol=10e-9,
                   max_iter=50,
                   init=None,
                   sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0), False)
        else:
            output = init

        k = 0
        nu = 1.0
        tau = numpy.finfo(numpy.double).max
        crit = numpy.finfo(numpy.double).max

        while crit > tol and k < max_iter and nu > tol:
            k += 1
            tmp = CovMats([(output.invsqrtm * covmat * output.invsqrtm).logm
                           for covmat in covmats], False)
            average = CovMat(tmp.average(0, sample_weight), False)
            crit = average.norm(ord='fro')
            h = nu * crit
            output = output.sqrtm * (nu * average).expm * output.sqrtm

            if h < tau:
                nu *= 0.95
                tau = h
            else:
                nu *= 0.5

        # if k == max_iter:
        #    print("Max iter reach")

        return output
Exemple #2
0
    def wasserstein(covmats,
                    tol=10e-4,
                    max_iter=1,
                    init=None,
                    sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0))
        else:
            output = init

        k = 0
        crit = numpy.finfo(numpy.double).max

        while (crit > tol) and (k < max_iter):
            k += 1
            tmp = CovMats([(output.sqrtm * covmat * output.sqrtm).sqrtm
                           for covmat in covmats], False)
            average = CovMat(tmp.average(0, sample_weight), False)

            new_output = average.sqrtm
            crit = (new_output - output.sqrtm).norm(ord='fro')
            output = new_output

        # if k == max_iter:
        #    print("Max iter reach")

        return output * output
Exemple #3
0
    def log_determinant(covmats,
                        tol=10e-5,
                        max_iter=50,
                        init=None,
                        sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0), False)
        else:
            output = init

        k = 0
        crit = numpy.finfo(numpy.double).max

        while crit > tol and k < max_iter:
            k += 1
            tmp = CovMats([(0.5 * (covmat + output)).inverse
                           for covmat in covmats], False)
            new_output = CovMat(tmp.average(0, sample_weight), False).inverse
            crit = (new_output - output).norm(ord='fro')
            output = new_output

        # if k == max_iter:
        #    print("Max iter reach")

        return output
Exemple #4
0
    def riemannian(covmats, tol=10e-9, max_iter=50, init=None, sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0), False)
        else:
            output = init

        k = 0
        nu = 1.0
        tau = numpy.finfo(numpy.double).max
        crit = numpy.finfo(numpy.double).max

        while crit > tol and k < max_iter and nu > tol:
            k += 1
            tmp = CovMats([(output.invsqrtm * covmat * output.invsqrtm).logm for covmat in covmats], False)
            average = CovMat(tmp.average(0, sample_weight), False)
            crit = average.norm(ord='fro')
            h = nu * crit
            output = output.sqrtm * (nu * average).expm * output.sqrtm

            if h < tau:
                nu *= 0.95
                tau = h
            else:
                nu *= 0.5

        # if k == max_iter:
        #    print("Max iter reach")

        return output
def compute(matrice_order, loop_number):
    covmats = CovMats.random(1, matrice_order)

    for i in range(0, loop_number):
        mean = Mean.log_euclidean(covmats)
        covmats.add_all(
            [Geodesic.log_euclidean(covmat, mean) for covmat in covmats])
Exemple #6
0
def test_mean_riemann():
    covmats = CovMats.random(10, 10)
    old_dist = mean_riemann(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.euclidean(covmats)

    return _get_state(old_dist, new_dist, "mean riemann")
Exemple #7
0
def test_mean_log_euclidean():
    covmats = CovMats.random(10, 10)
    old_dist = mean_logeuclid(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.log_euclidean(covmats)

    return _get_state(old_dist, new_dist, "mean log euclidian")
Exemple #8
0
def test_mean_log_determinant():
    covmats = CovMats.random(10, 10)
    old_dist = mean_logdet(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.log_determinant(covmats)

    return _get_state(old_dist, new_dist, "mean log determinant")
Exemple #9
0
def test_mean_log_determinant():
    covmats = CovMats.random(10, 10)
    old_dist = mean_logdet(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.log_determinant(covmats)

    return _get_state(old_dist, new_dist, "mean log determinant")
Exemple #10
0
def test_mean_wasserstein():
    covmats = CovMats.random(10, 10)
    old_dist = mean_wasserstein(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.wasserstein(covmats)

    return _get_state(old_dist, new_dist, "mean wasserstein")
Exemple #11
0
def test_mean_wasserstein():
    covmats = CovMats.random(10, 10)
    old_dist = mean_wasserstein(covmats.numpy_array)
    covmats.reset_covmats_fields()
    new_dist = Mean.wasserstein(covmats)

    return _get_state(old_dist, new_dist, "mean wasserstein")
Exemple #12
0
def test_tangent():
    covmat = CovMat.random(10)
    covmats = CovMats.random(10, 10)
    old = tangent_space(covmats.numpy_array, covmat.numpy_array)
    covmats.reset_covmats_fields()
    new = TangentSpace.tangent(covmats, covmat)

    return _get_state(old, new, "tangent space")
Exemple #13
0
def test_untangent():
    covmat = CovMat.random(10)
    covmats = CovMats.random(10, 10)
    tangent = TangentSpace.tangent(covmats, covmat)
    old = untangent_space(tangent, covmat.numpy_array)
    covmats.reset_covmats_fields()
    new = TangentSpace.untangent(tangent, covmat)

    return _get_state(old, new, "untangent")
def test_untangent():
    covmat = CovMat.random(10)
    covmats = CovMats.random(10, 10)
    tangent = TangentSpace.tangent(covmats, covmat)
    old = untangent_space(tangent, covmat.numpy_array)
    covmats.reset_covmats_fields()
    new = TangentSpace.untangent(tangent, covmat)

    return _get_state(old, new, "untangent")
Exemple #15
0
    def log_determinant(covmats, tol=10e-5, max_iter=50, init=None, sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0), False)
        else:
            output = init

        k = 0
        crit = numpy.finfo(numpy.double).max

        while crit > tol and k < max_iter:
            k += 1
            tmp = CovMats([(0.5 * (covmat + output)).inverse for covmat in covmats], False)
            new_output = CovMat(tmp.average(0, sample_weight), False).inverse
            crit = (new_output - output).norm(ord='fro')
            output = new_output

        # if k == max_iter:
        #    print("Max iter reach")

        return output
Exemple #16
0
    def wasserstein(covmats, tol=10e-4, max_iter=1, init=None, sample_weight=None):
        if init is None:
            output = CovMat(covmats.mean(0))
        else:
            output = init

        k = 0
        crit = numpy.finfo(numpy.double).max

        while (crit > tol) and (k < max_iter):
            k += 1
            tmp = CovMats([(output.sqrtm * covmat * output.sqrtm).sqrtm for covmat in covmats], False)
            average = CovMat(tmp.average(0, sample_weight), False)

            new_output = average.sqrtm
            crit = (new_output - output.sqrtm).norm(ord='fro')
            output = new_output

        # if k == max_iter:
        #    print("Max iter reach")

        return output * output
    def untangent(tangent, covmat_ref):
        nt, nd = tangent.shape
        ne = int((numpy.sqrt(1 + 8 * nd) - 1) / 2)

        idx = numpy.triu_indices_from(covmat_ref.numpy_array)
        covmats = CovMats(numpy.empty((nt, ne, ne)))
        covmats[:, idx[0], idx[1]] = tangent

        for i, covmat in enumerate(covmats):
            covmats[i] = numpy.diag(numpy.diag(covmats[i])) + numpy.triu(
                covmats[i], 1) / numpy.sqrt(2) + numpy.triu(
                    covmats[i], 1).T / numpy.sqrt(2)
            covmats[i] = (covmat_ref.sqrtm * covmat.expm *
                          covmat_ref.sqrtm).numpy_array

        return covmats
def compute(matrice_order, loop_number):
    covmats = CovMats.random(1, matrice_order)

    for i in range(0, loop_number):
        mean = Mean.log_euclidean(covmats)
        covmats.add_all([Geodesic.log_euclidean(covmat, mean) for covmat in covmats])
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))

from Utils.CovMat import CovMat
from Utils.CovMats import CovMats

size = [10, 25, 50, 75, 100, 250, 500, 750, 1000]

# WARMUP
print("Warm up...")
for i in range(0, 10):
    warm_up_covmat = CovMat.random(1000)
    warm_up_covmat.expm

for i in range(0, len(size)):
    covmats = CovMats.random(10, size[i])

    t = timeit.Timer(
        "mean_wasserstein(covmats.numpy_array)",
        setup=
        "from __main__ import covmats; from oldPyRiemann.mean import mean_wasserstein; import Utils.OpenBLAS"
    )
    old_time = t.timeit(number=size[len(size) - i - 1]) / size[len(size) - i -
                                                               1]

    t = timeit.Timer(
        "covmats.reset_fields(); Mean.wasserstein(covmats)",
        setup="from Utils.Mean import Mean; from __main__ import covmats")
    new_time = t.timeit(number=size[len(size) - i - 1]) / size[len(size) - i -
                                                               1]
Exemple #20
0
import timeit

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))

from Utils.CovMat import CovMat
from Utils.CovMats import CovMats

size = [10, 25, 50, 75, 100, 250, 500, 750, 1000]

# WARMUP
print("Warm up...")
for i in range(0, 10):
    warm_up_covmat = CovMat.random(1000)
    warm_up_covmat.expm

for i in range(0, len(size)):
    covmats = CovMats.random(10, size[i])
    covmat = CovMat.random(size[i])

    t = timeit.Timer("tangent_space(covmats.numpy_array, covmat.numpy_array)",
                     setup="from __main__ import covmats, covmat; from oldPyRiemann.tangentspace import tangent_space; import Utils.OpenBLAS")
    old_time = t.timeit(number=size[len(size) - i - 1]) / size[len(size) - i - 1]

    t = timeit.Timer("covmats.reset_fields(); covmat.reset_fields(); TangentSpace.tangent(covmats, covmat)",
                     setup="from Utils.TangentSpace import TangentSpace; from __main__ import covmats, covmat")
    new_time = t.timeit(number=size[len(size) - i - 1]) / size[len(size) - i - 1]

    print("matrix size : " + "10x" + str(size[i]) + "x" + str(size[i]) + "\t\told time : " + str(
        old_time) + " sec\t\t" + "new time : " + str(new_time) + " sec\t\t" + "speed up : " + str(
        old_time / new_time))
Exemple #21
0
 def log_euclidean(covmats, sample_weight=None):
     logm_covmats = CovMats([covmat.logm for covmat in covmats], False)
     return CovMat(logm_covmats.average(0, sample_weight), False).expm
Exemple #22
0
 def log_euclidean(covmats, sample_weight=None):
     logm_covmats = CovMats([covmat.logm for covmat in covmats], False)
     return CovMat(logm_covmats.average(0, sample_weight), False).expm