Chẩn ựoán với λ = 0.1 (trong hàm crossvalind - dùng ựể chọn ngẫu nhiên tập
mẫu luyện), số mẫu luyện là 616, số mẫu dùng ựể kiểm tra SVM là 683-616=67. Kết quả cho thấy, có 4 mẫu (những ựiểm chấm không ựược khoanh tròn, trên tổng số 67 mẫu test) kết luận sai (so với phân lớp ựã biết).
Hình 1-13. Kết quả kiểm tra chéo SVM chẩn ựoán ung thư với λ = 0.1 (lần 1)
Cùng tham số trên, chọn lại tập mẫu luyện. Kết quả chẩn ựoán có 1 mẫu kết luận sai. C h u ẩ n ự o á n Mẫu Dự ựoán
Hình 1-14. Kết quả kiểm tra chéo SVM chẩn ựoán ung thư với λ = 0.1 (lần 2)
Với SVM xây dựng có tham số xác ựịnh như trên, cho kết quả phân lớp với ựộ tin cậy là 99.3506% (kết quả của việc gọi hàm CorrectRate).
1.7.2 NhQn dBng s! viDt tay b(ng SVM phân loBi nhiu l/p
Trong những năm gần ựây, SVM ựược ựánh giá là một trong những phương pháp phân lớp có ựộ chắnh xác cao và ựã ựược áp dụng nhiều trong các bài toán nhận dạng ký tự quang (Optical Character Recognition) ựặc biệt là trong nhận dạng chữ viết tay.
Nhận dạng ký tự quang có thể ựược hiểu là quá trình chuyển ựổi tài liệu dưới dạng tệp ảnh số hoá thành tài liệu dưới dạng tệp văn bản.
Dưới ựây là vắ dụ về nhận dạng chữ số viết tay sử dụng SVM ựa phân lớp (cụ thể ở ựây là 10 lớp) sử dụng gói stprtool - Statistical Pattern Recognition Toolbox (tải tại ựịa chỉ http://cmp.felk.cvut.cz/cmp/software/stprtool/).
Một số hàm cơ bản khi sử dụng:
Hàm sử dụng SVM phân loại theo chiến lược một chọi phần còn lại:
function [itrfin] = multisvm(TrainingMatrix,GroupMatrix,TestingVecto) % TrainingMatrix=[5,1,1,1,2,1,3,1,1; 5,4,4,5,7,10,3,2,1; % 3,1,1,1,2,2,3,1,1;8,10,10,8,7,10,9,7,1] % GroupMatrix=[2;3;3;4] % TestingVecto=[5,1,1,1,2,1,3,1,1] u=unique(GroupMatrix); N=length(u); if(N>=2)
itr=1; % dung de duyet tu 1 den N nhom classes=0; % chua thuoc nhom nao
Mẫu Dự ựoán C h u ẩ n ự o á n
% c1 = 1 khi bieu thuc logic true % c1 = 0 khi bieu thuc logic false
newGroup=double((GroupMatrix==u(itr))); % newGroup co nhom la 0 va 1
svmStruct = svmtrain(TrainingMatrix, newGroup,'kernel_function','RBF',
'quadprog_opts', optimset('MaxIter',90000000)); classes = svmclassify(svmStruct, TestingVecto);
itr=itr+1; end %while itr=itr-1; itrfin = u(itr); end % if end % func
Hàm sử dụng SVM ựể phân loại theo chiến lược một chọi một:
function [itrfin] = multisvm(TrainingMatrix,GroupMatrix,TestingVecto) % TrainingMatrix=[5,1,1,1,2,1,3,1,1; 5,4,4,5,7,10,3,2,1; % 3,1,1,1,2,2,3,1,1;8,10,10,8,7,10,9,7,1] % GroupMatrix=[2;3;3;4] % TestingVecto=[5,1,1,1,2,1,3,1,1] u=unique(GroupMatrix); N=length(u); if(N>=2) iStart=1; iEnd=length(u); while(iStart~=iEnd) % Xet 2 group hien tai
train1 = (GroupMatrix==u(iStart)); train2 = (GroupMatrix==u(iEnd)); train = logical(train1 + train2);
% (1) GroupMatrix(train) co the mang gia tri khac 0, 1 svmStruct = svmtrain(TrainingMatrix(train,:),
GroupMatrix(train),'kernel_function','RBF', 'quadprog_opts', optimset('MaxIter',90000000));
classes = svmclassify(svmStruct, TestingVecto); % do (1) nen khong the so sanh voi 0 hoac 1 if (classes==u(iStart)) % ung voi ket qua am
iEnd = iEnd - 1; else iStart = iStart + 1; end end %while itrfin = u(iStart); end %if end
Các bước khi chạy vắ dụ nhận dạng số viết tay bằng SVM phân loại nhiều lớp: đặt ựường dẫn: chạy tệp stprpath.m, nếu chạy stprtool lần ựầu thì dùng thêm lệnh compilemex ựể biên dịch lại tài nguyên.
Tạo các mẫu dùng ựể huấn luyện: tại cửa sổ lệnh của MatLab gõ
collect_chars('my_examples_i') ở ựây i là chữ số từ 0 ựến 9 (dùng ựể chỉ
mẫu luyện dùng cho SVM tương ứng với phân lớp từ 0 ựến 9; nhãn của nhóm cũng ựược ựánh số tương ứng từ 0 ựến 9). Sau khi vẽ, ảnh ựược chuẩn hóa về kắch thước chuẩn 16ừ16 rồi chuyển sang ảnh nhị phân. Sau ựó quá trình rút chọn ựặc trưng ựược tiến hành. Kết quả của lệnh này là một ma trận biểu diễn thuộc tắnh (hay chắnh là ựặc trưng) của ảnh biểu diễn chữ số ựược vẽ.
Khởi tạo các tham số xây dựng SVM: dùng lệnh tune_ocr. Kết quả của lệnh này sẽ lưu lại các thông tin liên quan ựến SVM tốt nhất (có ựộ tin cậy tốt nhất; thông số như sau: ker = rbf C, = Inf, arg = 5.0) ứng với các mẫu dùng ựể luyện.
Dùng SVM trên ựể luyện tập mẫu: dùng lệnh train_ocr, kết quả cho
thấy SVM có ựộ tin cậy 99.9631%.
Nhận dạng chữ số với SVM ựược xây dựng: dùng lệnh demo_ocr. Xuất hiện cửa sổ giao diện thao tác với chương trình. Nhấn chuột trái ựể vẽ số cần nhận dạng; Nhấn chuột phải ựể xóa nội dung ô hiện tại; Nhấn chuột giữa ựể nhận dạng.
Tập mẫu cần nhận dạng có hình ảnh dưới ựây: