trainLinearSVM function

List<double> trainLinearSVM(
  1. List<List<double>> X,
  2. List<int> y, {
  3. double lr = 0.01,
  4. int epochs = 500,
  5. double C = 1.0,
})

Implementation

List<double> trainLinearSVM(
  List<List<double>> X,
  List<int> y, {
  double lr = 0.01,
  int epochs = 500,
  double C = 1.0,
}) {
  final n = X.length;
  if (n == 0) return [0.0];
  final m = X[0].length;
  if (y.length != n) throw ArgumentError('X and y must have same length');

  final weights = List<double>.filled(m, 0.0);
  var bias = 0.0;

  for (var epoch = 0; epoch < epochs; epoch++) {
    for (var i = 0; i < n; i++) {
      final xi = X[i];
      final yi = y[i];
      var dot = bias;
      for (var j = 0; j < m; j++) {
        dot += weights[j] * xi[j];
      }
      if (yi * dot < 1) {
        // subgradient for hinge loss with L2 regularization scaled by 1/2
        for (var j = 0; j < m; j++) {
          weights[j] = weights[j] - lr * (weights[j] - C * yi * xi[j]);
        }
        bias += lr * C * yi;
      } else {
        for (var j = 0; j < m; j++) {
          weights[j] = weights[j] - lr * weights[j];
        }
      }
    }
  }
  return [bias, ...weights];
}