Avec les corrections de StompChicken (j'ai mal calculé le produit d'un point, pouah!) La réponse semble être oui. J'ai depuis testé le même problème en utilisant un noyau précalculé avec les mêmes résultats corrects. Si vous utilisez libsvm StompChickens, les calculs organisés sont très agréables.Est-ce que libsvm est précis?
Question d'origine: Je suis sur le point de commencer à utiliser des noyaux précalculés dans libSVM. J'avais remarqué Vlad's answer à une question et j'ai pensé qu'il serait sage de confirmer que libsvm a donné des réponses correctes. J'ai commencé avec des noyaux non pré-calculés, juste un noyau linéaire simple avec 2 classes et trois points de données dans un espace à 3 dimensions. J'ai utilisé les données
1 1:3 2:1 3:0
2 1:3 2:3 3:1
1 1:7 3:9
Le fichier modèle généré par un appel à svm-train -s 0 - t 0
contient
svm_type c_svc
kernel_type linear
nr_class 2
total_sv 3
rho -1.53951
label 1 2
nr_sv 2 1
SV
0.4126650675419768 1:3 2:1 3:0
0.03174528241667363 1:7 3:9
-0.4444103499586504 1:3 2:3 3:1
Cependant, lorsque je calcule la solution à la main qui n'est pas ce que je reçois. Est-ce que quelqu'un sait si libsvm souffre d'erreurs ou est-ce que quelqu'un peut comparer les notes et voir si elles obtiennent la même chose que libsvm?
Les coefficients a1
, a2
, a3
retournés par libsvm sont devraient être les valeurs qui font
a1 + a2 + a3 - 5*a1*a1 + 12*a1*a2 - 21*a1*a3 - 19*a2*a2/2 + 21*a2*a3 - 65*a3*a3
aussi grande que possible avec les restrictions qui a1 + a3 = a2
et chacun des a1
, a2
, a3
est nécessaire pour se situe entre 0 et 1 (la valeur par défaut de C).
Le fichier modèle ci-dessus indique la réponse est
a1 = .412665...
a2 = .444410...
a3 = .031745...
Mais un juste doit remplacer a2 = a1 + a3
dans la grande formule ci-dessus et confirmer les deux dérivées partielles sont nuls pour voir si cette solution est correcte (car aucun de a1
, a2
, a3
est 0 ou 1) mais ils ne sont pas nuls.
Est-ce que je fais quelque chose de mal, ou est-ce que libsvm donne de mauvais résultats? (J'espère que je vais faire quelque chose de mal.)