1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
"""
A `linkage_distance_update` function calculates the distance from cluster i
to the new cluster xy after merging cluster x and cluster y
Parameters
----------
d_xi : double
Distance from cluster x to cluster i
d_yi : double
Distance from cluster y to cluster i
d_xy : double
Distance from cluster x to cluster y
size_x : int
Size of cluster x
size_y : int
Size of cluster y
size_i : int
Size of cluster i
Returns
-------
d_xyi : double
Distance from the new cluster xy to cluster i
"""
ctypedef double (*linkage_distance_update)(double d_xi, double d_yi,
double d_xy, int size_x,
int size_y, int size_i)
cdef double _single(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return min(d_xi, d_yi)
cdef double _complete(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return max(d_xi, d_yi)
cdef double _average(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return (size_x * d_xi + size_y * d_yi) / (size_x + size_y)
cdef double _centroid(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return sqrt((((size_x * d_xi * d_xi) + (size_y * d_yi * d_yi)) -
(size_x * size_y * d_xy * d_xy) / (size_x + size_y)) /
(size_x + size_y))
cdef double _median(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return sqrt(0.5 * (d_xi * d_xi + d_yi * d_yi) - 0.25 * d_xy * d_xy)
cdef double _ward(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
cdef double t = 1.0 / (size_x + size_y + size_i)
return sqrt((size_i + size_x) * t * d_xi * d_xi +
(size_i + size_y) * t * d_yi * d_yi -
size_i * t * d_xy * d_xy)
cdef double _weighted(double d_xi, double d_yi, double d_xy,
int size_x, int size_y, int size_i):
return 0.5 * (d_xi + d_yi)
|