def test_backward_with_hmmlearn(self): r = np.random.randn obs = [np.array([[-600 + r(), 100 + r()], [-300 + r(), 200 + r()], [0 + r(), 300 + r()]]) for _ in xrange(10)] hmm = GaussianHMM(n_components=3) hmm.fit(obs) # Calculcate bwdlattice using hmmlearn algorithm framelogprob = hmm._compute_log_likelihood(obs[0]) start = timeit.default_timer() bwdlattice1 = hmm._do_backward_pass(framelogprob) print('hmmlearn took %fs' % (timeit.default_timer() - start)) # Calculate bwdlattice using fhmm algorithm with #chains = 1. This should yield the exact same results start = timeit.default_timer() bwdlattice2 = np.zeros(bwdlattice1.shape) fhmmc._backward(obs[0].shape[0], 1, hmm.n_components, [(x,) for x in xrange(hmm.n_components)], hmm._log_startprob.reshape(1, 3), hmm._log_transmat.reshape(1, 3, 3), framelogprob, bwdlattice2) print('fhmm took %fs' % (timeit.default_timer() - start)) self.assertTrue(np.allclose(bwdlattice1, bwdlattice2))
for chr in chrOrder: lastClass[chr] = np.tile(args.ploidy,allData[chr].shape[0]); for i in range(0,args.iterations): warned=False; if args.verbose>1: sys.stderr.write(" Iteration %i.\n"%(i)); viterbi = {} noChange=0; viterbiCat =np.zeros(allDataCat.shape[0]); curTot=0; curNumCNVs=0; for chr in chrOrder: #3. Calculate Viterbi path given data if args.verbose>2: sys.stderr.write(" i=%i; Calculating Viterbi path for %s.\n"%(i,chr)); framelogprob = model._compute_log_likelihood(allData[chr]) #sys.stderr.write("framelogprob dim: "+str(framelogprob.shape)+"\n"); framelogprob[:,cnvsToStateIs[args.ploidy]] = np.subtract(framelogprob[:,cnvsToStateIs[args.ploidy]], args.standardPrior); #add log(prior) if args.scalePDF>0: framelogprob = np.subtract(framelogprob,statePDFMaxima) #### This requires some explanation. See Note 1 below. logprob, viterbi[chr] = model._do_viterbi_pass(framelogprob); curLen = len(viterbi[chr]); #4. For each non-standard state, calculate the mean in that state and add a state with a mean representing that ploidy changeStart=-1 viterbi[chr] = np.insert(viterbi[chr],[0,curLen],[normalState,normalState]); # add initial and terminal normalStates so that telomeres in CNV will be detected. for j in range(1,len(viterbi[chr])): if viterbi[chr][j]!=viterbi[chr][j-1]:#there was a change if changeStart==-1: if viterbi[chr][j]==normalState: raise Exception("new state is normal ploidy state"); changeStart=j;