/**
* 训练模型
* @param maxIt 最大迭代次数
*/
public void train(int maxIt)
{
int size = featureList.size();
weight = new double[size]; // 特征权重
double[] empiricalE = new double[size]; // 经验期望
double[] modelE = new double[size]; // 模型期望
for (int i = 0; i < size; ++i)
{
empiricalE[i] = (double) featureCountList.get(i) / instanceList.size();
}
double[] lastWeight = new double[weight.length]; // 上次迭代的权重
for (int i = 0; i < maxIt; ++i)
{
computeModeE(modelE);
for (int w = 0; w < weight.length; w++)
{
lastWeight[w] = weight[w];
weight[w] += 1.0 / C * Math.log(empiricalE[w] / modelE[w]);
}
if (checkConvergence(lastWeight, weight)) break;
}
}