Working One-class SVM in Julia?

I think maybe the defaults for LIBSVM (inherited from the underlying library) are not appropriate for the suggested test. Here is the test, with a Linear kernel and a small value for nu:

using LIBSVM
using Random
using Plots

rng = MersenneTwister(42)
traindata = randn(rng, (2, 500))

posdata = traindata[:, traindata[1, :] + traindata[2, :] .> 1]

fig = scatter(posdata[1, :], posdata[2, :]; label="Train", marker=:o, color=:blue)

# Default for comparison
# mdl = svmtrain(posdata; svmtype=OneClassSVM, nu=0.01)
mdl = svmtrain(posdata; svmtype=OneClassSVM, kernel=Kernel.Linear, nu=0.01)

testdata = randn(rng, (2, 200))

labels, values = svmpredict(mdl, testdata)

pos_data = testdata[:, labels]
neg_data = testdata[:, .~labels]

scatter!(fig, pos_data[1, :], pos_data[2,:]; marker=:+, color=:green, label="Test positive")
scatter!(fig, neg_data[1, :], neg_data[2,:]; marker=:+, color=:red, label="Test negative")

savefig(fig, "OneClassSVM.png")
display(fig)

OneClassSVM

2 Likes