for batchIndex in xrange(nfolds):
        print('\t\t Batch %d ...' % (batchIndex))
        # Initial parameters
        random.seed(25)
        b0, a0 = set_initial(c, data.dxm + 1, data.dxr + 1)
        param0 = mapOptimizationMatrices2Vector(b0, a0)

        validateIds = np.arange(batchIndex * batchSize, (batchIndex + 1) * batchSize)
        trainIds = list(set(np.arange(trainAndValidateXm.shape[0])) - set(validateIds))

        res = mixedLogistic_EMtrain(param0=param0, c=c,
                                    y=np.matrix(trainAndValidateY[trainIds]).T,
                                    xm=trainAndValidateXm[trainIds, :],
                                    xr=trainAndValidateXr[trainIds, :],
                                    m=1)

        pred = mixedLogistic_pred(res=res,
                                  xmt=trainAndValidateXm[validateIds, :],
                                  xrt=trainAndValidateXr[validateIds, :],
                                  c=c,
                                  yt=np.matrix(trainAndValidateY[validateIds]).T)

        validateScores.append(pred['f1'])
        print('\t\twith validation score (F1) = %f' % (pred['f1']))

    avgValidateScores.append(np.mean(validateScores))
    print('\tAverage validation score = %f for c = %d' % (np.mean(validateScores), c))

c_optim = c_candidates[np.array(avgValidateScores).argmax()]
print('Optimal c = %d' % (c_optim))
# Initialize parameters
b0, a0 = set_initial(c, data.dxm + 1, data.dxr + 1)
param0 = mapOptimizationMatrices2Vector(b0, a0)

# nParams = (data.dxm + 1) * (c - 1) + (data.dxr + 1) * c
# param0 = np.zeros(nParams)
# param0 = np.ones(nParams)

# res = mixedLogistic_EMtrain(param0=param0, c=c,
#                             y=np.matrix(data.y).T,
#                             xm=data.xm,
#                             xr=data.xr,
#                             m=1)

res = mixedLogistic_EMtrain_separate(param0=param0, c=c,
                                     y=np.matrix(data.y).T,
                                     xm=data.xm,
                                     xr=data.xr,
                                     m=1)

# === Check parameters ===
beta_est, alpha_est = mapOptimizationVector2Matrices(res['param'], 2, 3)
beta_est
alpha_est

data.beta
data.alpha

# === Predict ===
pred = mixedLogistic_pred(res, data.xm, data.xr, c, data.y)