Esempio n. 1
0
 def test_run_merge_move_on_dup_comps_succeeds_with_marglik_choice(self):
     ''' Consider Duplicated Comps model.
     Use marglik criteria to select candidates kA, kB.
     Verify that the merge accept rate is much higher than at random.
     The accept rate should actually be near perfect!
 '''
     self.MakeModelWithDuplicatedComps()
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.dupModel.calc_local_params(self.Data)
     SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     nTrial = 100
     nSuccess = 0
     PRNG = np.random.RandomState(0)
     for trial in range(nTrial):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel,
             self.Data,
             SS,
             mergename='marglik',
             randstate=PRNG)
         print MoveInfo['msg']
         if MoveInfo['didAccept']:
             nSuccess += 1
     assert nSuccess > 0
     rate = float(nSuccess) / float(nTrial)
     print "Expected rate: >.95"
     print "Measured rate: %.3f" % (rate)
     assert rate > 0.95
Esempio n. 2
0
 def test_run_merge_move_on_dup_comps_succeeds_with_random_choice(self):
     ''' Consider Duplicated Comps model.
     Out of (8 choose 2) = 28 possible pairs, 
     exactly 4 produce sensible merges.
     Verify that over many random trials where kA,kB drawn uniformly,
       we obtain a success rate not too different from 4 / 28 = 0.142857
 '''
     self.MakeModelWithDuplicatedComps()
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.dupModel.calc_local_params(self.Data)
     SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     nTrial = 100
     nSuccess = 0
     PRNG = np.random.RandomState(0)
     for trial in range(nTrial):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel,
             self.Data,
             SS,
             mergename='random',
             randstate=PRNG)
         if MoveInfo['didAccept']:
             print MoveInfo['msg']
             nSuccess += 1
     assert nSuccess > 0
     rate = float(nSuccess) / float(nTrial)
     print "Expected rate: .1428"
     print "Measured rate: %.3f" % (rate)
     assert rate > 0.1
     assert rate < 0.2
 def test_run_merge_move_on_dup_comps_succeeds_with_random_choice(self):
   ''' Consider Duplicated Comps model.
       Out of (8 choose 2) = 28 possible pairs, 
       exactly 4 produce sensible merges.
       Verify that over many random trials where kA,kB drawn uniformly,
         we obtain a success rate not too different from 4 / 28 = 0.142857
   '''
   self.MakeModelWithDuplicatedComps()
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.dupModel.calc_local_params(self.Data)
   SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   nTrial = 100
   nSuccess = 0
   PRNG = np.random.RandomState(0)
   for trial in range(nTrial):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel, self.Data, SS, mergename='random', randstate=PRNG)
     if MoveInfo['didAccept']:
       print MoveInfo['msg']
       nSuccess += 1
   assert nSuccess > 0
   rate = float(nSuccess)/float(nTrial)
   print "Expected rate: .1428"
   print "Measured rate: %.3f" % (rate)
   assert rate > 0.1
   assert rate < 0.2
Esempio n. 4
0
 def test_run_merge_move_on_duplicated_comps_succeeds_with_random_choice(
         self):
     ''' Verify that merges remove some "duplicate" comps from dupModel, 
       even when the pairs to merge are chosen at random.
     Also verify that the success rate of merges agrees with theory.
     For a dupModel with K=6, out of (6 choose 2) = 15 possible pairs, 
       exactly 3 produce sensible merges for dupModel (K=6).
     Verify that over many random trials where kA,kB drawn uniformly,
       we obtain a success rate not too different from 3 / 15 = 0.2.
 '''
     nTrial = 100
     nSuccess = 0
     PRNG = np.random.RandomState(0)
     for trial in range(nTrial):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel,
             self.Data,
             self.dupSS,
             mergename='random',
             randstate=PRNG)
         if MoveInfo['didAccept']:
             nSuccess += 1
     assert nSuccess > 0
     rate = float(nSuccess) / float(nTrial)
     assert rate > 0.1
     assert rate < 0.3
 def test_run_merge_move_on_true_comps_fails(self):
   ''' Verify that "true" model, with only components that generated the Data,
         no merges are accepted
   '''
   for trial in range(10):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.hmodel, self.Data, self.SS, mergename='random')
     assert newModel.allocModel.K == self.hmodel.allocModel.K
     assert newModel.obsModel.K == self.hmodel.obsModel.K
Esempio n. 6
0
 def test_run_merge_move_on_true_comps_fails(self):
     ''' Verify that "true" model, with only components that generated the Data,
       no merges are accepted
 '''
     for trial in range(10):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.hmodel, self.Data, self.SS, mergename='random')
         assert newModel.allocModel.K == self.hmodel.allocModel.K
         assert newModel.obsModel.K == self.hmodel.obsModel.K
 def test_run_merge_move_on_true_comps_fails(self):
   ''' Should not be able to merge "true" components into one another
       Each is necessary to explain (some) data
   '''
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.hmodel.calc_local_params(self.Data)
   SS = self.hmodel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   for trial in range(10):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.hmodel, self.Data, SS, mergename='random')
     assert newModel.allocModel.K == self.hmodel.allocModel.K
     assert newModel.obsModel.K == self.hmodel.obsModel.K
 def test_run_merge_move_on_duplicated_comps_succeeds_with_ideal_choice(self):
   ''' Verify that merges remove "duplicate" components from dupModel.
         when the IDs are of the duplicate pairs are specifically targeted.
       Attempt merge move on each pair of known "duplicates", 
         these are comp IDs  (0,3),  (1,4), and (2,5)
       This is "ideal", since in practice we wont know which comps to merge.
       This isolates whether the merges work even in the best of circumstances.
   '''
   Ktrue = self.hmodel.obsModel.K
   for k in range(Ktrue):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel, self.Data, self.dupSS, kA=k, kB=Ktrue+k)
     assert newModel.obsModel.K == self.dupModel.obsModel.K - 1
Esempio n. 9
0
 def test_run_merge_move_on_true_comps_fails(self):
     ''' Should not be able to merge "true" components into one another
     Each is necessary to explain (some) data
 '''
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.hmodel.calc_local_params(self.Data)
     SS = self.hmodel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     for trial in range(10):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.hmodel, self.Data, SS, mergename='random')
         assert newModel.allocModel.K == self.hmodel.allocModel.K
         assert newModel.obsModel.K == self.hmodel.obsModel.K
 def test_run_merge_move_on_dup_comps_succeeds_with_all_ideal_pairs(self):
   self.MakeModelWithDuplicatedComps()
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.dupModel.calc_local_params(self.Data)
   SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   myModel = self.dupModel.copy()
   for kA in [3,2,1,0]: # descend backwards so indexing still works
     kB = kA + 4 # Ktrue=4, so kA's best match is kA+4 
     myModel, SS, newEv, MoveInfo = MergeMove.run_merge_move(myModel,
                                        self.Data, SS, kA=kA, kB=kB)
     print MoveInfo['msg']
     assert MoveInfo['didAccept'] == 1
Esempio n. 11
0
 def test_run_merge_move_on_duplicated_comps_succeeds_with_ideal_choice(
         self):
     ''' Verify that merges remove "duplicate" components from dupModel.
       when the IDs are of the duplicate pairs are specifically targeted.
     Attempt merge move on each pair of known "duplicates", 
       these are comp IDs  (0,3),  (1,4), and (2,5)
     This is "ideal", since in practice we wont know which comps to merge.
     This isolates whether the merges work even in the best of circumstances.
 '''
     Ktrue = self.hmodel.obsModel.K
     for k in range(Ktrue):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel, self.Data, self.dupSS, kA=k, kB=Ktrue + k)
         assert newModel.obsModel.K == self.dupModel.obsModel.K - 1
Esempio n. 12
0
 def test_run_merge_move_on_dup_comps_succeeds_with_all_ideal_pairs(self):
     self.MakeModelWithDuplicatedComps()
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.dupModel.calc_local_params(self.Data)
     SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     myModel = self.dupModel.copy()
     for kA in [3, 2, 1, 0]:  # descend backwards so indexing still works
         kB = kA + 4  # Ktrue=4, so kA's best match is kA+4
         myModel, SS, newEv, MoveInfo = MergeMove.run_merge_move(myModel,
                                                                 self.Data,
                                                                 SS,
                                                                 kA=kA,
                                                                 kB=kB)
         print MoveInfo['msg']
         assert MoveInfo['didAccept'] == 1
Esempio n. 13
0
 def test_run_merge_move_on_dup_comps_fails_with_nonideal_pairs(self):
     ''' Given the duplicated comps model,
       which has a redundant copy of each "true" component,
     We show that deliberately merging each pair does succeed.
     This is "ideal" since we know in advance which merge pair to try
 '''
     self.MakeModelWithDuplicatedComps()
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.dupModel.calc_local_params(self.Data)
     SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     for Kstep in [1, 2, 3, 5, 6, 7]:
         for kA in range(8 - Kstep):
             kB = kA + Kstep
             newM, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
                 self.dupModel, self.Data, SS, kA=kA, kB=kB)
             print MoveInfo['msg']
             assert MoveInfo['didAccept'] == 0
 def test_run_merge_move_on_dup_comps_fails_with_nonideal_pairs(self):
   ''' Given the duplicated comps model,
         which has a redundant copy of each "true" component,
       We show that deliberately merging each pair does succeed.
       This is "ideal" since we know in advance which merge pair to try
   '''
   self.MakeModelWithDuplicatedComps()
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.dupModel.calc_local_params(self.Data)
   SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   for Kstep in [1,2,3,5,6,7]:
     for kA in range(8 - Kstep):
       kB = kA + Kstep
       newM, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel,
                                        self.Data, SS, kA=kA, kB=kB)
       print MoveInfo['msg']
       assert MoveInfo['didAccept'] == 0
 def test_run_merge_move_on_dup_comps_succeeds_with_each_ideal_pair(self):
   ''' Given the duplicated comps model,
         which has a redundant copy of each "true" component,
       We show that deliberately merging each pair does succeed.
       This is "ideal" since we know in advance which merge pair to try
   '''
   self.MakeModelWithDuplicatedComps()
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.dupModel.calc_local_params(self.Data)
   SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   for kA in [0,1,2,3]:
     kB = kA + 4 # Ktrue=4, so kA's best match is kA+4 
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel,
                                        self.Data, SS, kA=kA, kB=kB)
     print MoveInfo['msg']
     assert newModel.allocModel.K == self.dupModel.allocModel.K - 1
     assert newModel.obsModel.K == self.dupModel.obsModel.K - 1
     assert MoveInfo['didAccept'] == 1
Esempio n. 16
0
 def test_run_merge_move_on_dup_comps_succeeds_with_each_ideal_pair(self):
     ''' Given the duplicated comps model,
       which has a redundant copy of each "true" component,
     We show that deliberately merging each pair does succeed.
     This is "ideal" since we know in advance which merge pair to try
 '''
     self.MakeModelWithDuplicatedComps()
     mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
     LP = self.dupModel.calc_local_params(self.Data)
     SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
     for kA in [0, 1, 2, 3]:
         kB = kA + 4  # Ktrue=4, so kA's best match is kA+4
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel, self.Data, SS, kA=kA, kB=kB)
         print MoveInfo['msg']
         assert newModel.allocModel.K == self.dupModel.allocModel.K - 1
         assert newModel.obsModel.K == self.dupModel.obsModel.K - 1
         assert MoveInfo['didAccept'] == 1
  def test_run_merge_move_duplicated_comps_succeeds_with_marglik_choice(self):
    ''' Verify that merges remove some "duplicate" comps from dupModel, 
          when the pairs to merge are chosen via the marglik criterion.
        This selection method should produce much better success rate,
          than just choosing pairs at random.
    '''
    nTrial = 100
    nSuccess = 0
    PRNG = np.random.RandomState(0)
    for trial in range(nTrial):
      newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel, self.Data, self.dupSS, mergename='marglik', randstate=PRNG)
      if MoveInfo['didAccept']:
        nSuccess += 1
    assert nSuccess > 0
    rate = float(nSuccess)/float(nTrial)
    print rate
    assert rate > 0.8

    
 def test_run_merge_move_on_duplicated_comps_succeeds_with_random_choice(self):
   ''' Verify that merges remove some "duplicate" comps from dupModel, 
         even when the pairs to merge are chosen at random.
       Also verify that the success rate of merges agrees with theory.
       For a dupModel with K=6, out of (6 choose 2) = 15 possible pairs, 
         exactly 3 produce sensible merges for dupModel (K=6).
       Verify that over many random trials where kA,kB drawn uniformly,
         we obtain a success rate not too different from 3 / 15 = 0.2.
   '''
   nTrial = 100
   nSuccess = 0
   PRNG = np.random.RandomState(0)
   for trial in range(nTrial):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel, self.Data, self.dupSS, mergename='random', randstate=PRNG)
     if MoveInfo['didAccept']:
       nSuccess += 1
   assert nSuccess > 0
   rate = float(nSuccess)/float(nTrial)
   assert rate > 0.1
   assert rate < 0.3
 def test_run_merge_move_on_dup_comps_succeeds_with_marglik_choice(self):
   ''' Consider Duplicated Comps model.
       Use marglik criteria to select candidates kA, kB.
       Verify that the merge accept rate is much higher than at random.
       The accept rate should actually be near perfect!
   '''
   self.MakeModelWithDuplicatedComps()
   mergeFlags = dict(doPrecompEntropy=True, doPrecompMergeEntropy=True)
   LP = self.dupModel.calc_local_params(self.Data)
   SS = self.dupModel.get_global_suff_stats(self.Data, LP, **mergeFlags)
   nTrial = 100
   nSuccess = 0
   PRNG = np.random.RandomState(0)
   for trial in range(nTrial):
     newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(self.dupModel, self.Data, SS, mergename='marglik', randstate=PRNG)
     print MoveInfo['msg']
     if MoveInfo['didAccept']:
       nSuccess += 1
   assert nSuccess > 0
   rate = float(nSuccess)/float(nTrial)
   print "Expected rate: >.95"
   print "Measured rate: %.3f" % (rate)
   assert rate > 0.95
Esempio n. 20
0
 def test_run_merge_move_duplicated_comps_succeeds_with_marglik_choice(
         self):
     ''' Verify that merges remove some "duplicate" comps from dupModel, 
       when the pairs to merge are chosen via the marglik criterion.
     This selection method should produce much better success rate,
       than just choosing pairs at random.
 '''
     nTrial = 100
     nSuccess = 0
     PRNG = np.random.RandomState(0)
     for trial in range(nTrial):
         newModel, newSS, newEv, MoveInfo = MergeMove.run_merge_move(
             self.dupModel,
             self.Data,
             self.dupSS,
             mergename='marglik',
             randstate=PRNG)
         if MoveInfo['didAccept']:
             nSuccess += 1
     assert nSuccess > 0
     rate = float(nSuccess) / float(nTrial)
     print rate
     assert rate > 0.8