class TestLRManager(unittest.TestCase): def setUp(self): self.output = Raster('../../examples/multifact.tif') #~ [1,1,3] #~ [3,2,1] #~ [0,3,1] self.output.resetMask([0]) self.state = self.output self.factors = [ Raster('../../examples/sites.tif'), Raster('../../examples/sites.tif') ] #~ [1,2,1], #~ [1,2,1], #~ [0,1,2] self.output1 = Raster('../../examples/data.tif') self.state1 = self.output1 self.factors1 = [Raster('../../examples/fact16.tif')] def test_LR(self): #~ data = [ #~ [3.0, 1.0, 3.0], #~ [3.0, 1.0, 3.0], #~ [0, 3.0, 1.0] #~ ] #~ result = np.ma.array(data = data, mask = (data==0)) lr = LR(ns=0) # 3-class problem lr.setState(self.state) lr.setFactors(self.factors) lr.setOutput(self.output) lr.setTrainingData() lr.train() predict = lr.getPrediction(self.state, self.factors) predict = predict.getBand(1) assert_array_equal(predict, self.output.getBand(1)) lr = LR(ns=1) # Two-class problem (it's because of boundary effect) lr.setState(self.state1) lr.setFactors(self.factors1) lr.setOutput(self.output1) lr.setTrainingData() lr.train() predict = lr.getPrediction(self.state1, self.factors1, calcTransitions=True) predict = predict.getBand(1) self.assertEquals(predict.dtype, np.uint8) data = [ [0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 2.0, 0.0], [0.0, 2.0, 2.0, 0.0], [0.0, 0.0, 0.0, 0.0], ] result = np.ma.array(data=data, mask=(data == 0)) assert_array_equal(predict, result) # Confidence is zero confid = lr.getConfidence() self.assertEquals(confid.getBand(1).dtype, np.uint8) # Transition Potentials potentials = lr.getTransitionPotentials() cats = self.output.getBandGradation(1) for cat in [1.0, 2.0]: map = potentials[cat] self.assertEquals(map.getBand(1).dtype, np.uint8)
class TestMlpManager (unittest.TestCase): def setUp(self): self.factors = [Raster('../../examples/multifact.tif')] self.output = Raster('../../examples/sites.tif') #~ sites.tif is 1-band 3x3 raster: #~ [1,2,1], #~ [1,2,1], #~ [0,1,2] self.factors2 = [Raster('../../examples/multifact.tif'), Raster('../../examples/multifact.tif')] self.factors3 = [Raster('../../examples/two_band.tif')] self.factors4 = [Raster('../../examples/two_band.tif'), Raster('../../examples/multifact.tif')] self.output1 = Raster('../../examples/data.tif') self.state1 = self.output1 self.factors1 = [Raster('../../examples/fact16.tif')] def test_MlpManager(self): mng = MlpManager(ns=1) mng.createMlp(self.output, self.factors2, self.output, [10]) assert_array_equal(mng.getMlpTopology(), [2*9 + 2*9, 10, 3]) mng = MlpManager() mng.createMlp(self.output, self.factors, self.output, [10]) assert_array_equal(mng.getMlpTopology(), [2*1 + 1*1, 10, 3]) def test_setTrainingData(self): mng = MlpManager() mng.createMlp(self.output, self.factors, self.output, [10]) stat = self.factors[0].getBandStat(1) # mean & std m,s = stat['mean'], stat['std'] mng.setTrainingData(self.output, self.factors, self.output, shuffle=False) min, max = mng.sigmin, mng.sigmax data = np.array( [ ((0,3), [0, 1], (1.0-m)/s, [min, max, min]), ((1,3), [0, 0], (1.0-m)/s, [min, min, max]), ((2,3), [0, 1], (3.0-m)/s, [min, max, min]), ((0,2), [0, 1], (3.0-m)/s, [min, max, min]), ((1,2), [0, 0], (2.0-m)/s, [min, min, max]), ((2,2), [0, 1], (1.0-m)/s, [min, max, min]), ((0,1), [1, 0], (0.0-m)/s, [max, min, min]), ((1,1), [0, 1], (3.0-m)/s, [min, max, min]), ((2,1), [0, 0], (1.0-m)/s, [min, min, max]), ], dtype=[('coords', float, 2),('state', float, (2,)), ('factors', float, (1,)), ('output', float, 3)] ) self.assertEqual(mng.data.shape, (9,)) for i in range(len(data)): assert_array_equal(data[i]['coords'], mng.data[i]['coords']) assert_array_equal(data[i]['factors'], mng.data[i]['factors']) assert_array_equal(data[i]['output'], mng.data[i]['output']) # two input rasters mng = MlpManager(ns=1) mng.createMlp(self.output, self.factors2, self.output, [10]) mng.setTrainingData(self.output, self.factors2, self.output) data = [ { 'factors': (np.array([ 1., 1., 3., 3., 2., 1., 0., 3., 1., 1., 1., 3., 3., 2., 1., 0., 3., 1.]) - stat['mean'])/stat['std'], 'output': np.array([min, min, max]), 'state': np.array([0,1, 0,0, 0,1, 0,1, 0,0, 0,1, 1,0, 0,1, 0,0]) } ] self.assertEqual(mng.data.shape, (1,)) assert_array_equal(data[0]['factors'], mng.data[0]['factors']) assert_array_equal(data[0]['output'], mng.data[0]['output']) assert_array_equal(data[0]['state'], mng.data[0]['state']) # Multiband input mng = MlpManager(ns=1) mng.createMlp(self.output, self.factors3, self.output, [10]) stat1 = self.factors3[0].getBandStat(1) # mean & std m1,s1 = stat1['mean'], stat1['std'] stat2 = self.factors3[0].getBandStat(2) # mean & std m2,s2 = stat2['mean'], stat2['std'] mng.setTrainingData(self.output, self.factors3, self.output) data = [ { 'factors': np.array([ (1.-m1)/s1, (2.-m1)/s1, (1.-m1)/s1, (1.-m1)/s1, (2.-m1)/s1, (1.-m1)/s1, (0.-m1)/s1, (1.-m1)/s1, (2.-m1)/s1, (1.-m2)/s2, (1.-m2)/s2, (3.-m2)/s2, (3.-m2)/s2, (2.-m2)/s2, (1.-m2)/s2, (0.-m2)/s2, (3.-m2)/s2, (1.-m2)/s2]), 'output': np.array([min, min, max]), 'state': np.array([0,1, 0,0, 0,1, 0,1, 0,0, 0,1, 1,0, 0,1, 0,0]) } ] self.assertEqual(mng.data.shape, (1,)) assert_array_equal(data[0]['factors'], mng.data[0]['factors']) assert_array_equal(data[0]['output'], mng.data[0]['output']) assert_array_equal(data[0]['state'], mng.data[0]['state']) # Complex case: mng = MlpManager(ns=1) mng.createMlp(self.output, self.factors4, self.output, [10]) stat1 = self.factors4[0].getBandStat(1) # mean & std m1,s1 = stat1['mean'], stat1['std'] stat2 = self.factors4[0].getBandStat(2) # mean & std m2,s2 = stat2['mean'], stat2['std'] stat3 = self.factors4[1].getBandStat(1) m3,s3 = stat3['mean'], stat2['std'] mng.setTrainingData(self.output, self.factors4, self.output) data = [ { 'factors': np.array([ (1.-m1)/s1, (2.-m1)/s1, (1.-m1)/s1, (1.-m1)/s1, (2.-m1)/s1, (1.-m1)/s1, (0.-m1)/s1, (1.-m1)/s1, (2.-m1)/s1, (1.-m2)/s2, (1.-m2)/s2, (3.-m2)/s2, (3.-m2)/s2, (2.-m2)/s2, (1.-m2)/s2, (0.-m2)/s2, (3.-m2)/s2, (1.-m2)/s2, (1.-m3)/s3, (1.-m3)/s3, (3.-m3)/s3, (3.-m3)/s3, (2.-m3)/s3, (1.-m3)/s3, (0.-m3)/s3, (3.-m3)/s3, (1.-m3)/s3]), 'output': np.array([min, min, max]), 'state': np.array([0,1, 0,0, 0,1, 0,1, 0,0, 0,1, 1,0, 0,1, 0,0]) } ] self.assertEqual(mng.data.shape, (1,)) assert_array_equal(data[0]['factors'], mng.data[0]['factors']) assert_array_equal(data[0]['output'], mng.data[0]['output']) assert_array_equal(data[0]['state'], mng.data[0]['state']) def test_train(self): mng = MlpManager() mng.createMlp(self.output, self.factors, self.output, [10]) mng.setTrainingData(self.output, self.factors, self.output) mng.train(1, valPercent=50) val = mng.getMinValError() tr = mng.getTrainError() mng.train(20, valPercent=50, continue_train=True) self.assertGreaterEqual(val, mng.getMinValError()) mng = MlpManager(ns=1) mng.createMlp(self.state1, self.factors1, self.output1, [10]) mng.setTrainingData(self.state1, self.factors1, self.output1) mng.train(1, valPercent=20) predict = mng.getPrediction(self.state1, self.factors1) mask = predict.getBand(1).mask self.assertTrue(not all(mask.flatten())) def test_predict(self): mng = MlpManager() mng.createMlp(self.output, self.factors, self.output, [10]) weights = mng.copyWeights() # Set weights=0 # then the output must be sigmoid(0) layers = [] for layer in weights: shape = layer.shape layers.append(np.zeros(shape)) mng.setMlpWeights(layers) mng._predict(self.output, self.factors) # Prediction ( the output must be sigmoid(0) ) raster = mng.getPrediction(self.output, self.factors, calcTransitions=True) assert_array_equal(raster.getBand(1), sigmoid(0)*np.ones((3,3))) # Confidence is zero confid = mng.getConfidence() self.assertEquals(confid.getBand(1).dtype, np.uint8) assert_array_equal(confid.getBand(1), np.zeros((3,3))) # Transition Potentials (is (sigmoid(0) - sigmin)/sigrange ) potentials = mng.getTransitionPotentials() cats = self.output.getBandGradation(1) for cat in cats: map = potentials[cat] self.assertEquals(map.getBand(1).dtype, np.uint8) assert_array_equal(map.getBand(1), 50*np.ones((3,3)))
def test_create(self): raster = Raster() raster.create([self.data1], geodata=self.r1.getGeodata()) self.assertTrue(raster.geoDataMatch(self.r1)) self.assertEqual(raster.getBandsCount(), 1) self.assertEqual(set(raster.getBandGradation(1)), set([0, 1, 2, 3]))
class TestRaster(unittest.TestCase): def setUp(self): self.r1 = Raster('examples/multifact.tif') self.r2 = Raster('examples/sites.tif') self.r3 = Raster('examples/two_band.tif') # r1 data1 = np.array([[1, 1, 3], [3, 2, 1], [0, 3, 1]]) # r2 data2 = np.array([[1, 2, 1], [1, 2, 1], [0, 1, 2]]) mask = [[False, False, False], [False, False, False], [False, False, False]] self.data1 = ma.array(data=data1, mask=mask) self.data2 = ma.array(data=data2, mask=mask) def test_RasterInit(self): self.assertEqual(self.r1.getBandsCount(), 1) band = self.r1.getBand(1) shape = band.shape x = self.r1.getXSize() y = self.r1.getYSize() self.assertEqual(shape, (x, y)) self.assertEqual(self.r2.getBandsCount(), 1) band = self.r2.getBand(1) assert_array_equal(band, self.data2) self.assertTrue(self.r1.geoDataMatch(self.r2)) self.assertTrue(self.r1.isMetricProj()) def test_create(self): raster = Raster() raster.create([self.data1], geodata=self.r1.getGeodata()) self.assertTrue(raster.geoDataMatch(self.r1)) self.assertEqual(raster.getBandsCount(), 1) self.assertEqual(set(raster.getBandGradation(1)), set([0, 1, 2, 3])) def test_roundBands(self): rast = Raster('examples/multifact.tif') rast.bands = rast.bands * 0.1 rast.roundBands() answer = [[[ 0, 0, 0, ], [0, 0, 0], [0, 0, 0]]] assert_array_equal(answer, rast.bands) rast = Raster('examples/multifact.tif') rast.bands = rast.bands * 1.1 rast.roundBands(decimals=1) answer = np.array([[[1.1, 1.1, 3.3], [3.3, 2.2, 1.1], [0.0, 3.3, 1.1]]]) assert_array_equal(answer, rast.bands) def test_isContinues(self): rast = Raster('examples/multifact.tif') self.assertFalse(rast.isCountinues(bandNo=1)) rast = Raster('examples/dist_roads.tif') self.assertTrue(rast.isCountinues(bandNo=1)) def test_getBandStat(self): stat = self.r1.getBandStat(1) self.assertAlmostEqual(stat['mean'], 15.0 / 9) self.assertAlmostEqual(stat['std'], np.sqrt(10.0 / 9)) def test_normalize(self): multifact = [ [1, 1, 3], [3, 2, 1], [0, 3, 1], ] # Normalize using std and mean r1 = Raster('examples/multifact.tif') r1.normalize() r1.denormalize() assert_array_equal(r1.getBand(1), multifact) # Normalize using min and max r1 = Raster('examples/multifact.tif') r1.normalize(mode='maxmin') r1.denormalize() assert_array_equal(r1.getBand(1), multifact) # Two normalization procedures r1 = Raster('examples/multifact.tif') r1.normalize() r1.normalize(mode='maxmin') r1.denormalize() assert_array_equal(r1.getBand(1), multifact) r1 = Raster('examples/multifact.tif') r1.normalize(mode='maxmin') r1.normalize() r1.denormalize() assert_array_equal(r1.getBand(1), multifact) def test_getNeighbours(self): neighbours = self.r2.getNeighbours(row=1, col=0, size=0) self.assertEqual(neighbours, [[1]]) neighbours = self.r2.getNeighbours(row=1, col=1, size=1) assert_array_equal(neighbours, [self.data2]) neighbours = self.r3.getNeighbours(row=1, col=1, size=1) assert_array_equal(neighbours, [self.data2, self.data1]) # Check pixel on the raster bound and nonzero neighbour size self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=0, size=1) self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=1, size=2) def test_geodata(self): geodata = self.r1.getGeodata() self.r1.setGeoData(geodata) geodata['xSize'] = geodata['xSize'] + 10 self.assertRaises(ProviderError, self.r1.setGeoData, geodata=geodata) self.assertTrue(self.r1.geoDataMatch(self.r1)) self.assertTrue( self.r1.geoDataMatch(raster=None, geodata=self.r1.getGeodata())) self.assertTrue(self.r1.geoTransformMatch(self.r1)) self.assertTrue( self.r1.geoTransformMatch(raster=None, geodata=self.r1.getGeodata())) def test_save(self): try: filename = 'temp.tiff' self.r1.save(filename) r2 = Raster(filename) self.assertEqual(r2.get_dtype(), self.r1.get_dtype()) self.assertEqual(r2.getBandsCount(), self.r1.getBandsCount()) for i in range(r2.getBandsCount()): assert_array_equal(r2.getBand(i + 1), self.r1.getBand(i + 1)) finally: os.remove(filename) def test_getBandGradation(self): self.assertEqual(set(self.r1.getBandGradation(1)), set([0, 1, 2, 3]))
class TestLRManager (unittest.TestCase): def setUp(self): self.output = Raster('../../examples/multifact.tif') #~ [1,1,3] #~ [3,2,1] #~ [0,3,1] self.output.resetMask([0]) self.state = self.output self.factors = [Raster('../../examples/sites.tif'), Raster('../../examples/sites.tif')] #~ [1,2,1], #~ [1,2,1], #~ [0,1,2] self.output1 = Raster('../../examples/data.tif') self.state1 = self.output1 self.factors1 = [Raster('../../examples/fact16.tif')] def test_LR(self): #~ data = [ #~ [3.0, 1.0, 3.0], #~ [3.0, 1.0, 3.0], #~ [0, 3.0, 1.0] #~ ] #~ result = np.ma.array(data = data, mask = (data==0)) lr = LR(ns=0) # 3-class problem lr.setState(self.state) lr.setFactors(self.factors) lr.setOutput(self.output) lr.setTrainingData() lr.train() predict = lr.getPrediction(self.state, self.factors) predict = predict.getBand(1) assert_array_equal(predict, self.output.getBand(1)) lr = LR(ns=1) # Two-class problem (it's because of boundary effect) lr.setState(self.state1) lr.setFactors(self.factors1) lr.setOutput(self.output1) lr.setTrainingData() lr.train() predict = lr.getPrediction(self.state1, self.factors1, calcTransitions=True) predict = predict.getBand(1) self.assertEquals(predict.dtype, np.uint8) data = [ [0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 2.0, 0.0], [0.0, 2.0, 2.0, 0.0], [0.0, 0.0, 0.0, 0.0], ] result = np.ma.array(data = data, mask = (data==0)) assert_array_equal(predict, result) # Confidence is zero confid = lr.getConfidence() self.assertEquals(confid.getBand(1).dtype, np.uint8) # Transition Potentials potentials = lr.getTransitionPotentials() cats = self.output.getBandGradation(1) for cat in [1.0, 2.0]: map = potentials[cat] self.assertEquals(map.getBand(1).dtype, np.uint8)
class TestRaster (unittest.TestCase): def setUp(self): self.r1 = Raster('examples/multifact.tif') self.r2 = Raster('examples/sites.tif') self.r3 = Raster('examples/two_band.tif') # r1 data1 = np.array( [ [1,1,3], [3,2,1], [0,3,1] ]) # r2 data2 = np.array( [ [1,2,1], [1,2,1], [0,1,2] ]) mask = [ [False, False, False], [False, False, False], [False, False, False] ] self.data1 = ma.array(data=data1, mask=mask) self.data2 = ma.array(data=data2, mask=mask) def test_RasterInit(self): self.assertEqual(self.r1.getBandsCount(), 1) band = self.r1.getBand(1) shape = band.shape x = self.r1.getXSize() y = self.r1.getYSize() self.assertEqual(shape, (x,y)) self.assertEqual(self.r2.getBandsCount(), 1) band = self.r2.getBand(1) assert_array_equal(band, self.data2) self.assertTrue(self.r1.geoDataMatch(self.r2)) self.assertTrue(self.r1.isMetricProj()) def test_create(self): raster = Raster() raster.create([self.data1], geodata=self.r1.getGeodata()) self.assertTrue(raster.geoDataMatch(self.r1)) self.assertEqual(raster.getBandsCount(), 1) self.assertEqual(set(raster.getBandGradation(1)), set([0, 1, 2, 3])) def test_roundBands(self): rast = Raster('examples/multifact.tif') rast.bands = rast.bands*0.1 rast.roundBands() answer = [[[ 0, 0, 0,], [ 0, 0, 0], [ 0, 0, 0]]] assert_array_equal(answer, rast.bands) rast = Raster('examples/multifact.tif') rast.bands = rast.bands*1.1 rast.roundBands(decimals=1) answer = np.array( [[ [1.1,1.1,3.3], [3.3,2.2,1.1], [0.0,3.3,1.1] ]]) assert_array_equal(answer, rast.bands) def test_isContinues(self): rast = Raster('examples/multifact.tif') self.assertFalse(rast.isCountinues(bandNo=1)) rast = Raster('examples/dist_roads.tif') self.assertTrue(rast.isCountinues(bandNo=1)) def test_getBandStat(self): stat = self.r1.getBandStat(1) self.assertAlmostEqual(stat['mean'], 15.0/9) self.assertAlmostEqual(stat['std'], np.sqrt(10.0/9)) def test_normalize(self): multifact = [ [1,1,3], [3,2,1], [0,3,1], ] # Normalize using std and mean r1 = Raster('examples/multifact.tif') r1.normalize() r1.denormalize() assert_array_equal(r1.getBand(1), multifact) # Normalize using min and max r1 = Raster('examples/multifact.tif') r1.normalize(mode='maxmin') r1.denormalize() assert_array_equal(r1.getBand(1), multifact) # Two normalization procedures r1 = Raster('examples/multifact.tif') r1.normalize() r1.normalize(mode='maxmin') r1.denormalize() assert_array_equal(r1.getBand(1), multifact) r1 = Raster('examples/multifact.tif') r1.normalize(mode='maxmin') r1.normalize() r1.denormalize() assert_array_equal(r1.getBand(1), multifact) def test_getNeighbours(self): neighbours = self.r2.getNeighbours(row=1,col=0, size=0) self.assertEqual(neighbours, [[1]]) neighbours = self.r2.getNeighbours(row=1,col=1, size=1) assert_array_equal(neighbours, [self.data2]) neighbours = self.r3.getNeighbours(row=1,col=1, size=1) assert_array_equal(neighbours, [self.data2, self.data1]) # Check pixel on the raster bound and nonzero neighbour size self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=0, size=1) self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=1, size=2) def test_geodata(self): geodata = self.r1.getGeodata() self.r1.setGeoData(geodata) geodata['xSize'] = geodata['xSize'] + 10 self.assertRaises(ProviderError, self.r1.setGeoData, geodata=geodata) self.assertTrue(self.r1.geoDataMatch(self.r1)) self.assertTrue(self.r1.geoDataMatch(raster=None, geodata=self.r1.getGeodata())) self.assertTrue(self.r1.geoTransformMatch(self.r1)) self.assertTrue(self.r1.geoTransformMatch(raster=None, geodata=self.r1.getGeodata())) def test_save(self): try: filename = 'temp.tiff' self.r1.save(filename) r2 = Raster(filename) self.assertEqual(r2.get_dtype(), self.r1.get_dtype()) self.assertEqual(r2.getBandsCount(), self.r1.getBandsCount()) for i in range(r2.getBandsCount()): assert_array_equal(r2.getBand(i+1), self.r1.getBand(i+1)) finally: os.remove(filename) def test_getBandGradation(self): self.assertEqual(set(self.r1.getBandGradation(1)), set([0, 1, 2, 3]))