Лабораторная работа №6 По предмету: искусственный интелект саидов Рустам Проверил: бекмуратов. К. А


public: K_means() : q_klaster(0), k_pixcel(0) {}; K_means(int


Download 140.22 Kb.
bet2/3
Sana28.12.2022
Hajmi140.22 Kb.
#1069964
TuriЛабораторная работа
1   2   3
Bog'liq
ИИ ЛАБ 6

public:
K_means() : q_klaster(0), k_pixcel(0) {};
K_means(int n, rgb *mas, int n_klaster);
K_means(int n_klaster, std::istream & os);
void clustering(std::ostream & os);
void print()const;
~K_means();
friend std::ostream & operator<<(std::ostream & os, const K_means & k);
};

Пробежимся по составляющим класса:

vectorpixcel — вектор для пикселей;
q_klaster – количество кластеров;
k_pixcel – количество пикселей;
vectorcentr – вектор для центров кластеризации, количество элементов в нем определяется q_klaster;
identify_centers() – метод для случайного выбора начальных центров среди входных пикселей;
compute() и compute_s() встроенные методы для расчета расстояния между пикселями и пересчета центров соответственно;
три конструктора: первый по умолчанию, второй — для инициализации пикселей из массива, третий — для инициализации пикселей из текстового файла (в моей реализации сначала файл случайно заполняется данными, и потом с этого файла считываются пиксели для работы программы, почему не напрямую в вектор – просто так нужно в моем случае);
clustering(std::ostream & os) – метод кластеризации;
метод и перегрузка оператора вывода для публикации результатов.

Реализация методов:

void K_means::identify_centers()
{
srand((unsigned)time(NULL));
rgb temp;
rgb *mas = new rgb[q_klaster];
for (int i = 0; i < q_klaster; i++) {
temp = pixcel[0 + rand() % k_pixcel];
for (int j = i; j < q_klaster; j++) {
if (temp.r != mas[j].r && temp.g != mas[j].g && temp.b != mas[j].b) {
mas[j] = temp;
}
else {
i--;
break;
}
}
}
for (int i = 0; i < q_klaster; i++) {
centr.push_back(mas[i]);
}
delete []mas;
}

Это метод для выбора начальных центров кластеризации и добавления их в вектор центров. Осуществляется проверка на повтор центров и замена их в этих случаях.

K_means::K_means(int n, rgb * mas, int n_klaster)


{
for (int i = 0; i < n; i++) {
pixcel.push_back(*(mas + i));
}
q_klaster = n_klaster;
k_pixcel = n;
identify_centers();
}

Реализация конструктора для инициализации пикселей из массива.

K_means::K_means(int n_klaster, std::istream & os) : q_klaster(n_klaster)


{
rgb temp;
while (os >> temp.r && os >> temp.g && os >> temp.b) {
pixcel.push_back(temp);
}
k_pixcel = pixcel.size();
identify_centers();
}

В этот конструктор мы передаем объект ввода для возможности ввода данных как из файла, так и из консоли.


Download 140.22 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling