Source code for mapof.elections.distances.feature_distance
import numpy as np
from mapof.elections.distances.register import register_ordinal_election_distance
def _feature_distance(election_1, election_2, feature_ids: list[str], ord: int):
vector_1 = []
vector_2 = []
for feature_id in feature_ids:
try:
vector_1.append(election_1.get_feature(feature_id, compute_if_missing=False))
vector_2.append(election_2.get_feature(feature_id, compute_if_missing=False))
except Exception:
raise Exception(f"Feature {feature_id} not found in the election objects")
return np.linalg.norm(vector_1 - vector_2, ord=ord)
[docs]
@register_ordinal_election_distance("feature_l1")
def features_vector_l1(election_1, election_2, feature_ids: list[str]) -> float:
"""
Computes ell_1 distance between two feature vectors.
Parameters
----------
election_1 : OrdinalElection
First election.
election_2 : OrdinalElection
Second election.
feature_ids : list[str]
List of feature ids.
Returns
-------
float
ell_2 distance between two feature vectors.
"""
return _feature_distance(election_1, election_2, feature_ids, 1)
[docs]
@register_ordinal_election_distance("feature_l2")
def features_vector_l2(election_1, election_2, feature_ids: list[str]) -> float:
"""
Computes ell_2 distance between two feature vectors.
Parameters
----------
election_1 : OrdinalElection
First election.
election_2 : OrdinalElection
Second election.
feature_ids : list[str]
List of feature ids.
Returns
-------
float
ell_2 distance between two feature vectors.
"""
return _feature_distance(election_1, election_2, feature_ids, 2)