def test_covid_sir(self): model = CovidSIRDc() rst = model.to_rst() self.assertIn('\\frac', rst) self.assertIn('I', rst) par = model.get() self.assertIn('I', par) p = {'I': 5.} model.update(**p) par = model.get() self.assertEqual(par['I'], 5.) dot = model.to_dot(verbose=True) self.assertIn("I -> R", dot) self.assertNotIn("I -> I", dot) self.assertIn('beta', dot) self.assertNotIn('-beta', dot) dot = model.to_dot(verbose=True, full=True) self.assertIn("I -> I", dot) self.assertIn('-beta', dot) model['beta'] = 0.5 self.assertEqual(model['beta'], 0.5) model['N'] = 100000 self.assertEqual(model['N'], 100000) ht = model._repr_html_() self.assertIn("{equation}", ht)
def test_covid_sir_loop(self): model = CovidSIRDc() sim = list(model.iterate()) self.assertEqual(len(sim), 10) self.assertGreater(sim[-1]['S'], 9500) self.assertLess(sim[-1]['S'], 10000) r0 = model.R0() self.assertEqual(r0, 4.2)
def test_prefit(self): model = CovidSIRDc() losses = model._losses_sympy() self.assertIsInstance(losses, list) self.assertEqual(len(losses), 4) grads = model._grads_sympy() self.assertIsInstance(grads, list) for row in grads: self.assertIsInstance(row, list) self.assertEqual(len(row), 6)
def test_noise(self): model = CovidSIRDc() X, y = model.iterate2array(derivatives=True) X2 = model.add_noise(X) diff = numpy.abs(X - X2).max() self.assertEqual(X.shape, X.shape) s1 = numpy.sum(X, axis=1) s2 = numpy.sum(X2, axis=1) assert_almost_equal(s1, s2) self.assertGreater(diff, 1)
def test_fit_sirc_simulate(self): model = CovidSIRDc() X, y = model.iterate2array(derivatives=True) epi = EpidemicRegressor('sirc', max_iter=10) epi.fit(X, y) sim = epi.simulate(X[4:6]) self.assertEqual(sim.shape, (2, 7, 4)) self.assertEqual(X[4].tolist(), sim[0, 0].tolist()) self.assertEqual(X[5].tolist(), sim[1, 0].tolist()) sim = epi.simulate(numpy.array([[10000., 0, 0, 0]])) self.assertEqual(sim[0].tolist(), sim[-1].tolist())
def test_fit_sirc(self): model = CovidSIRDc() X, y = model.iterate2array(derivatives=True) epi = EpidemicRegressor('sirc', max_iter=10) with self.assertRaises(RuntimeError): epi.score(X, y) with self.assertRaises(RuntimeError): epi.predict(X) epi.fit(X, y) loss = epi.score(X, y) self.assertGreater(loss, 0)
def test_covid_sir_eval(self): model = CovidSIRDc() cst = model.cst_param self.assertEqual( cst, { 'N': 10000.0, 'beta': 0.5, 'mu': 0.07142857142857142, 'nu': 0.047619047619047616, 'a': -1.5025135094805093e-08, 'b': 1e-5, 'c': 1e-5 }) ev = model.eval_diff() self.assertEqual(-4.99504995, ev['S']) self.assertEqual(len(ev), 4)
def test_correctness(self): model = CovidSIRDc() cor = model.correctness() self.assertEqual(cor[0], -5.0101099597102863e-09) update = model.update_abc(update=True) self.assertIsInstance(update, dict) cor = model.correctness() self.assertEqual(cor[0], -5.0101099597102863e-09) cor = model.correctness(numpy.array([[1., 0., 0., 0.]])) self.assertLess(abs(cor[0] + 1.50251351e-08), 1e-5)
############################################ # .. _l-sliding-window-sir: # # Estimation d'un modèle # ++++++++++++++++++++++ # # L'approche sur une fenêtre glissante suggère que le modèle # n'est pas bon pour approcher les données sur toute une période, # mais que sur une période courte, le vrai modèle peut être # approché par un modèle plus simple. On note :math:`W^*(t)` # les paramètres optimaux au temps *t*, on étudie les courbes # :math:`t \rightarrow W^*(t)` pour voir comment évolue # ces paramètres. model = CovidSIRDc() print(model.quantity_names) data = df[['safe', 'infected', 'recovered', 'deaths']].values.astype(numpy.float32) print(data[:5]) X = data[:-1] y = data[1:] - data[:-1] dates = df.index[:-1] Nlast = 150 X = X[-Nlast:] y = y[-Nlast:] dates = dates[-Nlast:]
def test_predict(self): model = CovidSIRDc() sim = list(model.iterate(derivatives=True)) self.assertIsInstance(sim, list) X = model.iterate2array(derivatives=False) self.assertIsInstance(X, numpy.ndarray) X, y = model.iterate2array(derivatives=True) self.assertEqual(X.shape, y.shape) y2 = model.predict(X) assert_almost_equal(y / 100, y2 / 100, decimal=6) with self.assertRaises(TypeError): model.predict({}) with self.assertRaises(ValueError): model.predict(numpy.array([4])) with self.assertRaises(ValueError): model.predict(numpy.array([[4, 5, 6, 7, 8]])) X2 = X.copy() X2[0, 0] -= 50 with self.assertRaises(ValueError): model.predict(X2) X2 = X.copy() X2[:, 0] -= 50 with self.assertRaises(ValueError): model.predict(X2)
def test_eval_diff(self): model = CovidSIRDc() df1 = model.eval_diff() df2 = model._eval_diff_sympy() self.assertEqual(df1, df2)
def test_fit(self): model = CovidSIRDc() X, y = model.iterate2array(derivatives=True) with self.assertRaises(TypeError): model.fit(X, {}) with self.assertRaises(ValueError): model.fit(X, numpy.array([4])) with self.assertRaises(ValueError): model.fit(X, numpy.array([[4, 5, 6, 7, 8]])) X2 = X.copy() X2[0, 0] = -5 with self.assertRaises(ValueError): model.fit(X2, y, learning_rate_init=0.01) exp = numpy.array( [model['beta'], model['nu'], model['mu'], model['b']]) model.fit(X, y, verbose=False, max_iter=10, learning_rate_init=0.01) coef = numpy.array( [model['beta'], model['nu'], model['mu'], model['b']]) err = numpy.linalg.norm(exp - coef) self.assertLess(err, 1e-5) model['nu'] = model['mu'] = model['beta'] = 0.1 buf = io.StringIO() with redirect_stdout(buf): model.fit(X, y, verbose=True, max_iter=20) out = buf.getvalue() self.assertIn('20/20', out) coef = numpy.array( [model['beta'], model['nu'], model['mu'], model['b']]) err = numpy.linalg.norm(exp - coef) self.assertLess(err, 1) loss = model.score(X, y) self.assertGreater(loss, 0) loss = model.score_l1(X, y) self.assertGreater(loss, 0)