public double calculate_discrimenet_function(Generic_State_Of_Nature object_state_of_nature, double[,] vector_observed_features_values) { double gi_x = 0; Matrix<double> X = Matrix.Build.DenseOfArray(vector_observed_features_values); /** * todo move this code to training step **/ Matrix<double> Wi = (-1 / 2) * object_state_of_nature.Matrix_Sigma_Inverse; Matrix<double> wi = object_state_of_nature.Matrix_Sigma_Inverse * object_state_of_nature.Vector_Meu; Matrix<double> omegai_0 = (-1 / 2) * object_state_of_nature.Vector_Meu_Transpose * object_state_of_nature.Matrix_Sigma_Inverse * object_state_of_nature.Vector_Meu - (1 / 2) * Math.Log(object_state_of_nature.Matrix_Sigma.Determinant(),Math.E) + Math.Log(object_state_of_nature.priori, Math.E); Matrix<double> ret = X.Transpose() * Wi * X + wi.Transpose() * X + omegai_0; gi_x = ret.Determinant(); return gi_x; }
public GenericDataSet( Stream _data_set_file_stream, char _file_delimeter, int _number_of_features, int _number_of_states_of_nature, int _number_of_samples_per_state_of_nature, int _number_of_training_samples_per_state_of_nature, int _number_of_test_samples_per_state_of_nature) { number_of_features = _number_of_features; number_of_states_of_nature = _number_of_states_of_nature; number_of_samples_per_state_of_nature = _number_of_samples_per_state_of_nature; number_of_training_samples_per_state_of_nature = _number_of_training_samples_per_state_of_nature; number_of_test_samples_per_state_of_nature = _number_of_test_samples_per_state_of_nature; double priori = 1 / number_of_states_of_nature; // @note: equal priori results in uniform decision boundary mainly determined by the posteriori array_of_states_natures = new Generic_State_Of_Nature[number_of_states_of_nature]; for (int i = 0; i < number_of_states_of_nature; i++) { array_of_states_natures[i] = new Generic_State_Of_Nature( number_of_features, number_of_training_samples_per_state_of_nature, number_of_test_samples_per_state_of_nature, priori ); } read_data_set_from_file_stream(_data_set_file_stream, _file_delimeter); for (int i = 0; i < number_of_states_of_nature; i++) { array_of_states_natures[i].calculate_meus_vector_from_samples(); array_of_states_natures[i].calculate_covariance_matrix_from_samples(); } }
public int classify_using_discriminent_function(Generic_State_Of_Nature[] array_generic_state_nature, double[,] vector_observed_features_values) { double maximum_discriminent_value = double.PositiveInfinity; int class_index = -1; for (int i = 0; i < array_generic_state_nature.Length; i++) { double discriminent_value = calculate_discrimenet_function(array_generic_state_nature[i], vector_observed_features_values); if (discriminent_value > maximum_discriminent_value) { maximum_discriminent_value = discriminent_value; class_index = i; } } return class_index; }