1 Algorytmy grupowania danych
2 Grupowanie danych wokół medoidów przybliżone – Rough k-medoids Clustering Gr
3 W klasycznym algorytmie grupowania wokół medoidów optymalizowanajest wartość zwartości podziału (pogrupowania danych) definiowana jako: gdzie:
4
5 W przybliżonym algorytmie k-medoidów, standardowe pojęcie zwartościpogrupowania zastąpione zostaje pojęciem przybliżonej zwartości pogrupowania danych. Przybliżona zwartość podziału – pogrupowania określa oddzielnie wpływ obiektów znajdujących się w dolnej aproksymacji klasy – skupienia od wpływu wywieranego przez obiekty znajdujące się na brzegu badanej klasy. Pojęcia dolnej i górnej aproksymacji oraz brzegu opierają się na pojęciach teorii zbiorów przybliżonych.
6 OZNACZENIA ORAZ POJĘCIA
7 ALGORYTM GRUPOWANIA DANYCH PRZYBLIŻONY WOKÓŁ MEDOIDÓW
8
9
10 DWIE KLASY – ICH BRZEG I DOLNE APROKSYMACJE
11 Jakość grupowania danych:wskaźnik Davies-Bouldin
12 PRZYKŁADOWE DANE + KOLEJNE ITERACJE ALGORYTMU GRUPOWANIAPRZYBLIŻONEGO WOKÓŁ MEDOIDÓW
13
14
15
16
17 cL – lista pozostałych obiektów public void ChangeMedoidObject(int _m, int _d) { double[] d1 = (double[])medL[_m]; double[] d2 = (double[])cL[_d]; medL.RemoveAt(_m); medL.Insert(_m,d2); cL.RemoveAt(_d); cL.Insert(_d, d1); GetLowerUpper(); DisplayImageData(); double dd = getRCPC(); if (dd < rcpc) { _d1 = _d; _m1 = _m; rcpc = dd; } medL.RemoveAt(_m); medL.Insert(_m, d1); cL.RemoveAt(_d); cL.Insert(_d, d2); medL – lista medoidów cL – lista pozostałych obiektów getLowerUpper – przydzielenie punktów do klas – aproksymacje dolne i górne
18 public void GetGlobalRCPC(){ rcpc = Double.MaxValue; for (int i = 0; i < C; i++) for (int j = 0; j < cL.Count; j++) ChangeMedoidObject(i, j); }
19 for (int j = 0; j < C; j++) { if (j == di) continue; public void GetLowerUpper() { ClearClusters(); SetMedoids(); for (int i = 0; i < cL.Count; i++) int di = 0; double dm = Double.MaxValue; double[] d1 = (double[])cL[i]; double[] dist = new double[C]; for (int j = 0; j < C; j++) double[] d2 = (double[])medL[j]; double d3 = Distance.GetDistance(d1, d2); dist[j] = d3; if (dm > d3) dm = d3; di = j; } int changed = 0; for (int j = 0; j < C; j++) { if (j == di) continue; if (Math.Abs(dist[j] - dm) < eps) Cluster CL = (Cluster)mClusters[j]; CL.SetUpper(d1); } if (changed == 0) Cluster CL = (Cluster)mClusters[di]; CL.SetLower(d1);
20