基于libsvm的手写字体识别
——30cases与40cases&25cases“联谊”第三弹
By faruto
2010/6/2
最终测试集合的分类效果是:
Accuracy = 93.3333% (28/30) (classification) 即只有两个被错分
Rocwoods测试集合的效果是90%(27/30) 即只有三个被错分
谢老师测试集合的效果是93.3333% (28/30) (classification) 即只有两个被错分
由于训练集和测试集数目都比较小,以上的结果都是可以接受的。
我尝试调整参数将准确率再提高一些,最终作罢,估计在前期的图片预处理上下功夫,才能达到完全的测试集识别。O(∩_∩)O~
1 MATLAB自带的svm实现函数仅有的模型是C-SVC(C-support vector classification);而libsvm工具箱有C-SVC(C-support vector classification),nu-SVC(nu-support vector classification),one-class SVM(distribution estimation),epsilon-SVR(epsilon-support vector regression),nu-SVR(nu-support vector regression)等多种模型可供使用。
2 MATLAB自带的svm实现函数仅支持分类问题,不支持回归问题;而libsvm不仅支持分类问题,亦支持回归问题。
3 MATLAB自带的svm实现函数仅支持二分类问题,多分类问题需按照多分类的相应算法编程实现;而libsvm采用1v1算法支持多分类。
4 MATLAB自带的svm实现函数采用RBF核函数时无法调节核函数的参数gamma,貌似仅能用默认的;而libsvm可以进行该参数的调节。
5 libsvm中的二次规划问题的解决算法是SMO;而MATLAB自带的svm实现函数中二次规划问题的解法有三种可以选择:经典二次方法;SMO;最小二乘。(这个是我目前发现的MATLAB自带的svm实现函数唯一的优点~)
[code]
function CharacterRecognitionLibs
% Character Recognition based on libsvm
% by faruto
% Email:patrick.lee@foxmail.com
% QQ:516667408
% http://blog.sina.com.cn/faruto
% last modified 2010.06.02
% Super Moderator @ www.ilovematlab.cn
%%
tic;
close all;
clear;
clc;
format compact;
%% 载入训练数据
[FileName,PathName,FilterIndex] = uigetfile( ...
if ~FilterIndex
end
num_train = length(FileName);
TrainData = zeros(num_train,16*16);
TrainLabel = zeros(num_train,1);
for k = 1:num_train
end
%% 建立支持向量机
% [bestCVaccuracy,bestc,bestg] = ...
%
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model = svmtrain(TrainLabel, TrainData, cmd);
preTrainLabel = svmpredict(TrainLabel, TrainData, model);
%% 载入测试样本
[FileName,PathName,FilterIndex] = uigetfile( ...
if ~FilterIndex
end
num_train = length(FileName);
TestData = zeros(num_train,16*16);
TestLabel = zeros(num_train,1);
for k = 1:num_train
end
%% 对测试样本进行分类
preTestLabel = svmpredict(TestLabel, TestData, model);
%% sub function of pre-processing pic
function pic_preprocess = pic_preprocess(pic)
pic = 255-pic;
pic = im2bw(pic,0.4);
[y,x] = find(pic == 1);
pic_preprocess = pic(min(y):max(y), min(x):max(x));
pic_preprocess = imresize(pic_preprocess,[16,16]);
%%
toc;
[/code]
测试结果:
[code]
bestCVaccuracy =
bestc =
bestg =
Accuracy = 100% (50/50) (classification)
Accuracy = 93.3333% (28/30) (classification)
[/code]
===========================
K>> TestLabel'
ans =
K>> preTestLabel'
ans =
GA参数寻优化结果图: