Evaluating techniques on a dataset
Defining a dataset
A franc.evaluation.dataset can be instantiated by providing the required sequences of samples and a sampling rate.
The format is intended to support multiple measurement sequences of different lengths.
Target data must be provided as a sequence of sequences. The first index is the measurement sequence; the second index is the time axis within the sequence.
Witness data has three indices. First sequence, then witness channel, and last the time axis.
The following example generates a dataset with completely random data to explain the interface.
import numpy as np
import franc
# define test data
n_channel = 3
sequence_lengths = [100, 200]
sampling_rate = 1.
data_generator = franc.evaluation.TestDataGenerator()
generator = franc.eval.TestDataGenerator([0.1]*n_channel, rng_seed=123)
witness_conditioning, target_conditioning= generator.generate_multiple(sequence_lengths)
witness_evaluation, target_evaluation = generator.generate_multiple(sequence_lengths)
print('witness shapes', [i.shape for i in witness_conditioning])
print('target shapes', [i.shape for i in target_conditioning])
# create the dataset object
dataset = franc.evaluation.EvaluationDataset(
sampling_rate,
witness_conditioning,
target_conditioning,
witness_evaluation,
target_evaluation
)
Output:
witness shapes [(3, 100), (3, 200)]
target shapes [(100,), (200,)]
Executing an evaluation run
The following is a minimal example to execute a franc.evaluation.EvaluationRun.
A pdf report can be generated with compile_report=True (this requires a latex installation and pdflatex to be on the path).
By default the evaluation run creates a folder structure for the generated files in the current working directory.
The location can be changed through the directory parameter.
import franc as fnc
# create a simple dataset
n_channel = 2
dataset = fnc.eval.TestDataGenerator(
[0.1] * n_channel, rng_seed=0xdeadbeef
).dataset([int(1e4), int(1e4)], [int(1e4), int(2e4)])
dataset.target_unit = "AU"
print('dataset hash', fnc.common.hash_function_str(dataset.hash_bytes()))
# define evaluation run
filter_configurations = [
(
fnc.filt.WienerFilter,
[{"n_filter": 16, "idx_target": 0, "n_channel": n_channel}],
),
(
fnc.filt.LMSFilter,
[{"n_filter": 16, "idx_target": 0, "n_channel": n_channel}],
),
]
eval_run = fnc.eval.EvaluationRun(
filter_configurations,
dataset,
fnc.eval.RMSMetric(),
[fnc.eval.MSEMetric(), fnc.eval.PSDMetric()],
directory="test_outputs/", # either change this or create a directory with that name
)
# execute evaluation run
results = eval_run.run()
# set compile_report to True to generate a pdf file
eval_run.generate_report(results, compile_report=False)
dataset hash HG07TDk2+9y5cbMkzmLaLHASchY=
WF (ran conditioning and calculated prediction)
target: Residual RMS: 0.055742 AU
Residual MSE: 0.003107 (AU)²
Power spectral density
LMS (ran conditioning and calculated prediction)
target: Residual RMS: 0.056846 AU
Residual MSE: 0.003231 (AU)²
Power spectral density