function calc_pollutant_rmse($latitude, $longitude, $pollutant, $results) { $sum_leftout_err = 0; $count = count($results); if ($count == 0) { return array("std" => 0, "rmse" => 0, "nrmse" => 0); } for ($i = 0; $i < $count; $i++) { $tmp = $results; $leftout_lat = $tmp[$i]["latitude"]; $leftout_lng = $tmp[$i]["longitude"]; $leftout_val = $tmp[$i][$pollutant]; unset($tmp[$i]); $tmp = array_values($tmp); //reorder array numerically $calc_leftout = calc_pollutant_idw($leftout_lat, $leftout_lng, $pollutant, $tmp); $leftout_err = pow($calc_leftout - $leftout_val, 2); $sum_leftout_err += $leftout_err; echo '<br />' . $leftout_lat . ', ' . $leftout_lng . ', ' . $leftout_val . ' , ' . $calc_leftout; } $rmse = sqrt($sum_leftout_err / $count); $std = sqrt(calc_variance_value($pollutant, $results)); $nrmse = round($rmse / $std, 4); $variances = array("std" => $std, "rmse" => $rmse, "nrmse" => $nrmse); return $variances; }
function model_pollutant_points_for_locations_and_times_custom_window($latitudes, $longitudes, $datetimes, $pollutant, $time_window_size, $location_window_size) { $time_window_start = 0; $location_window_start_lat = 0; $location_window_start_long = 0; $window_array = NULL; $final_values = array(); for ($i = 0; $i < count($datetimes); $i++) { $t = strtotime($datetimes[i]); $dx = ($latitudes[$i] - $location_window_start_lat) * 110.8; // 110.8 km per degree of latitude $dy = ($longitudes[$i] - $location_window_start_long) * 96.5; // 96.5 km per degree of longitude if ($t - $time_window_start > $time_window_size || $dx > $location_window_size || $dy > $location_window_size) { // new window $location_window_start_lat = $latitudes[$i]; $location_window_start_long = $longitudes[$i]; $time_window_start = $t; $window_array = model_location_and_time_array($latitudes[$i], $longitudes[$i], $location_window_size * 2, $datetimes[$i], 200, $pollutant, true); } $value = calc_pollutant_idw($latitudes[$i], $longitudes[$i], $pollutant, $window_array); array_push($final_values, $value); } return $final_values; }