Кластеризации k средних

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Программирование
  • 62 62 страницы
  • 10 + 10 источников
  • Добавлена 04.05.2024
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
ВВЕДЕНИЕ 3
ГЛАВА 1. ТЕОРЕТИЧЕСКОЕ ВВЕДЕНИЕ В АЛГОРИТМЫ КЛАСТЕРИЗАЦИИ 4
1.1. Краткий обзор алгоритмов кластеризации 4
1.2. Алгоритм k-средних. Правило локтя 6
1.3. Метрики расстояния 7
1.4. Формулирование требований к программе 8
1.5. Итоги 8
ГЛАВА 2. ПРАКТИЧЕСКАЯ ЧАСТЬ 10
2.1. Проектирование программы 10
Рисунок 2.1. Основные закрытые декларации класса-кластеризатора 12
2.2. Программная реализация 12
2.3. Тестирование программы и анализ результатов 14
2.4. Эксперимент на осмысленных данных 23
ГЛАВА 3. ЭЛЕМЕНТЫ БЕЗОПАСНОСТИ КОДА 25
ЗАКЛЮЧЕНИЕ 27
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ 28
ПРИЛОЖЕНИЕ 29
Приложение 1. Текст заголовка Clust.h модуля класса-кластеризатора 29
Приложение 2. Текст модуля Clust.cpp с реализацией класса-кластеризатора 31
Приложение 3. Текст модуля MyForm.h с главным окном 36
Приложение 4. Текст главного модуля MyForm.cpp программы 62

Фрагмент для ознакомления

txt|Все файлы|*.*";this->openFileDialog->ShowReadOnly = true;this->openFileDialog->Title = L"Загрузить точки из файла";// // saveFileDialog// this->saveFileDialog->DefaultExt = L"txt";this->saveFileDialog->Filter = L"Txt files|*.txt|Все файлы|*.*";this->saveFileDialog->Title = L"Сохранить точки в файл";// // MyForm// this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;this->ClientSize = System::Drawing::Size(681, 443);this->Controls->Add(this->groupBox4);this->Controls->Add(this->groupBox1);this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;this->MaximizeBox = false;this->Name = L"MyForm";this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;this->Text = L"Кластеризация методом k-средних";this->groupBox1->ResumeLayout(false);this->groupBox1->PerformLayout();this->groupBox3->ResumeLayout(false);this->groupBox3->PerformLayout();this->groupBox2->ResumeLayout(false);this->groupBox2->PerformLayout();this->gbAuto->ResumeLayout(false);this->gbAuto->PerformLayout();this->gbCenters->ResumeLayout(false);this->gbCenters->PerformLayout();(cli::safe_cast(this->nmK))->EndInit();(cli::safe_cast(this->numN))->EndInit();this->groupBox4->ResumeLayout(false);this->groupBox4->PerformLayout();this->groupBox6->ResumeLayout(false);this->groupBox6->PerformLayout();this->groupBox8->ResumeLayout(false);this->groupBox8->PerformLayout();this->groupBox7->ResumeLayout(false);(cli::safe_cast(this->chart))->EndInit();this->groupBox5->ResumeLayout(false);this->groupBox5->PerformLayout();(cli::safe_cast(this->nmP))->EndInit();this->ResumeLayout(false);}#pragmaendregion// Вызывается при выборе пункта "Вручную" или "Автоматически"private: System::Void rbHandy_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {gbAuto->Enabled = !rbHandy->Checked;gbCenters->Enabled = gbAuto->Enabled && rbCenters->Checked;}// Вызывается при выборе пункта "Случайно" или "Вокруг центров"private: System::Void rbRandom_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {gbCenters->Enabled = gbAuto->Enabled && rbCenters->Checked;}// Вызывается при нажатии кнопки "Сгенерировать!"private: System::Void btGenerate_Click(System::Object^ sender, System::EventArgs^ e) {int K = Decimal::ToInt32(nmK->Value); // Число точекint N = Decimal::ToInt32(numN->Value); // Число измеренийRandom^ rnd = gcnewRandom(); // Генератор случайных чиселedPoints->Clear(); // Очищаем список точекif (rbRandom->Checked) { // Случайные точкиfor (int i = 0; i < K; i++) { // Цикл по точкамString^ p = gcnew String("");for (int j = 0; j < N; j++) { // Цикл по координатамdouble r = 0.01*((int)(rnd->NextDouble()*100)); // Генерируем случайную координату// и добавляем ее в строкуp += r.ToString("F3");if (j < N-1) p += " "; // если не последняя координата, то// добавляем разделитель = пробел}edPoints->AppendText(p);edPoints->AppendText(Environment::NewLine);}}else if (rbCenters->Checked) { // Вокруг центровstd::vector< std::vector > C; // Центры кластеровintCN = edCenters->Lines->Length; // Предполагаемое число кластеров// Распознаем центры из текста в edCentersfor (int i = 0; i < CN; i++) { // Цикл по строкам текстаString^ ct = edCenters->Lines[i]->ToString();if (ct->Length > 0) { // Если строка не пустаяpin_ptr< const wchar_t > sp = PtrToStringChars(ct);std::wstring sw = sp;std::string ss(sw.begin(), sw.end());std::replace(ss.begin(), ss.end(), ',', '.'); // Заменяем запятые на точки в записи координатstd::stringstreamst(ss); // Создаем из строки потокstd::vector CI; // Переменная для хранения координат центраwhile (!st.eof()) { // Пока поток не кончилсяdoublev;if (st >> v) // Если удалось зачитать числоCI.push_back(v); // то помещаем его в переменную-центрelse { // Иначе выводим ошибкуMessageBox::Show(gcnewString("Неверная запись центра: ") + ct);return;}}if (CI.size() != N) { // Проверяем число прочитанных координатMessageBox::Show(gcnewString("Неверное число координат в записи центра: ") + ct);return;}C.push_back(CI);}}for (int i = 0; i < K; i++) { // Цикл по точкамString^ p = gcnewString("");// Определяем случайный номер кластераint c = rnd->Next(C.size());for (int j = 0; j < N; j++) { // Цикл по координатам// Генерируем случайную координату// и добавляем ее в строкуdouble r = C[c][j] + (0.25 - 0.5*rnd->NextDouble());p += r.ToString("F3");if (j < N - 1) p += " "; // если не последняя координата, то// добавляем разделитель = пробел}edPoints->AppendText(p);edPoints->AppendText(Environment::NewLine);}}}// Вызывается при нажатии кнопки "Загрузить"private: System::Void btLoad_Click(System::Object^ sender, System::EventArgs^ e) {if (openFileDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK) {// Преобразуем String в stringpin_ptr< const wchar_t > sp = PtrToStringChars(openFileDialog->FileName);std::wstring sw = sp;std::ifstream inp(sw); // Пробуем открыть файлif (inp) { // Если удалось открыть файлstd::stringline; // Буфер чтенияedPoints->Clear(); // Очищаем список точекwhile (getline(inp, line)) { // Читаем файл построчно, пока не кончитсяedPoints->AppendText(gcnew String(line.c_str()));edPoints->AppendText(Environment::NewLine);}inp.close(); // Закрываем файл}elseMessageBox::Show("Не могу открыть файл!");}}// Вызывается при нажатии кнопки "Сохранить"private: System::Void btSave_Click(System::Object^ sender, System::EventArgs^ e) {if (saveFileDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK) {// Преобразуем String в stringpin_ptr< const wchar_t > sp = PtrToStringChars(saveFileDialog->FileName);std::wstring sw = sp;std::ofstream out(sw); // Пробуем открыть файлif (out) { // Если удалось открыть файл// Преобразуем String в stringpin_ptr< const wchar_t > pp = PtrToStringChars(edPoints->Text);std::wstring ppw = pp;std::string spp(ppw.begin(), ppw.end());out << spp; // Записываем в него строкуout.close(); // Закрываем файл}elseMessageBox::Show("Не могу открыть файл!");}}// Вызывается при нажатии на кнопку "Запустить"private: System::Void btStart_Click(System::Object^ sender, System::EventArgs^ e) {int N = Decimal::ToInt32(numN->Value); // Число измеренийintmaxP = Decimal::ToInt32(nmP->Value); // Максимальное число кластеровlbCenters->Items->Clear();X->clear();intXN = edPoints->Lines->Length; // Предполагаемое число точек (число строк)for (inti = 0; i < XN; i++) { // Цикл по строкам текстового описания точекString^ ct = edPoints->Lines[i]->ToString();if (ct->Length > 0) { // Если строка не пустаяpin_ptr< const wchar_t > sp = PtrToStringChars(ct);std::wstring sw = sp;std::string ss(sw.begin(), sw.end());std::replace(ss.begin(), ss.end(), ',', '.'); // Заменяем запятые на точки в записи координатstd::stringstreamst(ss); // Создаем из строки потокstd::vector XI; // Переменная для хранения координат точкиwhile (!st.eof()) { // Пока поток не кончилсяdoublev;if (st >> v) // Если удалось зачитать числоXI.push_back(v); // то помещаем его в переменную-точкуelse { // Иначе выводим ошибкуMessageBox::Show(gcnewString("Неверная запись точки: ") + ct);return;}}if (XI.size() != N) { // Проверяем число прочитанных координатMessageBox::Show(gcnewString("Неверное число координат в записи точки: ") + ct);return;}X->push_back(XI);}}// Кластеризацияdoublep = 2.0;doubler = 1.5;if (rbPows->Checked) { // Если степенное расстояние, то извлекаем его параметры из строкtry {p = Convert::ToDouble(ed_p->Text);}catch (...) {MessageBox::Show(gcnew String("Неверное p для степенного расстояния: ") + ed_p->Text);return;}try {r = Convert::ToDouble(ed_r->Text);if (fabs(r) < 1E-2) {MessageBox::Show(gcnew String("Слишком мало r для степенного расстояния: ") + ed_r->Text);return;}}catch (...) {MessageBox::Show(gcnew String("Неверное r для степенного расстояния: ") + ed_r->Text);return;}}// Создаем объект-кластеризаторclusterizer CL(PROBABLE_EPS, p, r, *X);double * expv = newdouble[maxP]; // Выделяем память под объясненные дисперсииclusterizer::distType d = clusterizer::distType::distPows; // Тип расстояния// Уточняем тип расстоянияif (rbEuclid->Checked) d = clusterizer::distType::distEuclid;else if (rbEuclid2->Checked) d = clusterizer::distType::distEuclid2;else if (rbManh->Checked) d = clusterizer::distType::distManh;else if (rbChebysh->Checked) d = clusterizer::distType::distChebysh;CENTERS->clear();CENTERS->resize(maxP);BELONGS->clear();BELONGS->resize(maxP);chart->Series->Clear();chart->Series->Add("Процент объясненности");chart->Series["Процент объясненности"]->ChartType = System::Windows::Forms::DataVisualization::Charting::SeriesChartType::Line;chart->ChartAreas[0]->AxisX->Title = "Число кластеров";chart->ChartAreas[0]->AxisY->Title = "Объясненность D";best = maxP;for (intnc = 2; nc <= maxP; nc++) { // Цикл кластеризации при различном числе кластеровexpv[nc-1] = CL.clusterize(nc, d, (*CENTERS)[nc-1], (*BELONGS)[nc-1]);chart->Series["Процент объясненности"]->Points->AddXY(nc, expv[nc-1]*100);// Правило локтяif (nc > 2 && best == maxP) {double val = expv[nc-1] - expv[nc-2];if (fabs(val) < ELBOW_TOL)best = nc-1;}}delete[] expv; // Освобождаем памятьtbNopt->Text = Convert::ToString(best);// Заполняем список центров кластеровfor (int j = 0; j < (*CENTERS)[best-1].size(); j++)lbCenters->Items->Add(PointToStr((*CENTERS)[best - 1][j]));lbCenters->SelectedIndex = 0;}// Функция, генерирующая строковое представление вектора чисел Xprivate: System::String^ PointToStr(const std::vector< double > X) {String^ result = gcnew String("");for (int i = 0; i < X.size(); i++)result += Convert::ToString(0.01*((int)(X[i]*100))) + gcnew String(" ");returnresult;}// Вызывается при выборе центра кластера из спискаprivate: System::Void lbCenters_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {edCluster->Clear();if (lbCenters->SelectedIndex >= 0) {String^ txt = gcnew String("");for (int j = 0; j < X->size(); j++)if ((*BELONGS)[best-1][j] == lbCenters->SelectedIndex)txt += PointToStr((*X)[j]) + Environment::NewLine;edCluster->Text = txt;}}};}Приложение 4. Текст главного модуля MyForm.cpp программыusing namespace System;using namespace System::Windows::Forms;#include "MyForm.h"[STAThread]int main(array^ args) {Application::EnableVisualStyles();Application::SetCompatibleTextRenderingDefault(false);k_means::MyForm form;Application::Run(%form);return 0;}

1. Гитис, Л.Х. Статистическая классификация и кластерный анализ [Текст] / Л.Х.Гитис. – М.: МГГУ, 2003. – 157 с.
2. Радчикова, Н.П. Компьютерная обработка психологической информации. Часть 2 [Текст] / Н.П.Радчикова. – Минск: БГПУ, 2005. – 94 с.
3. Боровиков, В. Программа STATISTICA для студентов и инженеров [Текст] / В.Боровиков. – М.: Компьютер Пресс, 2001. – 301 с.
4. Карпиченко, А.А. Кластерный анализ. Справочный материал [Текст] / А.А.Карпиченко. – Минск: БГУ, 2009. – 199 с.
5. Герберт, Шилдт. С++ для начинающих. Шаг за шагом [Текст] / Г.Шилдт. - М.: ЭКОМ Паблишерз, 2013. – 640 с.
6. Прата, Стивен. Язык программирования C. Лекции и упражнения [Текст] / С.Прата. - М.: Диалектика-Вильямс, 2018. – 320 c.
7. Павловская, Т.А. С/С++. Программирование на языке высокого уровня [Текст] / Т.А.Павловская. – СПб.: Питер, 2003. – 461 с.
8. Гордон Хогенсон. C++/CLI: язык Visual C++ для среды .NET [Текст] / Г.Хогенсон. - Издательство: Вильямс, 2007. - 464 с.
9. Пекунов, В.В. Windows Forms [Текст] / В.В.Пекунов. – Иваново: ИГЭУ, 2004. – 175 с.
10. Лабор, В.В. Си Шарп: Создание приложений для Windows [Текст] / В. В. Лабор. — Мн.: Харвест, 2003. - 384 с.