void train(const TableView<VectorXf>& samples, const TableView<double>& values) override { featuresNumber = samples.columnsNumber(); weights = VectorXf::Zero(featuresNumber); double learning_rate = base_learning_rate; for (int iteration = 0; iteration < iterationNumber; ++iteration) { auto sampleIt = samples.begin(); auto valueIt = values.begin(); while (sampleIt != samples.end() && valueIt != values.end()) { const VectorXf& sample = *sampleIt; double value = *valueIt; weights -= learning_rate * 2 * (weights.dot(sample) - value) * sample; ++sampleIt; ++valueIt; } learning_rate *= decay; } }