线性分类器 利用最小二乘法求线性分类器系数代码如下:
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
推荐阅读
- paddle|动手从头实现LSTM
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- 读书笔记|《白话大数据和机器学习》学习笔记1
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 深度学习|深度学习笔记总结
- 机器学习|机器学习Sklearn学习总结
- 机器学习|线性回归原理与python实现