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