1. 流程
- 收集数据:此处使用给定的文本文件
- 准备数据:基于二值图像构造数据
- 分析数据:对图像向量进行目测
- 训练算法:采用三种不同的方法,不同的参数
- 线性分类器
- 二次多项式核函数
- 径向基核函数
- 测试并计算错误率
2. 实验
本实验使用的训练数据如下图所示,为若干个手写的 0 和 9 的数字图像。
本实验使用的测试数据如下图所示,为若干个手写的 0 和 9 的数字图像。
实验的主函数如下所示:
% 功能:演示 Kernel SVM算法
% 时间:2015-07-13
clc
clear all
close all
addpath('./data');
%% 测试样本
dataLength = 2;
[xTrain1, yTrain1, xTrain2, yTrain2] = readDataFromFiles('./data/trainingDigits');
[xTest1, yTest1, xTest2, yTest2] = readDataFromFiles('./data/testDigits');
% 合并样本
X = [xTrain1, xTrain2];
Y = [yTrain1, yTrain2];
% 打乱样本顺序
index = randperm(size(X, 2));
X(:, index) = X;
Y(:, index) = Y;
%% Kernel SVM 训练
kernelType = 'liner';
[alpha, b] = kernelSvmTrainMine(X, Y, kernelType);
%% 提取 SV
epsilon = 1e-5;
indexSV = find(alpha > epsilon);
%% 测试输出
yTestResult1 = sign(sum(bsxfun(@times, alpha(indexSV) .* Y(indexSV)', kernel(X(:, indexSV), xTest1, kernelType))) + b);
yTestResult2 = sign(sum(bsxfun(@times, alpha(indexSV) .* Y(indexSV)', kernel(X(:, indexSV), xTest2, kernelType))) + b);
sum(yTestResult1 ~= yTest1)
sum(yTestResult2 ~= yTest2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
训练数据和测试数据的个数为:
数字 | 0 | 9 |
---|---|---|
训练 | 198 | 204 |
测试 | 97 | 89 |
线性分类器的结果如下所示:
类型 | 系数 | 测试错误数 | 支持向量数 |
---|---|---|---|
线性 | 无 | 1 | 78 |
二次多项式核函数的结果如下所示,其中的系数是指 K