Algorytmy grupowania danych Grupowanie danych wokół medoidów przybliżone G – Rough k-medoids Clustering r.

Download Report

Transcript Algorytmy grupowania danych Grupowanie danych wokół medoidów przybliżone G – Rough k-medoids Clustering r.

Algorytmy grupowania danych
Grupowanie
danych wokół medoidów przybliżone
G
– Rough k-medoids Clustering
r
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
public void ChangeMedoidObject(int _m, int _d)
{
double dd = getRCPC();
if (dd < rcpc)
{
_d1 = _d;
_m1 = _m;
rcpc = dd;
double[] d1 = (double[])medL[_m];
double[] d2 = (double[])cL[_d];
medL.RemoveAt(_m);
medL.Insert(_m,d2);
}
cL.RemoveAt(_d);
cL.Insert(_d, d1);
medL.RemoveAt(_m);
medL.Insert(_m, d1);
GetLowerUpper();
cL.RemoveAt(_d);
cL.Insert(_d, d2);
DisplayImageData();
}
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);
}
}
public void GetLowerUpper()
{
int changed = 0;
for (int j = 0; j < C; j++)
{
ClearClusters();
SetMedoids();
if (j == di)
continue;
for (int i = 0; i < cL.Count; i++)
{
if (Math.Abs(dist[j] - dm) < eps)
{
int di = 0;
double dm = Double.MaxValue;
Cluster CL = (Cluster)mClusters[j];
double[] d1 = (double[])cL[i];
CL.SetUpper(d1);
double[] dist = new double[C];
}
for (int j = 0; j < C; j++)
{
}
double[] d2 = (double[])medL[j];
if (changed == 0)
{
Cluster CL = (Cluster)mClusters[di];
CL.SetLower(d1);
}
double d3 = Distance.GetDistance(d1, d2);
dist[j] = d3;
if (dm > d3)
{
dm = d3;
di = j;
}
}
}
}