Chương trình được xây dựng trên ngôn ngữ lập trình Visual C++ 6.0 theo phương pháp lập trình hướng đối tượng hoàn toàn, thực hiện thuật toán được trình bày trong Chương 2 phần 2.2.2.4. Chương trình có cấu trúc như sau: • Lớp các đối tượng CObj: classCObj { public: intFindTheBestAttribute(); intDelObject();
//hàm lấy thông tin về một đối tượng ởđầu danh sách.
intGetObject(int &iNAttribute,float *arrAttri);
//hàm thêm một đối ởđầu danh sách.
voidAddObject(intiNAttribute,float *arrAttr);
// sô thuộc tính của đối tượng.
intiNumberAttribute;
//mảng giá trị của các thuộc tính.
float *arrAttribute;
//con trỏđến đối tượng tiếp theo.
CObj *pntNext; CObj();
virtual ~CObj(); };
Mỗi biến thuộc lớp này lưu thông tin về một danh sách các đối tượng, tại mỗi nút lưu thông tin về một đối tượng, con trỏ pntNext là con trỏ chỉ đến đối tượng tiếp theo thuộc danh sách.
• Lớp siêu phẳng CHyperPlane:
Khai báo:
classCHyperPlane {
public:
floatfPower; //độ mạnh của siêu phẳng
// Thông tin về nhát cắt gồm thuộc tính iAttribute và giá trị nhát cắt trên thuộc tính đó fCut. floatfCut; intiAttribute; CHyperPlane(); virtual ~CHyperPlane(); };
Mỗi đối tượng thuộc lớp này chứa thông tin về một siêu phẳng. Môt siêu phẳng đặc trưng bởi 2 giá trị là iAttribute là tên thuộc tính được chọn và fCut là giá trị trên nhát cắt đó được chọn.
• Lớp tập giá trị của một thuộc tính CValueSet: classCValueSet { public: floatarrValue[1000]; intiNumberValue; CValueSet(); virtual ~CValueSet(); };
Mỗi đối tượng chứa thông tin về các giá trị của một thuộc tính được tính bằng hàm GetValueSet() trong lớp CDecisionTree sẽ được trình bày sau đây.
• Lớp cây quyết định CDecisionTree:
classCDecisionTree { public: // Các biến của lớp floatfValueDecision; CHyperPlanehypBest; CValueSetValueSetCurrent; CObj *pntObjects ;
CDecisionTree *pntLeft,*pntRight;
// Các hàm thực hiện trên các biến của lớp inttestObject(CObj *pntObj);
voidSinhLuat(char *strRule); voidMDAlgoritthm();
floatGetPower(floatfCut,intiAttribute); voidFindTheBestHyperPlane();
floatGetGain(intiAttribute); intFindTheBestAttri();
voidGetValueSet(intiAttribute);
intGetNumberObject(intiAttribute=0, floatfValue=0.0); floatGetEntropy(intiAttribute=0,floatfValueAttri=0); intDelObject();
voidAddObjects(intiNAttribute,float *arrAttr); CDecisionTree();
virtual ~CDecisionTree(); };
Mỗi đối tượng thuộc lớp này thể hiện một nút trong cây quyết định. Các biến thuộc lớp có ý nghĩa như sau:
Các biến:
− fValueDecisionlà một biến kiểu float lưu giá trị quyết định ở các nút
− hypBest là biến kiểu CHyperPlane lưu thông tin về siêu phẳng được chọn tại các nút trong của cây quyết định. Trong trường hợp là nút lá thì biến này không được xét đến.
− ValueSetCurrent là biến kiểu CValueSet lưu thông tin về tập giá trị
của thuộc tính tai thời điểm xét.
− Con trỏ pntObjects là biến kiểu CObj lưu thông tin về tập các đối tượng thuộc nút. Trong trường hợp là nút là thì con trỏ có giá trị NULL. − Hai con trỏ pntLeftvà pntRight là biến kiểu CDecisionTree chính là
2 nút con của nút hiện tại trong thuật toán.
Các hàm:
− testObject(CObj *pntObj) là hàm thực hiện kiểm tra xem đối tượng
pntObj có được phân lớp đúng theo cấy quyết định được tạo ra không.
− SinhLuat(char *strRule) thực hiện sinh luật dựa trên cây quyết định.
− MDAlgoritthm() đây là hàm thực hiện thuật toán chính.
− GetPower(float fCut,int iAttribute) là hàm trả về độ mạnh của siêu
phẳng.
− FindTheBestHyperPlane() là hàm tìm siêu phẳng tốt nhất.
− GetGain(int iAttribute) là hàm lấy độ đo thông tin của thuộc tính
iAttribute.
− FindTheBestAttri() là hàm tìm thuộc tính tốt nhất.
− GetValueSet(int iAttribute) là hàm lấy về tập giá trị của thuộc tính
iAttribute trả về biến ValueSet.
− GetNumberObject(int iAttribute=0, float fValue=0.0) trả về số đối
tượng thuộc nút tai thời điểm gọi.
− GetEntropy(int iAttribute=0,float fValueAttri=0) hàm tính Entropy.
− DelObject() thực hiện xoá một đối tượng thuộc pntObjects.
− AddObjects(int iNAttribute,float *arrAttr) thực hiện thêm một đối
tượng thuộc pntObjects.
Trong các hàm trên chú ý nhất là hàm MDAlgoritthm() là hàm thực hiện thuật toán.
voidCDecisionTree::MDAlgoritthm() {
. . . }
Chương trình được xây dựng để có thể chạy không chỉ trên bộ dữ liệu về bệnh tiểu đường mà còn có thể thực hiện khai phá luật trên cả những bộ dữ liệu khác chỉ cần thoả mãn những điều kiện sau đây:
− Giá trị của thuộc tính quyết định chỉ có 2 loại.
− Tệp dữ liệu phải có câu trúc như đã trình bày ở trên. Tuy nhiên, số thuộc tính có thể nhiều hơn hoặc ít hơn 9 thuộc tính.
Giao diện của chương trình:
Chương trình cho phép bạn lựa chọn giữa việc sinh luật hoặc là kiểm tra độ chính xác trong phân lớp của thuật toán. Để sư dụng bạn thực hiện các bước sau:
− Nhập tên file huấn luyện vào. − Nhập tên file dữ liệu kiểm thử.
− Ấn nút tạo cây để chương trình tạo cây quyết định.
− Ấn nút kiểm thử để chương trình thực hiện việc kiểm thử.