Algorytmy grupowania danych
Grupowanie danych wokół medoidów przybliżone – Rough k-medoids Clustering Gr
W klasycznym algorytmie grupowania wokół medoidów optymalizowana jest wartość zwartości podziału (pogrupowania danych) definiowana jako: gdzie:
W przybliżonym algorytmie k-medoidów, standardowe pojęcie zwartości pogrupowania 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.
OZNACZENIA ORAZ POJĘCIA
ALGORYTM GRUPOWANIA DANYCH PRZYBLIŻONY WOKÓŁ MEDOIDÓW
DWIE KLASY – ICH BRZEG I DOLNE APROKSYMACJE
Jakość grupowania danych: wskaźnik Davies-Bouldin
PRZYKŁADOWE DANE + KOLEJNE ITERACJE ALGORYTMU GRUPOWANIA PRZYBLIŻONEGO WOKÓŁ MEDOIDÓW
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
public void GetGlobalRCPC() { rcpc = Double.MaxValue; for (int i = 0; i < C; i++) for (int j = 0; j < cL.Count; j++) ChangeMedoidObject(i, j); }
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);