/
Vazik30
/
PatternRecognitionMethods
Обзор
Документация
Войти
/
Vazik30
/
PatternRecognitionMethods
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
cpp_classes/1.cpp
76 строк
3 KB
Roma
Сделаны изменения
28 окт 2025, 16:44
28 окт 2025, 16:44
a47cc0c
Код
Авторство
О чём код?
#include <vector> // Для vector #include <iostream> // Для cout, endl #include <cmath> // Для математических операций (необязательно здесь) #include <locale> // Для setlocale и русского языка using namespace std; // Функция алгоритма Хо-Кашьяпа (для двух классов) int hoKashyap(const vector<vector<double>>& samples, const vector<int>& labels, const vector<double>& query) { if (samples.empty() || samples[0].empty()) return 0; // Защита от пустых данных int n = samples[0].size(); // Признаков int m = samples.size(); // Образцов vector<vector<double>> Y(m, vector<double>(n)); vector<double> b(m, 1.0); vector<double> w(n, 0.0); // Формирование матрицы Y: +1 для класса 1, -1 для класса 2 for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) Y[i][j] = (labels[i] == 1 ? 1.0 : -1.0) * samples[i][j]; // Итеративная оптимизация (до 1000 итераций или успеха) for (int iter = 0; iter < 1000; ++iter) { vector<double> e(m, 0.0); for (int i = 0; i < m; ++i) { double y_dot_w = 0.0; for (int j = 0; j < n; ++j) y_dot_w += Y[i][j] * w[j]; e[i] = b[i] - y_dot_w; } // Корректировка b (для положительного отступа) bool all_positive = true; for (int i = 0; i < m; ++i) { if (e[i] < 0) { b[i] -= e[i]; // Увеличение b, чтобы e >= 0 all_positive = false; } } // Обновление весов w (приближённо: w ≈ (Y^T * b) / m) for (int j = 0; j < n; ++j) { double sum = 0.0; for (int i = 0; i < m; ++i) sum += Y[i][j] * b[i]; w[j] = sum / m; } if (all_positive) break; // Успех: все ошибки положительны } // Классификация: если w · query > 0, то класс 1, иначе 2 double dot = 0.0; for (int j = 0; j < n; ++j) dot += w[j] * query[j]; return (dot > 0) ? 1 : 2; } int main() { // Включаем поддержку русского языка setlocale(LC_ALL, "Russian"); // Пример данных: образы для двух классов vector<vector<double>> samples = { {1.0, 2.0}, {2.0, 1.0}, {-1.0, -2.0}, {-2.0, -1.0} }; vector<int> labels = { 1, 1, 2, 2 }; // Классы: 1 (положительные), 2 (отрицательные) vector<double> query = { 1.5, 1.5 }; // Тестовый образ для классификации int classIndex = hoKashyap(samples, labels, query); cout << "Предсказанный класс: " << classIndex << endl; return 0; }