private static RealVector BatchGradient(double[] logloss, TrainingInstance[] batch) { int dimensions = batch[0].GetFeatureCount(); int batchSize = batch.Length; RealVector toReplicate = new RealVector(logloss); RealVector labels = new RealVector(batchSize); for (int i = 0 ; i < batchSize; i++) { labels.GetFeatures()[i] = batch[i].GetLabel(); } labels.Add(1).ScaleThis(0.5); toReplicate.Subtract(labels); RealVector[] repmat = new RealVector[dimensions]; for (int i = 0; i < dimensions; i++) { repmat[i] = new RealVector(toReplicate); } for (int i = 0; i < dimensions; i++) { for(int j = 0; j < batchSize; j++) { repmat[i].w[j] *= batch[j].GetFeatures().w[i]; } } RealVector result = new RealVector(dimensions); for (int i = 0; i < dimensions;i++) { result.w[i] = repmat[i].Average(); } return result; }
public RealVector Train(int maxIter) { var w = new RealVector(defaultWeights); for (int i = 0; i < maxIter; i++) { TrainingInstance[] batch = CreateBatch(SelectSubset(subsampleSize), w); RealVector grad = BatchGradient(LogisticLoss(batch, w), batch); w.Subtract(grad); if(grad.GetNorm() < epsilon) { break; } } return w; }