{}
run-icon
main.cpp
#include <iostream> #include <vector> #include <cmath> float estimate(const std::vector<float> &inputs, const std::vector<float> &slopes, float intecept) { auto p = 0.0; for (auto i = 0; i < inputs.size(); i++) { p += inputs[i] * slopes[i]; } return (p + intecept); } float binary_normalisation(float estimate) { if (estimate >= 0) return 1; return 0; } float percept(const std::vector<float> &inputs, const std::vector<float> &slopes, float intecept) { auto est = estimate(inputs, slopes, intecept); return binary_normalisation(est); } struct training_parameters { std::vector<float> weights; float bias; float total_errors; }; training_parameters train(const std::vector<std::vector<float>> &x, const std::vector<float> &y, training_parameters &parameters, const float learning_rate) { for (auto i = 0; i < x.size(); i++) { auto inputs = x[i]; auto expected = y[i]; auto p = percept(inputs, parameters.weights, parameters.bias); auto error = expected - p; // update the weights for (auto w = 0; w < parameters.weights.size(); w++) { parameters.weights[w] = parameters.weights[w] + (inputs[w] * error * learning_rate); } parameters.bias = parameters.bias + (learning_rate * error); parameters.total_errors = std::abs(parameters.total_errors + error); } return parameters; } auto main() -> int { // Input values const std::vector<std::vector<float>> training_sets = { {0, 0}, {1, 0}, {0, 1}, {1, 1} }; // Expect values const std::vector<float> Y = { 0, 1, 1, 1, }; const auto epoch = 1000; training_parameters parameters{std::vector<float>(4), 0.0f, 0.0f}; for (auto e = 0; e < epoch; e++) { parameters = train(training_sets, Y, parameters, 0.1); if (parameters.total_errors == 0) { break; } } auto p = percept({0, 0}, parameters.weights, parameters.bias); std::cout << "0 OR 0 = " << percept({0, 0}, parameters.weights, parameters.bias) << std::endl; std::cout << "1 OR 0 = " << percept({1, 0}, parameters.weights, parameters.bias) << std::endl; std::cout << "0 OR 1 = " << percept({0, 1}, parameters.weights, parameters.bias) << std::endl; std::cout << "1 OR 1 = " << percept({1, 1}, parameters.weights, parameters.bias) << std::endl; std::cout << "Weights = ["; for (auto w : parameters.weights) { std::cout << w << ","; } std::cout << "]\nBias = " << parameters.bias << ", Errors = " << parameters.total_errors; return 0; }
Output