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
|
#!/usr/bin/env python
import unittest
import numpy
import cogent.cluster.goodness_of_fit as goodness_of_fit
__author__ = "Andreas Wilm"
__copyright__ = "Copyright 2007-2009, The Cogent Project"
__credits__ = ["Andreas Wilm"]
__license__ = "GPL"
__version__ = "1.5.0"
__maintainer__ = "Andreas Wilm"
__email__ = "andreas.wilm@ucd.ie"
__status__ = "Production"
def example_distmat_and_mdscoords():
"""Return an example distance matrix and corresponding MDS coordinates
Arguments:
* None
Returns:
* Tuple of:
** a distance matrix as numpy.matrix and
** MDS coordinates as numpy.array
"""
distmat = numpy.array([
[ 0. , 0.039806, 0.056853, 0.21595 , 0.056853, 0.0138 ,
0.203862, 0.219002, 0.056853, 0.064283],
[ 0.039806, 0. , 0.025505, 0.203862, 0.0208 , 0.039806,
0.194917, 0.21291 , 0.0208 , 0.027869],
[ 0.056853, 0.025505, 0. , 0.197887, 0.018459, 0.056853,
0.191958, 0.203862, 0.018459, 0.025505],
[ 0.21595 , 0.203862, 0.197887, 0. , 0.206866, 0.206866,
0.07956 , 0.066935, 0.203862, 0.206866],
[ 0.056853, 0.0208 , 0.018459, 0.206866, 0. , 0.056853,
0.203862, 0.21595 , 0.0138 , 0.0208 ],
[ 0.0138 , 0.039806, 0.056853, 0.206866, 0.056853, 0. ,
0.197887, 0.209882, 0.056853, 0.064283],
[ 0.203862, 0.194917, 0.191958, 0.07956 , 0.203862, 0.197887,
0. , 0.030311, 0.200869, 0.206866],
[ 0.219002, 0.21291 , 0.203862, 0.066935, 0.21595 , 0.209882,
0.030311, 0. , 0.21291 , 0.219002],
[ 0.056853, 0.0208 , 0.018459, 0.203862, 0.0138 , 0.056853,
0.200869, 0.21291 , 0. , 0.011481],
[ 0.064283, 0.027869, 0.025505, 0.206866, 0.0208 , 0.064283,
0.206866, 0.219002, 0.011481, 0. ]])
mds_coords = numpy.array([
[ 0.065233, 0.035019, 0.015413],
[ 0.059604, 0.00168 , -0.003254],
[ 0.052371, -0.010959, -0.014047],
[-0.13804 , -0.036031, 0.031628],
[ 0.063703, -0.015483, -0.00751 ],
[ 0.056803, 0.031762, 0.021767],
[-0.135082, 0.023552, -0.021006],
[-0.150323, 0.011935, -0.010013],
[ 0.06072 , -0.01622 , -0.007721],
[ 0.065009, -0.025254, -0.005257]])
return (distmat, mds_coords)
class GoodnessOfFitTestCase(unittest.TestCase):
def setUp(self):
"""
set up
"""
(self.distmat, self.mds_coords) = example_distmat_and_mdscoords()
self.stress = goodness_of_fit.Stress(self.distmat, self.mds_coords)
def test_kruskalstress1(self):
"""
testing goodness_of_fit.calcKruskalStress()
"""
val = "%0.6f" % self.stress.calcKruskalStress()
self.assertEqual(val, '0.022555')
def test_sstress(self):
"""
testing goodness_of_fit.calcSstress()
"""
val = "%0.6f" % self.stress.calcSstress()
self.assertEqual(val, '0.008832')
def test_calc_pwdist(self):
"""
testing (private) goodness_of_fit._calc_pwdist
"""
# this is a square in 2D
square_mds = numpy.array([[0,0], [1,0], [1,1], [0,1]])
# this is what the distance matrix should look like
square_distmat = numpy.array([[ 0. , 1. , 1.41421356, 1. ],
[ 1. , 0. , 1. , 1.41421356],
[ 1.41421356, 1. , 0. , 1. ],
[ 1. , 1.41421356, 1. , 0. ]])
derived_distmat = self.stress._calc_pwdist(square_mds)
# check if dervied and original array are (more or less) the same
self.assert_((derived_distmat-square_distmat).sum() < 0.000001)
def test_argument_mixup_exception(self):
"""
test if mds_coords and distmat are mix-up is detected
"""
self.assertRaises(AssertionError,
goodness_of_fit.Stress,
self.mds_coords, self.distmat)
# should give something like
# AssertionError: orig_distmat shape bigger than mds_coords shape. Possible argument mixup
def test_size_exception(self):
"""
test if check on number of rows works
"""
self.assertRaises(AssertionError,
goodness_of_fit.Stress,
self.distmat, self.mds_coords.transpose())
# should give something like
# AssertionError: orig_distmat and mds_coords do not have the same number of rows/objects.
if __name__ == '__main__':
unittest.main()
|