svm|Matlab 线性分类器与SVM

线性分类器 利用最小二乘法求线性分类器系数代码如下:

function [ w,b ] = leastSquares( trainData,trainLabel ) %最小二乘法线性分类器 [nums,demens]=size(trainData); trainData=https://www.it610.com/article/[trainData,ones(nums,1)]; R=trainData'*trainData; E=trainData'*trainLabel; w=inv(R)*E; b=norm(trainLabel-trainData*w,2); end

SVM 【svm|Matlab 线性分类器与SVM】svm即代入KKT条件的二次规划问题
代码如下:
function [model] = svmTrain(X, y, C) % 函数的核心就是对拉格朗日对偶式的二次规划问题, 通过返回的alpha得到我们需要的支持向量 m = length(y); H = y * y' * ((X')'* X'); %线性核运算 f = -ones(m, 1); A = []; b = []; Aeq = y'; beq = 0; lb = zeros(m, 1); ub = C * ones(m, 1); alphas0 = zeros(m, 1); epsilon = 0.1; options = optimset('LargeScale', 'off', 'Display', 'off'); alphas1 = quadprog(H, f, A, b, Aeq, beq, lb, ub, alphas0, options); logic_vector = abs(alphas1) > epsilon; model.vec_x = X(logic_vector, :); model.vec_y = y(logic_vector); model.alphas = alphas1(logic_vector); end

function result = svmTest(model, X) % 在svmTrain中我们主要计算的就是那几个支持向量, 对应的, 核心就是alpha % 现在有了alpha, 我们通过公式可以轻而易举地计算出w, 我们还不知道b的值, 也即是超平面偏差的值 % 所有先将我们的支持向量代入到公式中, 计算出一个临时的w % 对于一直的支持向量来说, 我们已经知道了它的label, 所有可以计算出b, 将超平面拉过来, 再将这个b运用到测试集中即可% 带入公式w = sum(alpha .* y_sv)*kernel(x_sv, x_test) % x是输入需要预测的值 tmp = (model.alphas' .* model.vec_y' * (model.vec_x*model.vec_x'))'; % 计算出偏差, 也就是超平面的截距 total_bias = model.vec_y - tmp; bias = mean(total_bias); % 我们已经得到了alpha, 因为w是由alpha表示的, 所以通过alpha可以计算出w % w = sum(alpha .* y_sv)*kernel(x_sv, x_test) % 其中y_sv是sv的标签, x_sv是sv的样本, x_test是需要预测的数据 w = (model.alphas' .* model.vec_y' * (model.vec_x*X'))'; result.w = w; result.y_pred = sign(w + bias); result.b = bias; end

    推荐阅读