Chương 3: CHƯƠNG TRÌNH MINH HOẠ
3.1 Cài đặt thuật toán
Chương trình xây dựng bằng ngôn ngữ C# gồm các lớp sau:
Lớp Candidate:
Các thuộc tính:
public Item[] itemset;//Mảng các hạng mục public int numItem;//số hạng mục
public Double sup;//độ hỗ trợ bình thường
public Double warsup;//độ hỗ trợ có trọng số theo WAR public Double wsup;//độ hỗ trợ có trọng số theo lợi nhuận public double[] B;//Biên hỗ trợ trong Minwal
public double UB;// upper bound trong Minwal
public double usup;//độ hỗ trợ có trọng số theo FUFM
public List<double> listutil;//luu tru mang cac uti cua tạp hang muc trong cac giao dich ho tro tap hang muc nay, sử dụng trong FUFM
Các phương thức: Khởi tạo:
public Candidate(){}
public Candidate(int k){…}// khởi tạo tập ứng viên k hạng mục
public Candidate(Item[] pro){…}// khởi tạo ứng viên có tập hạng mục pro
Các phương thức khác:
So sánh tập ứng viên với một tập ứng viên ci, trả về tập hạng mục chứa ci, bằng ci hay cắt ci đồng thời đưa ra utility của tập hạng mục ci trong giao
dịch này nếu ci là tập con của giao dịch (sử dụng để kiểm tra độ hỗ trợ mở rộng của tập hạng mục trong FUFM).
public int Compare(Candidate ci, out double utility)//neu giao dich co chua hang muc thi dua ra do ho tro co trong so luon {//so sanh xem tap hang muc co chua ci khong
utility = 0;
int target=-1;//luu vi tri tim duoc ptu
if (itemset.Length < ci.itemset.Length) return CROSS;//nếu có ít item hơn thì nó không thể bao
for (int i = 0; i < ci.itemset.Length; i++)//xét tất cả các hạng mục của ci
{
bool findeach = false;
for (int j = target+1; j < itemset.Length; j++)// duyệt xem candidate có chứa từng item trong ci không
{
if (itemset[j].ma == ci.itemset[i].ma) {
findeach = true;//hang muc thu i da duoc tim thay
target=j;
j = itemset.Length;//de thoat khoi for j utility+= (double)itemset[i].num*ci.itemset[i].profit;
} } }
if (findeach == false) return CROSS; } if (ci.numItem==numItem) { return EQUAL; } else { return CONTAIN; } }
Ngoài ra còn các phương thức khác: compare (so sánh mà không đưa ra utility), Add ( thêm một hạng mục), Indexof (đưa ra chỉ số của hạng mục trong tập).
Lớp Item:
Các thuộc tính:
public int ma; public String ten;
public float num;// so luong trong giao dich
public float profit;// loi nhuan tren 1 don vi item public float l, u;//khoang trong so
Các phương thức khởi tạo: Item(), Item(ma): khởi tạo hạng mục có mã ma, Item(sma,sname,fprofit): khởi tạo hạng mục có mã, tên, trọng số
Lớp Hashtree:
Cấu trúc node của cây :
public struct node {
public int nodetype;//root=0;internal=1;leaf=2 public node[] hashtable;//luu cac bucket
public ArrayList itset;// luu cac tap hang muc trong mot node la
/* phương thức chuyển từ node lá thành node trong*/ public void Convert( int typetarget)
{
if (nodetype == 2 && typetarget == 1)//chuyen tu node la thanh node trong
hashtable = new node[49]; else itset = new ArrayList(); nodetype = typetarget;
}}; };
Các phương thức chính: Newnode (nodetype): tạo một node mới với kiểu xác định, hash (Candidate, level): băm phần tử thứ level của tập Candidate, insert(ref node, Candidate, level): insert một tập vào cây từ node ở mức level, Subset(node start, Item[] tran, int m, bool kept ): Hàm tìm các tập con của giao dịch tran, tăng biến count của các tập con là ứng cử viên (có thể tính cả utility của tập ứng viên, tuỳ từng giải thuật), đang ở node start, xét đến phần tử thứ m của giao dịch, trả về biến kept=true nếu giao dịch chứa ít nhất một tập ứng viên, fale nếu không chứa tập ứng viên nào (sẽ bị loại bỏ).
Cấu trúc của luật:
public Item[] vetrai;//vế trái của luật public Item[] vephai;//vế phải của luật public Double supp;//độ hỗ trợ
public Double conf;//độ tin cậy của luật
Frm Apriori: bao gồm các phương thức chính trong các giải thuật tìm tập phổ biến, tìm luật.
• Apriori(misup): tìm tập phổ biến bằng giải thuật Apriori với ngưỡng minsup cho trước. Trong đó có các thủ tục con:
GenSingleItemset(): tạo tập phổ biến 1 hạng mục
SelfJoin(Lk): tạo tập ứng viên k+1 hạng mục từ các tập phổ biến k hạng mục
Xây dựng cây băm từ các tập ứng viên k hạng mục và quét CSDL để tăng biến đếm cho các tập con ứng viên của các giao dịch: trong thủ tục này, thực hiện loại trừ luôn các giao dịch có số hạng mục ít hơn độ dài tập ứng viên và những giao dịch không chứa bất kỳ tập ứng viên nào.
for (int i = 0; i < templcandidate[k].Count; i++) {
Candidate can = (Candidate)templcandidate[k] [i];
tree.insert(ref tree.Root, can, 0); }
int j = 0;
while (j < DB_process.Count)//duyet CSDL {
keeptran = false;
Item[] current = DB_process[j]; int index = DB.IndexOf(current); if (current.Length < k + 1) { DB_process.RemoveAt(j); } else { if (tree.Subset(tree.Root, current, 0, keeptran)) { j++; } else DB_process.RemoveAt(j); } }
Kiểm tra chính xác độ trợ của các tập ứng viên để đưa ra các tập phổ biến.
• Các phương thức chính trong tạo luật kết hợp có trọng số lớn nhất từ tập phổ biến đã chọn:
CreatDenseBox: tạo các hộp đặc từ tập ứng viên
• Các phương thức chính trong tạo tập hạng mục có trọng số phổ biến bằng Minwal0:
SupportBound: tính các biên hỗ trợ của tập hạng mục
Wsupport: tính độ hỗ trợ có trọng số của các tập hạng mục
CountSupportList: tính count của các tập ứng viên (là thủ tục subset trong Apriori)
Thủ tục PruneW và Prune2W: tỉa các ứng viên
SelfjoinW : tương tự như trong Apri
Checking: kiểm tra chính xác độ hỗ trợ có trọng số của các ứng viên
• Các phương thức chính trong tạo tập hạng mục utility phổ biến bằng FUFM:
Tạo tập ứng viên bằng Apriori(như trên): nếu chỉ phục vụ cho Maxwar thì trong thủ tục subset sử dụng hàm compare không cần đưa ra utility của tập ứng viên trong giao dịch còn nếu dùng cho FUFM thì Apriori sử dụng hàm compare có đưa ra utility của tập ứng viên phục vụ cho pha tính độ hỗ trợ mở rộng để đưa ra tập ứng viên phổ biến