Custom probability distributions¶
You can use your own custom probability distributions for the transition and emission probabilities.
This is achieved by inheriting from the BaseMatcher class.
Examples are available in the SimpleMatching class and DistanceMatching class.
The latter implements a variation based on Newson and Krumm (2009).
Transition probability distribution¶
Overwrite the logprob_trans() method.
For example, if you want to use a uniform distribution over the possible road segments:
def logprob_trans(self, prev_m, edge_m, edge_o, is_prev_ne, is_next_ne):
return -math.log(len(self.matcher.map.nodes_nbrto(self.edge_m.last_point())))
Note that prev_m.edge_m and edge_m are not necessarily connected. For example if the Map object
returns a neighbor state that is not connected in the roadmap. This functionality is used to allow switching lanes.
Emission probability distribution¶
Overwrite the logprob_obs() method for non-emitting nodes.
These methods are given the closest distance as dist, the previous Matching object
in the lattice, the state as edge_m, and the observation as edge_o. The latter two are Segment objects
that can represent either a segment or a point.
Each segment also has a project point which is the point on the segment that is the closest point.
For example, a simple step function with more tolerance for non-emitting nodes:
def logprob_obs(self, dist, prev_m, new_edge_m, new_edge_o, is_ne):
if is_ne:
if dist < 50:
return -math.log(50)
else:
if dist < 10:
return -math.log(10)
return -np.inf
Note that an emission probability can be given for a non-emitting node. This allows you to rank non-emitting nodes
even when no observations are available. It will then insert pseudo-observations on the line between the previous
and next observations.
To have a pure non-emitting node, the logprob_obs method should always return 0 if the
is_ne argument is true.
Custom lattice objects¶
If you need to store additional information in the lattice, inherit from the Matching class and
pass your custom object to the Matcher object.
from leuvenmapmatching.map.base import BaseMatching
class MyMatching(BaseMatching):
...
matcher = MyMatcher(mapdb, matching=MyMatching)