C++ (Qt)void train(const training_dataset & dataset, const real_t & radius = 0.0) { if (dataset.empty()) return; for (size_t i = 0; i < dataset.size(); ++i) { auto it = m_groups.begin(); bool is_added = false; while (it != m_groups.end()) { it = std::find_if(it, m_groups.end(), [&](const group_t & g) { return g.is_contain(dataset[i].first, sqr(radius)); }); if (it != m_groups.end()) { it->add( dataset[i].first, dataset[i].second ); is_added = true; ++it; } } if (!is_added) { m_groups.emplace_front(dataset[i].first, dataset[i].second); } } }
C++ (Qt)Т.е. если точка принадлежит групе, то происходит следующее:void add(const vec_t & input, const vec_t & output) { ++m_count; for (size_t i = 0; i < m_stat.size(); ++i) { m_stat[i] += (output[i] - m_stat[i])/m_count; } for (size_t i = 0; i < m_basis.size(); ++i) { m_basis[i] += (input[i] - m_basis[i])/m_count; } }
C++ (Qt)vec_t predict(const vec_t & data, const real_t & q = 0.5) const { if (m_groups.empty()) return vec_t(); if (m_groups.size() == 1) return m_groups.begin()->statistics(); m_groups.sort( [&](const group_t & a, const group_t & b) { return a.sqr_distance_from(data) < b.sqr_distance_from(data); }); vec_t stat(m_groups.begin()->statistics_size(), 0.0); real_t w = (1.0 - q)/(1.0 - std::pow(q, m_groups.size())); for (const auto & group : m_groups) { for (size_t j = 0; j < stat.size(); ++j) { stat[j] += w*group.statistics(j); } if (w < err) break; w *= q; } return stat; }
C++ (Qt)n = 1 + log(err/(1-q))/log(q) + O(q^N) // 0 < q < 1
C++ (Qt)input_data = { {1, 2}, {12, -34}, {5, 7}, ..., {x_N, y_N} }