File: _hierarchy_distance_update.pxi

package info (click to toggle)
python-scipy 1.1.0-7
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 93,828 kB
  • sloc: python: 156,854; ansic: 82,925; fortran: 80,777; cpp: 7,505; makefile: 427; sh: 294
file content (67 lines) | stat: -rw-r--r-- 2,158 bytes parent folder | download | duplicates (4)
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)