本教程将使用 MATLAB 自带的统计和机器学习工具箱,利用支持向量机 (SVM) 构建一个银行钞票真假辨别分类器,并实现结果可视化。

1. 数据导入

首先,我们导入银行钞票真假辨别数据集。假设数据集文件名为 'data_banknote_authentication.txt',存储在 'G:\matlabwenjian' 目录下,则导入代码如下:

data_txt = importdata('G:\matlabwenjian\data_banknote_authentication.txt');

2. 划分训练集和测试集

接下来,我们将数据集分为训练集和测试集。这里我们采用 70% 的数据作为训练集,30% 的数据作为测试集:

train_ratio = 0.7;
num_samples = size(data_txt, 1);
num_train = round(train_ratio*num_samples);
num_test = num_samples - num_train;
train_idx = randperm(num_samples, num_train);
test_idx = setdiff(1:num_samples, train_idx);
train_data = data_txt(train_idx, 1:4);
train_label = data_txt(train_idx, 5);
test_data = data_txt(test_idx, 1:4);
test_label = data_txt(test_idx, 5);

3. SVM 模型训练

使用 SVM 训练分类器。这里我们使用线性核函数,C 参数为 1:

svm_model = fitcsvm(train_data, train_label, 'KernelFunction', 'linear', 'BoxConstraint', 1);

4. 分类评估

使用测试集对分类器进行测试,并计算分类器的准确率:

[pred_label, score] = predict(svm_model, test_data);
accuracy = sum(pred_label == test_label)/num_test

5. 结果可视化

使用 MATLAB 自带的绘图工具箱,绘制分类器的决策边界和数据点的分布情况。以下是绘图的代码:

% 计算分类器的决策边界
x_min = min(data_txt(:,1));
x_max = max(data_txt(:,1));
y_min = min(data_txt(:,2));
y_max = max(data_txt(:,2));
[x_grid, y_grid] = meshgrid(x_min:0.01:x_max, y_min:0.01:y_max);
z_grid = predict(svm_model, [x_grid(:), y_grid(:)]);
z_grid = reshape(z_grid, size(x_grid));

% 绘制分类器的决策边界和数据点的分布情况
figure;
subplot(1,2,1);
contourf(x_grid, y_grid, z_grid, 'LineStyle', 'none');
hold on;
scatter(train_data(train_label==-1,1), train_data(train_label==-1,2), 'r');
scatter(train_data(train_label==1,1), train_data(train_label==1,2), 'g');
xlabel('Variance');
ylabel('Skewness');
legend('Decision boundary', 'Negative class', 'Positive class');
title('Training set');

subplot(1,2,2);
contourf(x_grid, y_grid, z_grid, 'LineStyle', 'none');
hold on;
scatter(test_data(test_label==-1,1), test_data(test_label==-1,2), 'r');
scatter(test_data(test_label==1,1), test_data(test_label==1,2), 'g');
xlabel('Variance');
ylabel('Skewness');
legend('Decision boundary', 'Negative class', 'Positive class');
title('Testing set');

代码解释:

  • 数据集划分:使用 randperm 函数随机抽取数据,并使用 setdiff 函数计算测试集索引。
  • SVM 训练:使用 fitcsvm 函数训练 SVM 分类器,KernelFunction 参数指定使用线性核函数,BoxConstraint 参数指定惩罚系数。
  • 分类评估:使用 predict 函数进行分类,并计算分类准确率。
  • 结果可视化:使用 meshgridcontourf 函数绘制分类器的决策边界,使用 scatter 函数绘制数据点的分布情况。subplot 函数用于在同一画布上绘制训练集和测试集的结果。

注意事项:

  • 数据集路径应根据实际情况进行修改。
  • SVM 参数(如 KernelFunctionBoxConstraint)可以根据实际情况进行调整,以获得最佳分类效果。
  • 可视化代码仅展示了对两个特征进行可视化的示例,根据实际情况可以对其他特征进行可视化。
MATLAB 银行钞票真假辨别分类器:基于 SVM 的实现及可视化

原文地址: https://www.cveoy.top/t/topic/nXGu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录