File: ut_metric.py

package info (click to toggle)
python-pyclustering 0.10.1.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 11,128 kB
  • sloc: cpp: 38,888; python: 24,311; sh: 384; makefile: 105
file content (152 lines) | stat: -rwxr-xr-x 9,225 bytes parent folder | download | duplicates (2)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
"""!

Unit-tests for metric functions.

@authors Andrei Novikov (pyclustering@yandex.ru)
@date 2014-2020
@copyright BSD-3-Clause

"""


import unittest

# Generate images without having a window appear.
import matplotlib
matplotlib.use('Agg')

import numpy

from pyclustering.tests.assertion import assertion

import pyclustering.utils.metric as metric


class MetricUnitTest(unittest.TestCase):
    def testCalculateMetric(self):
        assertion.eq(1.0, metric.distance_metric(metric.type_metric.EUCLIDEAN)([0.0, 1.0], [0.0, 0.0]))
        assertion.eq(4.0, metric.distance_metric(metric.type_metric.EUCLIDEAN_SQUARE)([2.0, 2.0], [4.0, 2.0]))
        assertion.eq(4.0, metric.distance_metric(metric.type_metric.MANHATTAN)([1.0, 1.0], [-1.0, -1.0]))
        assertion.eq(2.0, metric.distance_metric(metric.type_metric.CHEBYSHEV)([2.0, -2.0], [0.0, 0.0]))
        assertion.eq(2.0, metric.distance_metric(metric.type_metric.MINKOWSKI)([-3.0, -3.0], [-5.0, -3.0]))
        assertion.eq(2.0, metric.distance_metric(metric.type_metric.MINKOWSKI, degree=2)([-3.0, -3.0], [-5.0, -3.0]))
        assertion.eq(0.5, metric.distance_metric(metric.type_metric.GOWER, max_range=([2.0, 0.0]))([-3.0, -3.0], [-5.0, -3.0]))
        assertion.eq(0.5, metric.distance_metric(metric.type_metric.GOWER, data=[[-3.0, -3.0], [-4.0, -3.0], [-4.5, -3.0], [-5.0, -3.0]])([-3.0, -3.0],[-5.0, -3.0]))
        assertion.eq(4.0, metric.distance_metric(metric.type_metric.USER_DEFINED, func=metric.euclidean_distance_square)([2.0, 2.0], [4.0, 2.0]))

        user_function = lambda point1, point2: point1[0] + point2[0] + 2
        assertion.eq(5.0, metric.distance_metric(metric.type_metric.USER_DEFINED, func=user_function)([2.0, 3.0], [1.0, 3.0]))


    def testEuclideanDistance(self):
        assertion.eq(0.0, metric.euclidean_distance([0], [0]))
        assertion.eq(0.0, metric.euclidean_distance_numpy(numpy.array([0]), numpy.array([0])))
        assertion.eq(1.0, metric.euclidean_distance([0.0, 1.0], [0.0, 0.0]))
        assertion.eq(1.0, metric.euclidean_distance_numpy(numpy.array([0.0, 1.0]), numpy.array([0.0, 0.0])))
        assertion.eq(2.0, metric.euclidean_distance([3.0, 3.0], [5.0, 3.0]))
        assertion.eq(2.0, metric.euclidean_distance_numpy(numpy.array([3.0, 3.0]), numpy.array([5.0, 3.0])))
        assertion.eq(2.0, metric.euclidean_distance([-3.0, -3.0], [-5.0, -3.0]))
        assertion.eq(2.0, metric.euclidean_distance_numpy(numpy.array([-3.0, -3.0]), numpy.array([-5.0, -3.0])))


    def testEuclideanDistanceSquare(self):
        assertion.eq(0.0, metric.euclidean_distance_square([0], [0]))
        assertion.eq(1.0, metric.euclidean_distance_square([0.0, 1.0], [0.0, 0.0]))
        assertion.eq(4.0, metric.euclidean_distance_square([2.0, 2.0], [4.0, 2.0]))
        assertion.eq(4.0, metric.euclidean_distance_square([-2.0, 2.0], [-4.0, 2.0]))


    def testManhattanDistance(self):
        assertion.eq(0.0, metric.manhattan_distance([0], [0]))
        assertion.eq(1.0, metric.manhattan_distance([0.0, 1.0], [0.0, 0.0]))
        assertion.eq(2.0, metric.manhattan_distance([1.0, 1.0], [0.0, 0.0]))
        assertion.eq(4.0, metric.manhattan_distance([1.0, 1.0], [-1.0, -1.0]))
        assertion.eq(2.0, metric.manhattan_distance([-1.0, -1.0], [-2.0, -2.0]))


    def testChebyshevDistance(self):
        assertion.eq(0.0, metric.chebyshev_distance([0], [0]))
        assertion.eq(1.0, metric.chebyshev_distance([1.0, 0.0], [0.0, 0.0]))
        assertion.eq(1.0, metric.chebyshev_distance([1.0, 1.0], [0.0, 0.0]))
        assertion.eq(1.0, metric.chebyshev_distance([1.0, -1.0], [0.0, 0.0]))
        assertion.eq(2.0, metric.chebyshev_distance([2.0, 0.0], [0.0, 0.0]))
        assertion.eq(2.0, metric.chebyshev_distance([2.0, 1.0], [0.0, 0.0]))
        assertion.eq(2.0, metric.chebyshev_distance([2.0, -2.0], [0.0, 0.0]))
        assertion.eq(3.0, metric.chebyshev_distance([2.0, -2.0], [-1.0, -1.0]))


    def testMinkowskiDistance(self):
        assertion.eq(0.0, metric.minkowski_distance([0], [0]))
        assertion.eq(0.0, metric.minkowski_distance([0], [0], 2))
        assertion.eq(-2.0, metric.minkowski_distance([3.0, 3.0], [5.0, 3.0], 1))
        assertion.eq(2.0, metric.minkowski_distance([3.0, 3.0], [5.0, 3.0], 2))
        assertion.eq(2.0, metric.minkowski_distance([3.0, 3.0], [5.0, 3.0], 4))


    def testCanberraDistance(self):
        assertion.eq(0.0, metric.canberra_distance([0], [0]))
        assertion.eq(0.0, metric.canberra_distance_numpy(numpy.array([0]), numpy.array([0])))
        assertion.eq(2.0, metric.canberra_distance([0.0, 0.0], [1.0, 1.0]))
        assertion.eq(2.0, metric.canberra_distance_numpy(numpy.array([0.0, 0.0]), numpy.array([1.0, 1.0])))
        assertion.eq(1.0, metric.canberra_distance([0.75, 0.75], [0.25, 0.25]))
        assertion.eq(1.0, metric.canberra_distance_numpy(numpy.array([0.75, 0.75]), numpy.array([0.25, 0.25])))
        assertion.eq(0.0, metric.canberra_distance([-1.0, -1.0], [-1.0, -1.0]))
        assertion.eq(0.0, metric.canberra_distance_numpy(numpy.array([-1.0, -1.0]), numpy.array([-1.0, -1.0])))
        assertion.eq(0.4, metric.canberra_distance([-2.0, -2.0], [-3.0, -3.0]))
        assertion.eq(0.4, metric.canberra_distance_numpy(numpy.array([-2.0, -2.0]), numpy.array([-3.0, -3.0])))


    def testChiSquareDistance(self):
        assertion.eq(0.0, metric.chi_square_distance([0], [0]))
        assertion.eq(0.0, metric.chi_square_distance_numpy(numpy.array([0]), numpy.array([0])))
        assertion.eq(2.0, metric.chi_square_distance([0.0, 0.0], [1.0, 1.0]))
        assertion.eq(2.0, metric.chi_square_distance_numpy(numpy.array([0.0, 0.0]), numpy.array([1.0, 1.0])))
        assertion.eq(0.5, metric.chi_square_distance([0.75, 0.75], [0.25, 0.25]))
        assertion.eq(0.5, metric.chi_square_distance_numpy(numpy.array([0.75, 0.75]), numpy.array([0.25, 0.25])))
        assertion.eq(0.0, metric.chi_square_distance([-1.0, -1.0], [-1.0, -1.0]))
        assertion.eq(0.0, metric.chi_square_distance_numpy(numpy.array([-1.0, -1.0]), numpy.array([-1.0, -1.0])))
        assertion.eq(0.4, metric.chi_square_distance([-2.0, -2.0], [-3.0, -3.0]))
        assertion.eq(0.4, metric.chi_square_distance_numpy(numpy.array([-2.0, -2.0]), numpy.array([-3.0, -3.0])))


    def testGowerDistance(self):
        assertion.eq(0.0, metric.gower_distance([0], [0], [0.0]))
        assertion.eq(0.0, metric.gower_distance_numpy(numpy.array([0]), numpy.array([0]), numpy.array([0.0])))
        assertion.eq(1.0, metric.gower_distance([0.0, 0.0], [1.0, 1.0], [1.0, 1.0]))
        assertion.eq(1.0, metric.gower_distance_numpy(numpy.array([0.0, 0.0]), numpy.array([1.0, 1.0]), numpy.array([1.0, 1.0])))
        assertion.eq(1.0, metric.gower_distance([0.75, 0.75], [0.25, 0.25], [0.5, 0.5]))
        assertion.eq(1.0, metric.gower_distance_numpy(numpy.array([0.75, 0.75]), numpy.array([0.25, 0.25]), numpy.array([0.5, 0.5])))
        assertion.eq(0.0, metric.gower_distance([-1.0, -1.0], [-1.0, -1.0], [0.0, 0.0]))
        assertion.eq(0.0, metric.gower_distance_numpy(numpy.array([-1.0, -1.0]), numpy.array([-1.0, -1.0]), numpy.array([0.0, 0.0])))
        assertion.eq(1.0, metric.gower_distance([-2.0, -2.0], [-3.0, -3.0], [1.0, 1.0]))
        assertion.eq(1.0, metric.gower_distance_numpy(numpy.array([-2.0, -2.0]), numpy.array([-3.0, -3.0]), numpy.array([1.0, 1.0])))


    def testGowerDistanceIntegrity(self):
        a, b = [1.2, 3.4], [1.0, 2.2]
        npa, npb = numpy.array(a), numpy.array(b)

        gower = metric.distance_metric(metric.type_metric.GOWER, data=[a, b], numpy_usage=False)
        gower_numpy = metric.distance_metric(metric.type_metric.GOWER, data=numpy.array([a, b]), numpy_usage=True)
        assertion.eq(gower(a, b), gower_numpy(npa, npb))


    def testCommonAndNumPyMetricsTwoDimension(self):
        a = [1.2, 3.4]
        b = [5.4, -7.1]
        npa = numpy.array(a)
        npb = numpy.array(b)

        assertion.eq(metric.euclidean_distance(a, b), metric.euclidean_distance_numpy(npa, npb))
        assertion.eq(metric.euclidean_distance_square(a, b), metric.euclidean_distance_square_numpy(npa, npb))
        assertion.eq(metric.manhattan_distance(a, b), metric.manhattan_distance_numpy(npa, npb))
        assertion.eq(metric.chebyshev_distance(a, b), metric.chebyshev_distance_numpy(npa, npb))
        assertion.eq(metric.minkowski_distance(a, b, 2), metric.minkowski_distance_numpy(npa, npb, 2))
        assertion.eq(metric.minkowski_distance(a, b, 4), metric.minkowski_distance_numpy(npa, npb, 4))
        assertion.eq(metric.canberra_distance(a, b), metric.canberra_distance_numpy(npa, npb))
        assertion.eq(metric.chi_square_distance(a, b), metric.chi_square_distance_numpy(npa, npb))
        assertion.eq(metric.chi_square_distance(a, b), metric.chi_square_distance_numpy(npa, npb))

        gower = metric.distance_metric(metric.type_metric.GOWER, data=[a, b], numpy_usage=False)
        gower_numpy = metric.distance_metric(metric.type_metric.GOWER, data=[a, b], numpy_usage=True)
        assertion.eq(gower(a, b), gower_numpy(npa, npb))