CHƯƠNG 3 PHÁT TRIỂN ỨNG DỤNG VÀ THỬ NGHIỆM
3.2. Xây dựng các hàm để hỗ trợ phân tích đánh giá
3.2.4. Xử lý dữliệu trên Matlab
3.2.4.1. Giới thiệu về Matlab
Matlab [11] là tên viết tắc của từ “Matrix Laboratory” là một phần mềm ứng dụng chạy trong môi trường windows do hãng Math Works sản xuất và cung cấp. Ban đầu Matlab được viết chỉ để phục vụ cho việc tính toán ma trận. Tuy nhiên trải qua thời gian dài nghiên cứu và phát triển, nó đã được phát triển thành một công cụ rất hữu ích và đồng thời cũng là một ngôn ngữ của kỹ thuật. Vì nó tích hợp các công cụ rất mạnh nhằm phục vụ tính toán, lập trình, thiết kế, mô phỏng,... trong môi trường và rất dễ sử dụng trong các bài toán và lời giải được biểu diễn theo những ký hiệu toán học quen thuộc.
Matlab cung cấp một họ các giải pháp theo hướng chuyên dụng hóa được gọi là các Toolbox. Các Toolbox cho phép người dùng có thể sử dụng học hoặc áp dụng các kỹ thuật chuyên dụng cho một lĩnh vực nào đó. Toolbox là một tập toàn diện các hàm của Matlab (M - file) nhằm cho phép mở rộng môi trường Matlab để giải các bài toán cụ thể.
Hình 3.1: Giao diện phần mềm Matlab
Đối với phần mềm Matlab giao diện của nó bao gồm một số thành phần chính sau.
Home: Chứa các công cụ cơ bản nhất của Matlab như tạo mới một scrip, mở một file mới, hay một app mới…
Apps: Cho phép người dùng truy cập nhanh vào các bộ Toolbox, hoặc phần Help của giao diện.
Command Window: Đây là cửa sổ làm việc chính của Matlab. Tại đây, chúng ta thực hiện toàn bộ việc nhập dữ liệu cũng như việc xuất kết quả sau khi tính toán. Dấu nháy >> này tức là báo hiệu chương trình đã sẵn sàng cho việc nhập dữ liệu. Tuy nhiên, việc nhập dữ liệu này kết thúc bằng cách nhấn phím Enter. Sau đó, Matlab sẽ thực thi dòng lệnh mà chúng ta đã nhập vào Command Window và nó sẽ trả kết quả đồng thời hiển thi trong Command Window.
Command History: Phần này sẽ thực hiện nhiệm vụ lưu lại tất cả các dòng lệnh mà chúng ta đã nhập vào trong Command Window. Đồng thời, ta có thể xem lại tất cả các lệnh bằng cách dùng scroll bar, hay thực hiện lại lệnh đó bằng cách nhấp kép lên chính dòng lệnh đó. Ngoài ra chúng ta còn có thể cut, paste hay delete các lệnh.
Workspace Browser: Trong Matlab các dữ liệu được lưu trong các biến. Workspace Browser sẽ liệt kê tất cả các biến mà chúng ta đang sử dụng trong Matlab. Nó cung cấp thông tin về kích thước và loại dữ liệu. Ta có thể truy cập trực tiếp vào dữ liệu bằng cách nhấn kép vào biến để hiển thị Array Editor.
Current Directory: Phần này với chức năng giúp chúng ta có thể xem lại các file trong thư mục hiện hành.
Tuy nhiên, hộp công cụ Logic mờ (The Fuzzy Logic Toolbox) là tổ hợp các hàm được xây dựng trên nền Matlab giúp cho việc thiết kế, mô phỏng, kiểm tra và hiệu chỉnh bộ điều khiển mờ một cách dễ dàng. Để thiết kế bộ điều khiển mờ trong hộp công cụ này ta có thể thực hiện thông qua dòng lệnh hoặc thông qua giao diện đồ họa. Trong đề tài này tôi sử dụng Command Window để viết các hàm xử lý dữ liệu cho bài toán.
Có thể nói, Matlab là bộ chương trình phần mềm lớn dành cho tính toán kỹ thuật. Chúng ta có thể sử dụng Matlab để thực hiện các công việc, chẳng hạn:
- Tính toán
- Phát triển thuật toán - Thu thập dữ liệu
- Mô hình và mô phỏng dữ liệu - Phân tích dữ liệu
- Vẽ đồ thị
- Giao diện đồ họa
3.2.4.2. Xây dựng các hàm để phân cụm
Sử dụng phần mềm MatLab tôi xây dựng các hàm hỗ trợ như sau :
- Hàm chuẩn bị dữ liệu : Hàm này chuyển dữ liệu dạng biến ngôn ngữ sang dạng số để chuẩn bị cho việc thực hiện thuật toán phân cụm.
clear ; close all; clc [~,~,dulieugoc] = xlsread("dulieu.xlsx"); HeSoTacPhong = 10/6; HeSoChuyenMon = 10/7; HeSoHieuQuaCongViec = 10/6; HeSoCongTacKhac = 10/7; HeSoChapHanhChuTruongQuyDinh = 10/5; HeSoThoiGianLamViec = 10/4; for i = 2:size(dulieugoc,1) %Tac phong switch(dulieugoc{i,2}) case 'guong mau'
dulieugoc{i,2} = 5*HeSoTacPhong; case 'chinh chu'
dulieugoc{i,2} = 4*HeSoTacPhong; case 'nghiem tuc'
dulieugoc{i,2} = 3*HeSoTacPhong; case 'tam'
dulieugoc{i,2} = 2*HeSoTacPhong; case 'chua nghiem tuc'
dulieugoc{i,2} = 1*HeSoTacPhong; end
%Chuyen mon
switch(dulieugoc{i,3}) case 'rat vung'
dulieugoc{i,3} = 6*HeSoChuyenMon; case 'vung' dulieugoc{i,3} = 5*HeSoChuyenMon; case 'tot' dulieugoc{i,3} = 4*HeSoChuyenMon; case 'dat' dulieugoc{i,3} = 3*HeSoChuyenMon; case 'hoc hoi them'
dulieugoc{i,3} = 2*HeSoChuyenMon; case 'chua dat'
dulieugoc{i,3} = 1*HeSoChuyenMon; end
%Hieu qua cong viec switch(dulieugoc{i,4}) case 'hieu qua cao'
dulieugoc{i,4} = 5*HeSoHieuQuaCongViec; case 'co hieu qua'
dulieugoc{i,4} = 4*HeSoHieuQuaCongViec; case 'hieu qua nhung chua cao'
dulieugoc{i,4} = 3*HeSoHieuQuaCongViec; case 'con thap'
dulieugoc{i,4} = 2*HeSoHieuQuaCongViec; case 'chua dat'
dulieugoc{i,4} = 1*HeSoHieuQuaCongViec; end
%Cong tac khac
switch(dulieugoc{i,5}) case 'xuat sac'
dulieugoc{i,5} = 6*HeSoCongTacKhac; case 'tham gia tot'
dulieugoc{i,5} = 5*HeSoCongTacKhac; case 'tich cuc'
dulieugoc{i,5} = 4*HeSoCongTacKhac; case 'hoan thanh'
case 'can chu y hon'
dulieugoc{i,5} = 2*HeSoCongTacKhac; case 'chua hoan thanh'
dulieugoc{i,5} = 1*HeSoCongTacKhac; end
%Chap hanh chu truong, quy dinh switch(dulieugoc{i,6})
case 'thuc hien rat tot'
dulieugoc{i,6} = 4*HeSoChapHanhChuTruongQuyDinh; case 'thuc hien nghiem tuc'
dulieugoc{i,6} = 3*HeSoChapHanhChuTruongQuyDinh; case 'chua nghiem tuc'
dulieugoc{i,6} = 2*HeSoChapHanhChuTruongQuyDinh; case 'con xem thuong'
dulieugoc{i,6} = 1*HeSoChapHanhChuTruongQuyDinh; end
%Thoi gian lam viec switch(dulieugoc{i,8}) case 'du'
dulieugoc{i,8} = 3*HeSoThoiGianLamViec; case 'con han che'
dulieugoc{i,8} = 2*HeSoThoiGianLamViec; case 'chua hoan thanh'
dulieugoc{i,8} = 1*HeSoThoiGianLamViec; end end if isfile('dulieudaxuly.xlsx') delete('dulieudaxuly.xlsx'); end xlswrite('dulieudaxuly.xlsx', dulieugoc);
- Hàm khởi tạo ma trận dữ liệu U : Hàm này dùng để khởi tạo ma trận phân hoạch mờ U
%% ========= Khoi Tao Matran U (cluster membership values) ======= function U = KhoiTaoMaTranU() global SoLuongDuLieu C; U = zeros(SoLuongDuLieu,C); for i = 1:SoLuongDuLieu for j = 1:C U(i,j) = (randi(101)-1); end U(i,:) = U(i,:)/sum(U(i,:)); end end
- Hàm tính lại tâm Cluster
%% ================= Tinh tam cum du lieu (clusters) function TamCluster = TinhTamClusters(U,data)
global m C;
TamCluster = zeros(C,size(data,2)); TamCluster = (U.^m)'*data./sum(U.^m)'; End
- Hàm update ma trận U : Cập nhật lại ma trận phân hoạch mờ U
%% ================= Update Matran U ==================== function U = UpdateMaTranU(TamCluster, data)
global C m SoLuongDuLieu; U = zeros(SoLuongDuLieu,C); for i = 1:SoLuongDuLieu for j = 1:C imt = 0; for k = 1:C
imt = imt + 1/norm(data(i,:) - TamCluster(k,:))^(2/(m-1)); end
U(i,j) = 1/(norm(data(i,:) - TamCluster(j,:))^(2/(m-1))*imt); end
end end
- Hàm xử lý chính main.m và đọc kết quả
clear ; close all; clc %% ==== CHU THICH ==== % m:
% C: so luong cum du lieu (cluster)
% U: ma tran xac dinh gia tri phu thuoc cua du lieu vao cluster (gia tri tu 0 - 1) [data,ten] = xlsread("dulieudaxuly.xlsx"); global m C SoLuongDuLieu; SoLuongDuLieu = size(data,1); %% ===== NHAP DU LIEU ====
m = 2; %fuzzy partition matrix exponent C = 5; %so luong cum du lieu
%Thuat toan se ket thuc khi vong lap dat gia tri toi da hoac su thay doi %cua ma tran U nho hon nguong cho phep
SoLuongVongLapToiDa = 500;
Nguong = 0.0001; %Nhap gia tri hoi tu toi da cua ma tran
%% ============================
U = KhoiTaoMaTranU(); U0 = U;
for i = 1:SoLuongVongLapToiDa
UK_1 = U; %Luu gia tri matran U k-1 truoc khi update TamCluster = TinhTamClusters(U,data);
J = ObjectiveFunction(U,data,TamCluster); U = UpdateMaTranU(TamCluster, data);
fprintf('Vong lap: %d. Gia tri Objective Function: %f\n',i,J); if norm(U-UK_1) < Nguong
break; end
end
%Tinh Tam cua cum du lieu voi ma tran U moi nhat TamCluster = TinhTamClusters(U,data);
%Tinh costfunction cua ma tran U moi nhat J = ObjectiveFunction(U,data,TamCluster);
%% Xuat ket qua ra file ketqua.xlsx ketqua = {};
for j = 1:C
ketqua{1,j*2-1} = sprintf('Nhom %d',j);
ketqua{1,j*2} = sprintf('Ty le thuoc nhom %d (%%)',j); ThanhVienNhom_j = find(U(:,j)' == max(U'));
for i = 1:length(ThanhVienNhom_j) ketqua{i+1,j*2-1} = ten{ThanhVienNhom_j(i)+1,1}; ketqua{i+1,j*2} = sprintf('%.2f',U(ThanhVienNhom_j(i),j)*100); end end if isfile('ketqua.xlsx') delete('ketqua.xlsx'); end xlswrite('ketqua.xlsx', ketqua);