目录

1.支持向量机(SVM)

2.多层感知器(MLP)

3.SVM与MLP的对比仿真

4.结论分析


1.支持向量机(SVM)

     SVM方法是通过一个非线性映射p,把样本空间映射到一个高维乃至无穷维的特征空间中(Hilbert空间),使得在原来的样本空间中非线性可分的问题转化为在特征空间中的线性可分的问题.简单地说,就是升维和线性化.升维,就是把样本向高维空间做映射,一般情况下这会增加计算的复杂性,甚至会引起"维数灾难",因而人们很少问津.但是作为分类、回归等问题来说,很可能在低维样本空间无法线性处理的样本集,在高维特征空间中却可以通过一个线性超平面实现线性划分(或回归).一般的升维都会带来计算的复杂化,SVM方法巧妙地解决了这个难题:应用核函数的展开定理,就不需要知道非线性映射的显式表达式;由于是在高维特征空间中建立线性学习机,所以与线性模型相比,不但几乎不增加计算的复杂性,而且在某种程度上避免了"维数灾难".这一切要归功于核函数的展开和计算理论.

       支持向量机是一种监督学习模型,主要用于分类和回归分析。对于分类问题,SVM的目标是找到一个超平面,使得不同类别的样本尽可能地被分开,并且两类样本之间的间隔最大化。设训练数据集为{(xi​,yi​)}i=1n​,其中xi​∈Rd 表示特征向量,yi​∈{−1,1} 表示类别标签。

      假设存在一个超平面w⋅x+b=0,其中w 是权向量,b 是偏置项。对于线性可分的情况,SVM试图找到最优的w 和b 使得间隔最大,即:

简化后得到:

为了求解上述优化问题,引入拉格朗日乘子αi​≥0,构造拉格朗日函数:

然后,将w 和b 的表达式代回拉格朗日函数中,得到关于α 的优化问题:

      当数据不是线性可分时,可以使用核函数K(xi​,xj​)=ϕ(xi​)⋅ϕ(xj​),其中ϕ 是映射函数,将原始数据从低维空间映射到高维空间,使得数据变得线性可分。

2.多层感知器(MLP)

        多层感知器是一种前馈神经网络,由输入层、隐藏层和输出层组成。每个神经元都与下一层的所有神经元相连,并且通常包含一个激活函数。设第l 层的输出为h(l),则有:

常用的损失函数有交叉熵损失:

其中pi​ 是预测的概率,yi​ 是真实标签。通过反向传播算法来更新权重和偏置。

      多层感知器模型即为多个单层感知器的叠加,模型如下图所示。

3.SVM与MLP的对比仿真


% 更新学习率和动量参数
if any(strcmp({'traingda', 'traingdm', 'traingdx'}, char('trainoss')))
    net.trainParam.lr = 0.01; % 更新学习率
    if ~strcmp('traingda', char('trainoss'))
        net.trainParam.mc = 0.95; % 更新动量参数
    end
end

% 更新隐藏层的激活函数
for j=1:2 % 更新每一层隐藏层的激活函数
    net.layers{j}.transferFcn = char('poslin'); 
end

 
% 使用训练集数据训练网络
[net, tr] = train(net, X_train', y_train');

% 预测测试集上的标签
y_prd1    = net(X_test');
% 将预测结果四舍五入为0或1
y_prd2    = round(y_prd1);

% 计算混淆矩阵
Vcmat     = confusionmat(y_test, y_prd2);
 

% 计算其他性能指标
[accuracy, fscore, fp_rate, recall, precision] = performance(Vcmat);
fprintf('MLP: 召回率 (即真正率) = %.2f%%\n', recall*100);
fprintf('MLP: 假正率 = %.2f%%\n', fp_rate*100);
fprintf('MLP: 准确率 = %.2f%%\n', accuracy*100);
fprintf('MLP: F1分数 = %.2f%%\n', fscore*100);
fprintf('MLP: 精确率 = %.2f%%\n', precision*100);

 
% 计算接收者操作特征曲线 (ROC) 数据
[x1, y1, ~, ~] = perfcurve(y_test, y_prd1(1,:),'1');

% 绘制ROC曲线
figure
plot(x1,y1,'b-o')
title('MLP ROC曲线')
xlabel('假正率')
ylabel('真正率')

save R1.mat x1 y1

............................................................................
% 预测测试集上的标签和得分
[Lab_pred, scores] = predict(val_model, X_test);
% 将预测结果追加到最终预测结果矩阵
Fpred    = [Fpred; Lab_pred];
% 将得分追加到最终得分矩阵
Fscore   = [Fscore; scores];

% 将实际标签追加到目标标签向量
y_target = [y_target; y_test];

% 计算混淆矩阵
Vcmat    = confusionmat(y_test, Lab_pred);
 

% 计算其他性能指标
[accuracy, fscore, fp_rate, recall, precision] = performance(Vcmat);


% 打印性能指标
fprintf('SVM: 召回率 (即真正率) = %.2f%%\n', recall*100);
fprintf('SVM: 假正率 = %.2f%%\n', fp_rate*100);
fprintf('SVM: 准确率 = %.2f%%\n', accuracy*100);
fprintf('SVM: F1分数 = %.2f%%\n', fscore*100);
fprintf('SVM: 精确率 = %.2f%%\n', precision*100);

% 计算接收者操作特征曲线 (ROC) 数据
[x1, y1, ~, ~] = perfcurve(y_target, scores(:,2),'1');

% 绘制ROC曲线
figure
plot(x1,y1,'b-o')
title('SVM ROC曲线')
xlabel('假正率')
ylabel('真正率')
grid on

save R2.mat x1 y1
up4139

4.结论分析

ROC曲线是在不同阈值下,真阳性率(TPR)与假阳性率(FPR)的关系图。

TPR 定义为:

其中 TP 表示真正例,FN 表示假负例,FP 表示假正例,TN 表示真负例。

从仿真结果可知,SVM性能略由于MLP。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐