如何通过 MATLAB 接口解释 libsvm 的模型参数?

机器算法验证 支持向量机 matlab libsvm
2022-03-29 17:47:44

我使用 libsvm 的 MATLAB 接口对 997 维训练数据进行二进制分类。我试图了解如何使用生成的模型来计算预测输出(我们通过调用得到svmpredict

该模型包含字段(它具有线性内核):

nSV = [546; 246]; totalSV=792; rho = 0.093
and svCoeff [792x1 double] and SVs [792x997 double]

我认为我们必须简单地将 svCoeff 与 SV 相乘以得到一个 [997x1] 矩阵,然后我们将其与实际特征相乘,然后由 rho 持股。但事实并非如此。有人可以用一个简单的方程来说明这些参数是如何用于分类的吗?

2个回答

支持向量机分类器使用以下决策函数来确定测试实例的标签z

f(z)=sign(i=1totalSVyiαiκ(xi,z)ρ)=sign(w,Φ(z)ρ),

在哪里κ(,)是核函数,α包含支持值,y是训练标签向量,ρ是一个偏置项并且w是特征空间中的分离超平面。

在 LIBSVM 模型中,sv_coef包含αiyiSVs包含支持向量 (xi)。要进行预测,您需要在测试点和所有支持向量之间执行内核评估。

对于线性核 (κ(x,z)=xTz) 你可以计算w明确:

w=i=1totalSVαiyixi=sv_coefT×SVs.

随后,预测只是基于wTzρ.

没关系,我在 svmlight 包中找到了 svm.cpp 并读取了 svm_predict 函数。它是为 n 个类的一般情况编写的,但对于两个类的简单情况,它们的逻辑归结为

>> sv=model.SVs;
>> svc=model.sv_coef;
>> sv546=sv(1:546, :); %Since model.label is [1, -1] and model.nSV=[546; 246]
>> sv246=sv(547:end, :);
>> svc546=svc(1:546);
>> svc246=svc(547:end);
>> weight_for_minus1=transpose(svc246)*sv246; %Since model.label is [1, -1] and model.nSV=[546; 246]
>> weight_for_plus1=transpose(svc546)*sv546;
>> 'now multiply weight_for_minu1 and weight_for_plus1 with the 997-dimensional feature and select whichever is positive'