Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 136 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
136
Dung lượng
1,38 MB
Nội dung
ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC NÂNG CAO HIỆU NĂNG PHÂN LỚP DỮ LIỆU TRÊN CƠ SỞ CẢI TIẾN THUẬT TOÁN SVM LUẬN ÁN TIẾN SĨ KHOA HỌC MÁY TÍNH HUẾ - NĂM 2023 ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC NÂNG CAO HIỆU NĂNG PHÂN LỚP DỮ LIỆU TRÊN CƠ SỞ CẢI TIẾN THUẬT TOÁN SVM NGÀNH: KHOA HỌC MÁY TÍNH MÃ SỐ: 9.48.01.01 HUẾ - NĂM 2023 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM LỜI CAM ĐOAN Tôi xin cam đoan đề tài: "Nâng cao hiệu phân lớp liệu sở cải tiến thuật tốn SVM " cơng trình nghiên cứu riêng tôi, hướng dẫn PGS.TS Các số liệu sử dụng luận án trung thực Các thuật tốn đề xuất hồn tồn mới, kết thực nghiệm thực liệu khách quan Những kết luận án cơng bố cơng trình liên quan đến luận án Nghiên cứu sinh i Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM LỜI CẢM ƠN Luận án trở thành thực ủng hộ giúp đỡ tri thức lẫn tinh thần nhiều người quan trọng đời tơi Tơi xin bày tỏ lịng biết ơn sâu sắc đến quý Thầy, Cô khoa Công nghệ Thơng tin khoa Tốn trường Đại học Khoa học, Đại học Huế, trường Đại học Sư phạm, Đại học Huế, người dạy không kiến thức mà cịn thái độ sống từ tơi tới Huế, đến mai sau Xin chân thành cảm ơn phòng đào tạo sau Đại học trường Đại học Khoa học, Đại học Huế hướng dẫn tận tình thủ tục cần thiết để tơi hồn thành hồ sơ Khoa học Xin cảm ơn thành phố Huế, nơi đặc biệt tơi hành trình học làm người Xin cảm ơn tất anh, em bạn bè sống Huế Xin cảm ơn khoa Cơ trường Sĩ quan Thông tin tạo điều kiện mặt thời gian để tơi hồn thành trình học tập nghiên cứu Nhân dịp này, xin chân thành cảm ơn tất người gia đình tơi, ln ủng hộ vật chất lẫn tinh thần động viên lúc khó khăn Đặc biệt, tơi xin bày tỏ lịng biết ơn sâu sắc tới thầy , người trực tiếp hướng dẫn từ dấu chấm câu đến tổng thể, giúp tơi có góc nhìn đắn khoa học làm khoa học Tôi xin chân thành cảm ơn gia đình thầy ln hỗ trợ mặt để tơi có điều kiện tốt làm việc với thầy Làm luận án hành trình dài với nhiều cung bậc cảm xúc, q trình khiến tơi trở nên khiêm nhường, biết ơn có người gặp Dành cho biết đến đề tài động viên cho tôi, xin cảm ơn! ii MỤC LỤC Lời cam đoan i Lời cảm ơn ii Danh mục ký hiệu v Danh mục bảng biểu vii Danh mục hình vẽ viii Mở đầu Chương Cơ sở toán học SVM 1.1 Hàm toàn phương 1.2 Bài toán quy hoạch toàn phương (QP) 1.3 Điều kiện tối ưu toán QP 1.4 Bài toán đối ngẫu 1.5 Bài toán phân lớp liệu 11 1.6 Hàm phân lớp tuyến tính 12 1.7 Siêu phẳng lề mềm 16 1.8 Hàm phân lớp phi tuyến 18 1.9 Hàm phân lớp có trọng số 20 1.10 Tiểu kết chương 21 Chương Các biến thể SVM 22 2.1 SVM xấp xỉ (PSVM) 23 2.2 PSVM thông qua trị riêng suy rộng (GEPSVM) 26 2.3 SVM song sinh (TSVM) 28 2.3.1 Trường hợp tuyến tính 28 2.3.2 Trường hợp phi tuyến 31 2.4 TSVM dùng bình phương tối thiểu (LSTSVM) 32 2.5 SVM song sinh có cấu trúc (S-TSVM) 34 2.6 Tiểu kết chương 40 Chương Phương pháp lớp đối cụm 3.1 SVM có cấu trúc có trọng số (WS-SVM) iii 41 41 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM 3.2 3.3 3.1.1 Trường hợp tuyến tính 44 3.1.2 Trường hợp phi tuyến 47 3.1.3 Thực nghiệm 50 3.1.3.1 Tập liệu giả chiều 50 3.1.3.2 Các tập liệu UCI 52 Cải tiến SVM dùng bình phương tối thiểu (ILS-SVM) 57 3.2.1 Trường hợp tuyến tính 58 3.2.2 Trường hợp phi tuyến 60 3.2.3 Thực nghiệm 63 3.2.3.1 Tập liệu giả chiều 63 3.2.3.2 Các tập liệu UCI 64 Tiểu kết chương 69 Chương Phương pháp cụm đối lớp 70 4.1 Biến đổi S-TSVM 70 4.2 SVM dùng bình phương tối thiểu có trọng số (WLS-SVM) 72 4.2.1 Trường hợp tuyến tính 75 4.2.2 Trường hợp phi tuyến 77 Thực nghiệm 80 4.3.1 Tập liệu giả chiều 81 4.3.2 Các tập liệu UCI 82 Tiểu kết chương 87 4.3 4.4 Kết luận 88 Danh mục cơng trình khoa học tác giả liên quan đến luận án 90 Tài liệu tham khảo 91 Phụ lục 96 iv Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM DANH MỤC CÁC KÝ HIỆU Ký hiệu Diễn giải ý nghĩa SVM Support Vector Machine PSVM SVM xấp xỉ (Proximal Support Vector Machine) GEPSVM SVM xấp xỉ thông qua trị riêng suy rộng (Proximal Support Vector Machine via Generalized Eigenvalues) TSVM SVM song sinh (Twin Support Vector Machine) LSTSVM SVM song sinh dùng bình phương tối thiểu (Least Square Twin Support Vector Machine) S-TSVM SVM song sinh có cấu trúc (Structural Twin Support Vector Machine) WS-SVM SVM có cấu trúc có trọng số (Weighted Structural - Support Vector Machine) ILS-SVM Cải tiến SVM dùng bình phương tối thiểu (Improvement Least Square - Suport Vector Machine) WLS-SVM SVM dùng bình phương tối thiểu có trọng số (Weighted Least Square - Support Vector Machine) CV Đánh giá chéo (Cross validation) SMW Công thức giảm chiều ma trận nghịch đảo Sherman-MorisonWoodbury SLEs Hệ phương trình tuyến tính (Systems of Linear Equations) KKT Hệ điều kiện Karush - Kuhn - Tucker QP Quy hoạch toàn phương (Quadratic programming) ∥x∥ Chuẩn Euclide véc-tơ x v Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM Ký hiệu Diễn giải ý nghĩa a, b, Chữ thường biểu diễn số w, x, Chữ thường đậm véc-tơ cột C, A, Chữ hoa đậm ma trận P(X, f ) Bài toán tối ưu tổng quát với hàm mục tiêu f tập ràng buộc X B(¯ x, ϵ) ¯ bán kính ϵ Hình cầu mở tâm x sgn Hàm xác định dấu ∇Q(x) Gradient hàm Q(x) ∇2 Q(x) Hessian hàm Q(x) T Chuyển vị ma trận hay véc-tơ P Ma trận hiệp phương sai ma trận A wT x Tích vơ hướng véc-tơ w véc-tơ x f(w,b) (x) Hàm phân lớp S(w,b) Mặt định A vi Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM DANH MỤC BẢNG BIỂU 3.1 Thời gian huấn luyện WS-SVM với kernel tuyến tính 52 3.2 Thời gian huấn luyện WS-SVM với kernel phi tuyến 52 3.3 WS-SVM tuyến tính liệu nhỏ UCI 54 3.4 WS-SVM tuyến tính liệu lớn UCI 55 3.5 WS-SVM phi tuyến liệu UCI 56 3.6 Thời gian huấn luyện ILS-SVM với kernel tuyến tính 63 3.7 Thời gian huấn luyện ILS-SVM với kernel phi tuyến 64 3.8 ILS-SVM tuyến tính liệu nhỏ UCI 66 3.9 ILS-SVM tuyến tính liệu lớn UCI 67 3.10 ILS-SVM phi tuyến liệu UCI 68 4.1 Thời gian huấn luyện WLS-SVM với kernel tuyến tính 81 4.2 Thời gian huấn luyện WLS-SVM với kernel phi tuyến 82 4.3 WLS-SVM tuyến tính liệu nhỏ UCI 84 4.4 WLS-SVM tuyến tính liệu lớn UCI 85 4.5 WLS-SVM phi tuyến liệu UCI 86 vii Nâng cao hiệu phân lớp liệu sở cải tiến thuật tốn SVM DANH MỤC HÌNH VẼ 1.1 Mặt định phi tuyến 12 1.2 Mặt định tuyến tính 12 1.3 Mặt định tắc 13 1.4 Siêu phẳng lề mềm 16 1.5 Dữ liệu phi tuyến 18 1.6 Dữ liệu phi tuyến không gian 18 2.1 SVM lề mềm 24 2.2 SVM xấp xỉ (PSVM) 25 2.3 PSVM thông qua trị riêng suy rộng (GEPSVM) 27 2.4 SVM song sinh (TSVM) 29 2.5 LSTSVM 33 2.6 Độ chi tiết cấu trúc 35 2.7 TSVM có cấu trúc (S-TSVM) 37 3.1 S-TSVM 42 3.2 WS-SVM 43 3.3 Dữ liệu giả chiều 51 3.4 ILS-SVM 58 4.1 S-TSVM trường hợp liệu có cấu trúc đơn giản 72 4.2 S-TSVM trường hợp liệu có cấu trúc phức tạp 73 4.3 WLS-SVM trường hợp liệu có cấu trúc đơn giản 74 4.4 WLS-SVM trường hợp liệu có cấu trúc phức tạp 75 viii Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM sigmaB_j = self.sigma(self.Z_B[j],self.C) sigma_B += sigmaB_j zer_0 = np.zeros((I.shape[0]-1,1)) zer_1 = np.zeros((1,I.shape[0])) F_ = np.hstack((sigma_B, zer_0)) F = np.vstack((F_, zer_1)) # WB, bB self.WB = [] self.bB = [] for i in range(self.k): mAi = self.Z_A[i].shape[0] eAi = np.ones((mAi, 1)) if self.kernel == None: H_i = np.hstack((self.Z_A[i], eAi)) else: H_i = np.hstack((self.transform(self.Z_A[i],self.C),eAi)) K = matrix(H_i.dot(np.linalg.inv(GB.T.dot(GB)+ self.c3 * F + self.c2*I)).dot(H_i.T)) q = matrix((-eAi)) G = matrix(np.vstack((-np.eye(mAi), np.eye(mAi)))) h = matrix(np.vstack((np.zeros((mAi,1)), self.c4*np.ones((mAi,1))))) solvers.options[’show_progress’] = False sol = solvers.qp(K, q, G, h) gam = np.array(sol[’x’]) self.zi = np.linalg.inv(GB.T.dot(GB)+ self.c3*F + self.c2*I).dot(H_i.T).dot(gam) wi = self.zi[:-1] bi = self.zi[-1] self.WB.append(wi) self.bB.append(bi) #WA, bA self.WA = [] self.bA = [] for j in range(self.l): 112 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM mBj = self.Z_B[j].shape[0] eBj = np.ones((mBj, 1)) if self.kernel==None: G_j = np.hstack((self.Z_B[j], eBj)) else: G_j = np.hstack((self.transform(self.Z_B[j],self.C),eBj)) K = matrix(G_j.dot(np.linalg.inv(HA.T.dot(HA)+ self.c3*J + self.c2*I)).dot(G_j.T)) q = matrix(-eBj) G = matrix(np.vstack((-np.eye(mBj),np.eye(mBj)))) h = matrix(np.vstack((np.zeros((mBj,1)), self.c1*np.ones((mBj,1))))) solvers.options[’show_progress’] = False sol = solvers.qp(K, q, G, h) alpha = np.array(sol[’x’]) self.zj = -np.linalg.inv(HA.T.dot(HA)+ self.c3*J + self.c2*I).dot(G_j.T).dot(alpha) wj = self.zj[:-1] bj = self.zj[-1] self.WA.append(wj) self.bA.append(bj) def signum(self,X): return np.ravel(np.where(X>=0,1,-1)) def project(self,X): scoreA = np.zeros(X.shape[0]) scoreB = np.zeros(X.shape[0]) if self.kernel== None: for j in range(self.l): scoreAj = ((self.Z_B[j].shape[0])/self.m_B)*np.abs(np.dot(X, self.WA[j]) + self.bA[j]).ravel() scoreA += scoreAj for i in range(len(self.WB)): scoreBi = ((self.Z_A[i].shape[0])/self.m_B)*np.abs(np.dot(X, self.WB[i]) + self.bB[i]).ravel() scoreB += scoreBi 113 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM else: for j in range(len(self.WA)): scoreAj = np.zeros(X.shape[0]) for m in range(X.shape[0]): sA=0 for zj, ct in zip(self.WA[j], self.C): sA += self.kf[self.kernel](X[m],ct)*zj scoreAj[m] = sA scoreAj = ((self.Z_B[j].shape[0])/self.m_B)*np.abs(scoreAj + self.bA[j]) scoreA += scoreAj for i in range(len(self.WB)): scoreBi = np.zeros(X.shape[0]) for m in range(X.shape[0]): sB=0 for zi, ct in zip(self.WB[i], self.C): sB += self.kf[self.kernel](X[m],ct)*zi scoreBi[m] = sB scoreBi = ((self.Z_A[i].shape[0])/self.m_A)*np.abs(scoreBi + self.bB[i]) scoreB += scoreBi score = scoreB - scoreA return score def predict(self,X): return self.signum(self.project(X)) def score(self, X, y): return 100*np.mean(self.predict(X)==y) Cải tiến SVM dùng bình phương tối thiểu (ILS-SVM) Chương trình cài đặt thuật toán ILS-SVM, Mục 3.2, Chương from scipy.cluster.hierarchy import linkage from scipy.cluster.hierarchy import fcluster 114 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM import numpy as np from sklearn.base import BaseEstimator class ILS_SVM(BaseEstimator): def init (self, kernel = None,polyconst =1,degree=2,gamma = 1,c1=None,c2=None,c3=None, c4 = None): self.kernel = kernel self.polyconst = float(polyconst) self.degree = degree self.gamma = float(gamma) self.c1 = c1 self.c2 = c2 self.c3 = c3 self.c4 = c4 if self.c1 is not None: self.c1 = float(self.c1) if self.c2 is not None: self.c2 = float(self.c2) if self.c3 is not None: self.c3 = float(self.c3) if self.c4 is not None: self.c4 = float(self.c4) self.kf = {’linear’:self.linear, ’polynomial’:self.polynomial, ’rbf’:self.rbf} self.k = None self.l = None def linear(self, x, y): return np.dot(x.T, y) def polynomial(self, x, y): return (self.polyconst + np.dot(x.T, y))**self.degree def rbf(self,x,y): return np.exp(-1.0*self.gamma*np.dot(np.subtract(x, y).T, np.subtract(x, y))) def transform(self, X, C): K = np.zeros((X.shape[0],C.shape[0])) for i in range(X.shape[0]): for j in range(C.shape[0]): K[i,j] = self.kf[self.kernel](X[i],C[j]) return K 115 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM def cluster(self, X, y): A = X[np.where(y!=-1)] B = X[np.where(y==-1)] L_A = linkage(A, ’ward’) L_B = linkage(B, ’ward’) last_A = L_A[-10:, 2] last_B = L_B[-10:, 2] acceleration_A = np.diff(last_A, 2) acceleration_rev_A = acceleration_A[::-1] acceleration_B = np.diff(last_B, 2) acceleration_rev_B = acceleration_B[::-1] k = acceleration_rev_A.argmax() + l = acceleration_rev_B.argmax() + clusters_A = fcluster(L_A, k, criterion=’maxclust’) clusters_B = fcluster(L_B, l, criterion=’maxclust’) self.labels_A = np.unique(clusters_A) Z_A = [] if k != 1: for i in range(k): Ai = A[np.where(clusters_A == self.labels_A[i])] Z_A.append(Ai) else: Z_A.append(A) self.labels_B = np.unique(clusters_B) Z_B = [] if l != 1: for j in range(l): Bj = B[np.where(clusters_B == self.labels_B[j])] Z_B.append(Bj) else: Z_B.append(B) return k, l, Z_A, Z_B def fit(self, X, y): self.k, self.l, self.Z_A, self.Z_B = self.cluster(X, y) 116 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM A = X[np.where(y!=-1)] B = X[np.where(y==-1)] self.C = np.vstack((A,B)) n = X.shape[1] m = X.shape[0] self.m_A = A.shape[0] e_A = np.ones((self.m_A, 1)) IA = np.identity(self.m_A) self.m_B = B.shape[0] e_B = np.ones((self.m_B, 1)) IB = np.identity(self.m_B) if self.kernel == None: HA = np.hstack((A, e_A)) GB = np.hstack((B, e_B)) I = np.identity(n+1) else: HA = np.hstack((self.transform(A,self.C),e_A)) GB = np.hstack((self.transform(B,self.C),e_B)) I = np.identity(m+1) Y = (self.c1/self.c2)*I (self.c1/self.c2)*HA.T.dot(np.linalg.inv(self.c2*IA + HA.dot(HA.T))).dot(HA) Z = (self.c3/self.c4)*I (self.c3/self.c4)*GB.T.dot(np.linalg.inv(self.c4*IB + GB.dot(GB.T))).dot(GB) # class B self.WB = [] self.bB = [] for i in range(self.k): mAi = self.Z_A[i].shape[0] eAi = np.ones((mAi, 1)) IAi = np.identity(mAi) if self.kernel == None: H_i = np.hstack((self.Z_A[i], eAi)) 117 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM self.zi = np.linalg.inv(H_i.T.dot(H_i) + (1/self.c3)*GB.T.dot(GB) + (self.c4/self.c3)*I).dot(H_i.T).dot(eAi) else: H_i = np.hstack((self.transform(self.Z_A[i],self.C), eAi)) self.zi = (Z - Z.dot(H_i.T).dot(np.linalg.inv(IAi + H_i.dot(Z).dot(H_i.T))).dot(H_i).dot(Z)).dot(H_i.T).dot(eAi) bi = self.zi[-1] wi = self.zi[:-1] self.WB.append(wi) self.bB.append(bi) # class A self.WA = [] self.bA = [] for j in range(self.l): mBj = self.Z_B[j].shape[0] eBj = np.ones((mBj, 1)) IBj = np.identity(mBj) if self.kernel == None: G_j = np.hstack((self.Z_B[j], eBj)) self.zj = np.linalg.inv(G_j.T.dot(G_j) + (1/self.c1)*HA.T.dot(HA) + (self.c2/self.c1)*I).dot(G_j.T).dot(eBj) else: G_j = np.hstack((self.transform(self.Z_B[j],self.C), eBj)) self.zj = (Y - Y.dot(G_j.T).dot(np.linalg.inv(IBj + G_j.dot(Y).dot(G_j.T))).dot(G_j).dot(Y)).dot(G_j.T).dot(eBj) wj = self.zj[:-1] bj = self.zj[-1] self.WA.append(wj) self.bA.append(bj) def signum(self,X): return np.ravel(np.where(X>=0,1,-1)) def project(self,X): 118 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM scoreA = np.zeros(X.shape[0]) scoreB = np.zeros(X.shape[0]) score_arrayA = np.zeros((self.l,X.shape[0])) score_arrayB = np.zeros((self.k,X.shape[0])) if self.kernel== None: for i in range(self.k): scoreBi = ((self.Z_A[i].shape[0])/(self.m_A))*(np.dot(X,self.WB[i]) + self.bB[i]).ravel() score_arrayB[i] = scoreBi scoreB = np.sum(score_arrayB, axis = 0) for j in range(self.l): scoreAj = ((self.Z_B[j].shape[0])/(self.m_B))*(np.dot(X, self.WA[j]) + self.bA[j]).ravel() score_arrayA[j] = scoreAj scoreA = np.sum(score_arrayA, axis = 0) else: for i in range(self.k): scoreBi = np.zeros(X.shape[0]) for j in range(X.shape[0]): sB=0 for vi, ct in zip(self.WB[i], self.C): sB += self.kf[self.kernel](X[j],ct)*vi scoreBi[j] = sB + self.bB[i] scoreB += ((self.Z_A[i].shape[0])/(self.m_A))*scoreBi for j in range(self.l): scoreAj = np.zeros(X.shape[0]) for i in range(X.shape[0]): sA=0 for uj, ct in zip(self.WA[j], self.C): sA += self.kf[self.kernel](X[i],ct)*uj scoreAj[i] = sA + self.bA[j] scoreA += ((self.Z_B[j].shape[0])/(self.m_B))*scoreAj score = scoreB - scoreA 119 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM return score def predict(self,X): return self.signum(self.project(X)) def score(self, X, y): return 100*np.mean(self.predict(X)==y) SVM dùng bình phương tối thiểu có trọng (WLS-SVM) Chương trình cài đặt thuật toán WLS-SVM, Mục 4.2, Chương from scipy.cluster.hierarchy import linkage from scipy.cluster.hierarchy import fcluster import numpy as np from sklearn.base import BaseEstimator class WLS_SVM(BaseEstimator): def init (self, kernel = None,polyconst =1,degree=2,gamma = 1,c1=None,c2=None,c3=None, c4 = None): self.kernel = kernel self.polyconst = float(polyconst) self.degree = degree self.gamma = float(gamma) self.c1 = c1 self.c2 = c2 self.c3 = c3 self.c4 = c4 if self.c1 is not None: self.c1 = float(self.c1) if self.c2 is not None: self.c2 = float(self.c2) if self.c3 is not None: self.c3 = float(self.c3) if self.c4 is not None: self.c4 = float(self.c4) self.kf = {’linear’:self.linear, ’polynomial’:self.polynomial, ’rbf’:self.rbf} self.k = None self.l = None def linear(self, x, y): 120 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM return np.dot(x.T, y) def polynomial(self, x, y): return (self.polyconst + np.dot(x.T, y))**self.degree def rbf(self,x,y): return np.exp(-1.0*self.gamma*np.dot(np.subtract(x,y).T,np.subtract(x,y))) def transform(self, X, C): K = np.zeros((X.shape[0],C.shape[0])) for i in range(X.shape[0]): for j in range(C.shape[0]): K[i,j] = self.kf[self.kernel](X[i],C[j]) return K def cluster(self, X, y): A = X[np.where(y!=-1)] B = X[np.where(y==-1)] L_A = linkage(A, ’ward’) L_B = linkage(B, ’ward’) last_A = L_A[-10:, 2] last_B = L_B[-10:, 2] acceleration_A = np.diff(last_A, 2) acceleration_rev_A = acceleration_A[::-1] acceleration_B = np.diff(last_B, 2) acceleration_rev_B = acceleration_B[::-1] k = acceleration_rev_A.argmax() + l = acceleration_rev_B.argmax() + clusters_A = fcluster(L_A, k, criterion=’maxclust’) clusters_B = fcluster(L_B, l, criterion=’maxclust’) self.labels_A = np.unique(clusters_A) Z_A = [] if k != 1: for i in range(k): Ai = A[np.where(clusters_A == self.labels_A[i])] Z_A.append(Ai) else: 121 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM Z_A.append(A) self.labels_B = np.unique(clusters_B) Z_B = [] if l != 1: for j in range(l): Bj = B[np.where(clusters_B == self.labels_B[j])] Z_B.append(Bj) else: Z_B.append(B) return k, l, Z_A, Z_B def fit(self, X, y): self.k, self.l, self.Z_A, self.Z_B = self.cluster(X, y) A = X[np.where(y!=-1)] B = X[np.where(y==-1)] self.C = np.vstack((A,B)) n = A.shape[1] m = self.C.shape[0] self.m_A = A.shape[0] e_A = np.ones((self.m_A, 1)) IA = np.identity(self.m_A) self.m_B = B.shape[0] e_B = np.ones((self.m_B, 1)) IB = np.identity(self.m_B) if self.kernel == None: HA = np.hstack((A, e_A)) GB = np.hstack((B, e_B)) I = np.identity(n+1) else: HA = np.hstack((self.transform(A,self.C),e_A)) GB = np.hstack((self.transform(B,self.C),e_B)) I = np.identity(m+1) # class A self.WA = [] self.bA = [] 122 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM for i in range(self.k): mAi = self.Z_A[i].shape[0] eAi = np.ones((mAi, 1)) IAi = np.identity(mAi) if self.kernel == None: H_i = np.hstack((self.Z_A[i], eAi)) self.zi = np.linalg.inv((1/self.c1)*H_i.T.dot(H_i) + GB.T.dot(GB) + (self.c2/self.c1)*I).dot(GB.T).dot(e_B) else: H_i = np.hstack((self.transform(self.Z_A[i],self.C), eAi)) Y = (self.c1/self.c2)*I (self.c1/self.c2)*H_i.T.dot(np.linalg.inv(self.c2*IAi + H_i.dot(H_i.T))).dot(H_i) self.zi = (Y - Y.dot(GB.T).dot(np.linalg.inv(IB + GB.dot(Y).dot(GB.T))).dot(GB).dot(Y)).dot(GB.T).dot(e_B) bi = self.zi[-1] wi = self.zi[:-1] self.WA.append(wi) self.bA.append(bi) # class B self.WB = [] self.bB = [] for j in range(self.l): mBj = self.Z_B[j].shape[0] eBj = np.ones((mBj, 1)) IBj = np.identity(mBj) if self.kernel == None: G_j = np.hstack((self.Z_B[j], eBj)) self.zj = np.linalg.inv((1/self.c3)*G_j.T.dot(G_j) + HA.T.dot(HA) + (self.c4/self.c3)*I).dot(HA.T).dot(e_A) else: G_j = np.hstack((self.transform(self.Z_B[j],self.C), eBj)) Z = (self.c3/self.c4)*I (self.c3/self.c4)*G_j.T.dot(np.linalg.inv(self.c4*IBj + 123 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM G_j.dot(G_j.T))).dot(G_j) self.zj = (Z - Z.dot(HA.T).dot(np.linalg.inv(IA + HA.dot(Z).dot(HA.T))).dot(HA).dot(Z)).dot(HA.T).dot(e_A) wj = self.zj[:-1] bj = self.zj[-1] self.WB.append(wj) self.bB.append(bj) def signum(self,X): return np.ravel(np.where(X>=0,1,-1)) def project(self,X): scoreA = np.zeros(X.shape[0]) scoreB = np.zeros(X.shape[0]) score_arrayA = np.zeros((self.k,X.shape[0])) score_arrayB = np.zeros((self.l,X.shape[0])) if self.kernel== None: for i in range(self.k): scoreAi = ((self.Z_A[i].shape[0])/(self.m_A))*(np.dot(X,self.WA[i]) + self.bA[i]).ravel() score_arrayA[i] = scoreAi scoreA = np.sum(score_arrayA, axis = 0) for j in range(self.l): scoreBj = ((self.Z_B[j].shape[0])/(self.m_B))*(np.dot(X, self.WB[j]) + self.bB[j]).ravel() score_arrayB[j] = scoreBj scoreB = np.sum(score_arrayB, axis = 0) else: for i in range(self.k): scoreAi = np.zeros(X.shape[0]) for j in range(X.shape[0]): sA=0 for uj, ct in zip(self.WA[i], self.C): sA += self.kf[self.kernel](X[j],ct)*uj scoreAi[j] = sA + self.bA[i] 124 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM scoreA += ((self.Z_A[i].shape[0])/(self.m_A))*scoreAi for i in range(self.l): scoreBi = np.zeros(X.shape[0]) for j in range(X.shape[0]): sB=0 for vj, ct in zip(self.WB[i], self.C): sB += self.kf[self.kernel](X[j],ct)*vj scoreBi[j] = sB + self.bB[i] scoreB += ((self.Z_B[i].shape[0])/(self.m_B))*scoreBi score = scoreB - scoreA return score def predict(self,X): return self.signum(self.project(X)) def score(self, X, y): return 100*np.mean(self.predict(X)==y) Áp dụng thuật toán với tập liệu UCI Phần chương trình thu thập xử lí tập liệu từ UCI, sau áp dụng thuật tốn để có kết bảng phần thực nghiệm Chương Chương Ở đầu chương trình khai báo thư viện sau: import pandas as pd import numpy as np from sklearn.model_selection import train_test_split import time Phần chương trình tải xử lý tập liệu đưa lên nguồn lưu trữ mở GitHub, đường dẫn sau: https://github.com/makeho8/datasets-from-UCI Chuẩn hóa liệu theo minmax scale from sklearn.preprocessing import MinMaxScaler mms = MinMaxScaler() 125 Nâng cao hiệu phân lớp liệu sở cải tiến thuật toán SVM AB_train_mms = mms.fit_transform(AB_train) AB_test_mms = mms.transform(AB_test) Sau bước trên, áp dụng thuật tốn với tập liệu để thu kết phần thực nghiệm Chương Chương Chẳng hạn với thuật tốn ILS-SVM tuyến tính 3.3 ta làm sau: from ILS_SVM_class import ILS_SVM start_time = time.time() clf_ils = ILS_SVM(c1 = 1, c2 = 0.0001, c3 = 1, c4 = 0.0001) from sklearn.model_selection import cross_val_score from sklearn.model_selection import GridSearchCV param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0] param_grid_ils = [{’c1’: param_range, ’c2’: param_range, ’c3’: param_range, ’c4’: param_range}] gs_ils = GridSearchCV(estimator = clf_ils, param_grid = param_grid_ils, scoring = ’accuracy’, cv = 10, n_jobs = -1) gs_ils = gs_ils.fit(AB_train_mms, y_train) print(’best params of ILS_SVM’, gs_ils.best_params_) clf_ils = gs_ils.best_estimator_ clf_ils.fit(AB_train_mms, y_train) print(’Test accuracy of ILS_SVM: %.1f’ % clf_ils.score(AB_test_mms, y_test)) scores = cross_val_score(estimator = clf_ils, X = AB_train_mms, y = y_train, cv = 10, n_jobs = -1) print(’CV accuracy of ILS_SVM: %.1f +/- %.1f’ % (np.mean(scores), np.std(scores))) end_time = time.time() print(’Total runtime of ILS_SVM: %.3f’ %((end_time - start_time))) Với ILS-SVM phi tuyến 3.4 ta việc thay hai dòng code: clf_ils = ILS_SVM(kernel = ’RBF’, c1 = 1, c2 = 1, c3 = 1, c4 = 1) param_grid_ils = [{’c1’: param_range, ’c3’: param_range, ’gamma’: param_range}] 126