trainLinearSVM function
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];
}