#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 ¶meters, 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;
}