neural_network_rs/neural_network/cost_function/
mod.rs

1use ndarray::{Array1, Array2};
2
3pub mod quadratic_cost;
4
5pub struct CostFunction {
6    pub f: fn(&Array1<f64>, &Array1<f64>) -> f64,
7    pub d: fn(&Array1<f64>, &Array1<f64>) -> Array1<f64>,
8}
9
10impl CostFunction {
11    pub fn cost(&self, a: &Array2<f64>, expected: &Array2<f64>) -> f64 {
12        let mut cost = 0.0;
13        for (a, expected) in a.outer_iter().zip(expected.outer_iter()) {
14            cost += (self.f)(&a.to_owned(), &expected.to_owned());
15        }
16        cost / a.nrows() as f64
17    }
18
19    pub fn cost_derivative(&self, a: &Array2<f64>, expected: &Array2<f64>) -> Array2<f64> {
20        let mut cost_derivative = Array2::zeros(a.raw_dim());
21
22        for i in 0..a.ncols() {
23            cost_derivative
24                .column_mut(i)
25                .assign(&((self.d)(&a.column(i).to_owned(), &expected.column(i).to_owned())));
26        }
27
28        cost_derivative
29    }
30}