Với kiến thức tổng quan về mỏy vectơ ủó ủược trỡnh bày, mục này sẽ giới thiệu một số ứng dụng trong thực tiễn sử dụng SVM phõn loại hai và nhiều lớp ủược triển khai trên phần mềm MatLab.
1.7.1 ChNn đốn bAnh ung th. vú b(ng SVM phân loBi hai l/p
Ung thư vỳ hiện nay là nguyờn nhõn tử vong hàng ủầu của phụ nữ nhiều nước trên thế giới. ðây là chứng ung thư được chẩn đốn là phổ biến và là nguyên nhân thứ hai dẫn ủầu trong những cỏi chết do ung thư gõy ra ở phụ nữ, chỉ ủứng sau ung thư cổ tử cung, hiện nay lại chưa có biện pháp phòng ngừa hiệu quả. Loại ung thư này có một diễn tiến khụng ai lường trước và cú nguy cơ bị di căn cho ủến 20 năm hoặc hơn.
Cỏch tốt nhất ủể giảm thiểu những cỏi chết do ung thư dạng này là phỏt hiện và chữa trị thật sớm. Thông thường, việc tự kiểm tra, chụp X quang hay siêu âm là những phương phỏp thụng dụng nhất ủể phỏt hiện sớm cỏc khối u vựng ngực.
Nhưng do hỡnh ảnh thu ủược cú cấu trỳc phức tạp và những dấu hiệu ban ủầu của bệnh thường biểu hiện khụng rừ. Do ủú, cỏc chuyờn gia chụp X quang cú thể khú phỏt hiện hoặc bỏ sót một số thông tin biểu hiện việc thương tổn trên ảnh chụp.
Vì vậy những kỹ thuật hình ảnh cho ngực rất quan trọng bởi chúng sẽ cho phép phỏt hiện sớm ung thư và ủịnh vị những chấn thương ủỏng ngờ trong ngực, dựng cho thủ tục sinh thiết khi cần.
Về phương diện lâm sàng, một hệ thống chẩn đốn nhũ ảnh dựa trên sự hỗ trợ của máy tính cĩ thể hiểu như một sự chẩn đốn của bác sỹ kết hợp với kết quả phân tích nhũ ảnh của máy tính.
Tập mẫu gồm 683 vectơ ủặc trưng, ủược lấy từ website:
http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnosti c%29 của ba tác giả Dr.William H. Wolberg, W. Nick Street và Olvi L.Mangasarian
Mỗi vectơ ủặc trưng ủược tớnh toỏn từ ảnh chụp khối vỳ của một người. Mỗi vectơ cú 10 ủặc trưng quan trọng:
1 - Bỏn kớnh (Trung bỡnh cỏc khoảng cỏch từ trung tõm tới cỏc ủiểm nằm trờn biên).
2 - Texture (ðộ lệch chuẩn của cỏc trị số ủo mức ủộ xỏm trong ảnh).
3 - Chu vi.
4 - Diện tích.
5 - Tớnh trơn (sự biến thiờn của ủộ dài cỏc bỏn kớnh).
6 - Tính co cụm (bằng bình phương của chu vi chia cho diện tích trừ 1.0).
7 - Tớnh lừm (mức ủộ của cỏc phần lừm trờn bề mặt).
8 - Số lượng các phần lõm.
9 - Tớnh ủối xứng.
10 - Thứ nguyờn Fractal (Fractal dimension; ủường thẳng cú thứ nguyờn là 1;
ủường rớch rắc cú thứ nguyờn nhỏ hơn 1).
Mỗi vectơ mang một trong hai nhón 0 và 1, trong ủú 0 là “lành tớnh”, 1 là “ỏc tính”.
Xây dựng SVM phân loại 2 lớp như sau:
% Doc du lieu tu tep .data vao dulieu
dulieu=dlmread('breast-cancer-wisconsin.data');
% Lay toan bo cac dong, cot tu 2 den 10 --> thong tin ve cac mau data=dulieu(:,2:10);
% Lay thong tin ve nhom cua cac mau tren groups=dulieu(:,11);
% Chuyen group ve dang 0 tuong duong voi 2: lanh tinh % 1 tuong duong voi 4: ac tinh de tinh do chinh xac groupNews = (groups~=2);
% Chon ngau nhien khoang (1-lamda)*100% so phan tu trong de luyen % trong do groups la nhan tuong ung cua cac vecto hang data
train = crossvalind('holdOut',groupNews,0.1); %chon 90 data % Dua vao luyen --> buoc 1 cua SVM
% train la mot ma tran 1 cot va n dong --> cac phan tu la 0 va 1
% data(train,:) --> ma tran co*~ so dong khac khong cua % train, so cot = so cot cua data
svmStruct = svmtrain(data(train,:), groupNews(train),
'kernel_function','RBF', 'quadprog_opts', optimset('MaxIter',90000000));
% Phan lop voi mau moi % 2 hay 0: lanh tinh % 4 hay 1: ac tinh
test = ~train; % test nhung phan tu ko nam trong luyen tap TestSetX = data(test,:);
TestSetY = groupNews(test);
RsltSetG = svmclassify(svmStruct, TestSetX);
cp = classperf(groupNews); % chuyen ve lop moi de tinh do tin cay classes = svmclassify(svmStruct,data(train,:));
classperf(cp,classes,train);
disp([' Do chinh xac: ' num2str(cp.CorrectRate*100)]);
% Display the result itr = 1;
errCount = 0; % dung de dem so mau sai while(itr<=length(TestSetX))
disp([' x' num2str(itr) '=[' num2str(TestSetX(itr,:)) ']']);
disp([' Ket qua chuan doan: ' num2str(RsltSetG(itr)) '; Ket qua do duoc: ' num2str(TestSetY(itr)) ]);
if (RsltSetG(itr)~=TestSetY(itr)) errCount = errCount + 1;
end disp(' ');
itr = itr+1;
end
disp([' So ket qua chuan doan sai: ' num2str(errCount)]);
end
plot([1:length(TestSetY)], TestSetY, 'o'); hold on % Ve tren cung mot do thi plot([1:length(RsltSetG)], RsltSetG, '.r');
Khi chương trình chạy kết thúc, trong cửa sổ Workspace hiển thị một biến tên là svmStruct lưu giữ cỏc thụng tin về hàm phõn lớp, khi nhấn ủỳp chuột vào ủú ta sẽ thấy cửa sổ Variable Editor xuất hiện.
Hình 1-12. Màn hình hiển thị cấu trúc của biến svmStruct
Chẩn đố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 đố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 đốn cĩ 1 mẫu kết luận sai.
Chuẩn ủoỏn
Mẫu Dự đốn
Hình 1-14. Kết quả kiểm tra chéo SVM chẩn đố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ự đốn
Chuẩ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:
Hình 1-15. Ảnh mẫu biểu diễn số cần nhận dạng
Kết quả nhận dạng:
Hình 1-16. Kết quả nhận dạng sử dụng SVM phân loại 10 lớp