def get_CRBM(how_long=4000):
    print "Creating data...."
    mean1 = np.array([-0.2, 0.3])
    mean2 = np.array([0.5, -0.5])

    cov1 = np.array([[0.02, 0.005], [0.001, 0.01]])
    cov2 = np.array([[0.02, 0.0], [0.0, 0.02]])

    dataset = np.random.multivariate_normal(mean1, cov1, 200).tolist()
    dataset += np.random.multivariate_normal(mean2, cov2, 200).tolist()

    r = CRBM(2, 4)

    # Train at the following learning rates:
    print "Training..."

    for i in range(how_long):
        print '  ' + str(i) + '...',
        r.train_epoch(dataset, (0.9, 0.9), 20)
        E = np.sum([r.energy(data) for data in dataset])
        print 'Energy = ' + str(E) + '...',
        print 'Done'

    return r, dataset
def get_CRBM(how_long=4000):
    print "Creating data...."
    mean1 = np.array([-0.2, 0.3])
    mean2 = np.array([0.5, -0.5])

    cov1 = np.array([[0.02, 0.005], [0.001, 0.01]])
    cov2 = np.array([[0.02, 0.0], [0.0, 0.02]])

    dataset = np.random.multivariate_normal(mean1, cov1, 200).tolist()
    dataset += np.random.multivariate_normal(mean2, cov2, 200).tolist()

    r = CRBM(2, 4)

    # Train at the following learning rates:
    print "Training..."

    for i in range(how_long):
        print "  " + str(i) + "...",
        r.train_epoch(dataset, (0.9, 0.9), 20)
        E = np.sum([r.energy(data) for data in dataset])
        print "Energy = " + str(E) + "...",
        print "Done"

    return r, dataset
plt.draw()
f.show()

# Make a CRBM
print "Creating RBM"

rbm = CRBM(2,20)

rbm.lo = -2
rbm.hi = 2

# Train it
k=20
for i in range(10000):
#for i in range(0):
   err = rbm.train_epoch(dataset, 0.1, k)
   if i%10 == 0:
      print "Epoch", i, ": Error =", err

      # Now reconstruct some stuff
      XY_rec = np.random.uniform(-2,2,(100,2))

      for i in range(100):
         v0 = np.array([XY_rec[i,:]]).transpose()
         for j in range(20):
            h0 = rbm.sample_hidden(v0)
            v0 = rbm.sample_visible(h0)
         XY_rec[i,0] = v0[0,0]
         XY_rec[i,1] = v0[1,0]

      # Finally, draw the sampled points