Module evaluation_metrics
Includes the goodness-of-fit functions that are commonly applied in DTA and network calibration literature. Currently, only normalized root mean square is provided.
@author: Qing-Long Lu (qinglong.lu@tum.de)
Expand source code
# -*- coding: utf-8 -*-
"""
Includes the goodness-of-fit functions that are commonly applied in DTA and network calibration literature.
Currently, only normalized root mean square is provided.
@author: Qing-Long Lu (qinglong.lu@tum.de)
"""
import numpy as np
def normalized_root_mean_square(data_true, data_simulated, od_prior, od_calibrated, w):
'''
Normalized root mean square error.
Parameters
----------
data_true : DataFrame
Observed traffic measurements.
data_simulated : DataFrame
Traffic measurements from simulations.
od_true : DataFrame
Prior OD estimates.
od_calibrated : DataFrame
OD estimates from current calibration evaluation.
w : float
weights of the errors imposed by OD matrix.
Returns
-------
rmsn : list
List of NRMSE values, one per interval.
'''
for i in range(data_simulated.shape[1]-1):
data_simulated.iloc[:,i] = data_simulated.iloc[:,i]+data_simulated.iloc[:,i+1]
data_true.columns = data_simulated.columns
data_simulated = data_simulated.loc[data_true.index,:]
diff = (data_true - data_simulated)**2
n = diff.count()
sum_diff = diff.sum()
sum_true = data_true.sum()
rmsn_count = np.sqrt(n*sum_diff)/sum_true
# calculate the rmsn for ods
od_prior = od_prior.iloc[:, 2:]
od_calibrated = od_calibrated.iloc[:, 2:]
diff_od = (od_prior - od_calibrated)**2
n_od = diff_od.count()
sum_diff_od = diff_od.sum()
sum_true_od = od_prior.sum()
rmsn_od = np.sqrt(n_od*sum_diff_od)/sum_true_od
rmsn = (1-w)*rmsn_count.values + w*rmsn_od.values
rmsn = rmsn.tolist()
return rmsn
Functions
def normalized_root_mean_square(data_true, data_simulated, od_prior, od_calibrated, w)
-
Normalized root mean square error.
Parameters
data_true
:DataFrame
- Observed traffic measurements.
data_simulated
:DataFrame
- Traffic measurements from simulations.
od_true
:DataFrame
- Prior OD estimates.
od_calibrated
:DataFrame
- OD estimates from current calibration evaluation.
w
:float
- weights of the errors imposed by OD matrix.
Returns
rmsn
:list
- List of NRMSE values, one per interval.
Expand source code
def normalized_root_mean_square(data_true, data_simulated, od_prior, od_calibrated, w): ''' Normalized root mean square error. Parameters ---------- data_true : DataFrame Observed traffic measurements. data_simulated : DataFrame Traffic measurements from simulations. od_true : DataFrame Prior OD estimates. od_calibrated : DataFrame OD estimates from current calibration evaluation. w : float weights of the errors imposed by OD matrix. Returns ------- rmsn : list List of NRMSE values, one per interval. ''' for i in range(data_simulated.shape[1]-1): data_simulated.iloc[:,i] = data_simulated.iloc[:,i]+data_simulated.iloc[:,i+1] data_true.columns = data_simulated.columns data_simulated = data_simulated.loc[data_true.index,:] diff = (data_true - data_simulated)**2 n = diff.count() sum_diff = diff.sum() sum_true = data_true.sum() rmsn_count = np.sqrt(n*sum_diff)/sum_true # calculate the rmsn for ods od_prior = od_prior.iloc[:, 2:] od_calibrated = od_calibrated.iloc[:, 2:] diff_od = (od_prior - od_calibrated)**2 n_od = diff_od.count() sum_diff_od = diff_od.sum() sum_true_od = od_prior.sum() rmsn_od = np.sqrt(n_od*sum_diff_od)/sum_true_od rmsn = (1-w)*rmsn_count.values + w*rmsn_od.values rmsn = rmsn.tolist() return rmsn