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.4.1"
__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()
|