forked from scipy/scipy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_hierarchy_distance_update.pxi
67 lines (51 loc) · 2.11 KB
/
_hierarchy_distance_update.pxi
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)