Thuật toán Partition (kỹ thuật BFS và giao tập hợp của các tập mục)

Một phần của tài liệu Áp dụng luật kết hợp trong khai phá dữ liệu cho dữ liệu ngân hàng đầu tư và phát triển việt nam (Trang 41)

Thuật toán Partition là thuật toán tựa Apriori dùng tập giao để xác định giá trị hỗ trợ, như đã trình bày ở trên thuật toán Apriori xác định giá trị hỗ trợ của tất cả k-1 ứng cử viên trước khi tính k ứng cử viên.

Bài toán đặt ra là thuật toán Partition muốn dùng tidlist của tập phổ biến (k- 1) item để phát sinh ra tidlist của k ứng cử viên. Cần quan tâm trước thuật toán này là kích thước phát sinh của các kết quả trên sẽ vượt quá giới hạn của bộ nhớ vật lý của các máy tính thông thường. Để giải quyết vấn đề này thuật toán Partition chia CSDL thành nhiều phần và chúng được xử lý độc lập nhau. Kích thước của mỗi phần được chọn như cách thức của tidlist được lưu trên bộ nhớ chính. Sau khi xác

định tập phổ biến cho mỗi phần của CSDL, cần phải có một thao tác duyệt lại toàn bộ CSDL để bảo đảm rằng tập phổ biến cục bộ cũng là tập phổ biến toàn cục.

Để hiểu rõ hơn thuật Partition xem xét thêm một số cải tiến mới của thuật Partition sau:

+ Cải tiến 1:

Bắt đầu việc phân chia dữ liệu thành n thành phần. Tại mỗi phần của CSDL thuật Partition phải duyệt qua toàn bộ cấu trúc dữ liệu con trỏ chứa tập mục. Cấu trúc này được tổ chức theo từng mức càng sâu thì càng lớn tập mục phổ biến. Thủ tục Gen_Large_ItemSet_Base(p, nSup) thực hiện từng bước tỉa dựa theo các thuộc tính được sử dụng trong Apriori để chế ngự trong không gian tìm kiếm. Thủ tục Gen_LargeItemSet xem xét từng pi và đưa vào để xác định tập mục phổ biến cục bộ và thừa nhận pi là ứng cử viên thứ k. Quá trình thực hiện tiếp sâu từng bước theo các mức trong không gian tìm kiếm của danh sách tập mục phổ biến ItemSetList. Sau đó hợp nhất các ứng cử viên vào tập Lki và đếm (tính toán) cho từng pi có trong tập mục thoả ngưỡng hỗ trợ (tần suất xuất hiện) thứ k và đưa ra các tập mục phổ biến toàn cục CkG.

Thuật toán duyệt lần 2 qua CSDL để tính toán tần suất xuất hiện (độ hỗ trợ) trong toàn CSDL.

Nếu xét ở mức cao hơn bằng cách xem xét cải tiến được thực hiện bởi thủ

Procedure NewPartition

P=partition_database(D); N=Số bước cần phân hoạch For i=1 to n // bước thứ 1 ItemSetList.init();

Read_in_partition(piP)

Gen_Large_ItemSet_Base(pi,nSup); Gen_Large_ItemSet(pi,ItemSetList,nSup); For(i=2;Lij0;j=1,2,...,n;i++) do // bước kết hợp CG

j=j=1,2,..,n Lij ;

For i=1 to n // bước thứ 2 CG=read_in_partition(piP); CG

.checkSupportBaseDef(HashMap);// Kiểm tra và tỉa mức 1 CG

.gen_final_count(HashMaip;itemSetList); LG={cCG|c.count/TotTranminSupp}

+ Cải tiến 2:

Thuật toán Partition phát triển không gian tìm kiếm theo chiều rộng dựa vào cấu trúc danh sách con trỏ ở mức trước nó. Tuy vậy, sự tương tác giữa các phần tử trong danh sách ở mức hiện hành là tiến trình cho phép nó đưa ra được tập mục phổ biến ở mức tiếp theo.

1

Xét thủ tục Gen_Large_ItemSet_Helper: trong mỗi tập mục có cấu trúc TidList kết hợp tập các mục I trong tập TIDs (các tác vụ chứa Ids). Mỗi TIDs trong TidList luôn duy trì bảo đảm các ứng cử viên và đếm tần suất (độ hỗ trợ) xuất hiện của tập mục.

Trên thực tế TidList được phân chia bởi tổng số tác vụ được đưa ra có độ hỗ trợ thoả ngưỡng và là phổ biến cục bộ.

Procedure Gen_large_itemSet(p)

Lp

1={Tập mục phổ biến đầu tiên TIDLIST}

for(k=2; Lkp  0; k++) ItemSetList.getListOfPtrLevel(k-1); For(i=itemSetList.begin();i=itemSetList.end();i++) Gen_large_itemset_Helper(p,k); end; Procedure Gen_large_itemSet_Helper(p,k)

For all itemset I1 Lk-1pdo For all itemset I2 Lk-1pdo

I3.tidlist=I1.tidlist  I2.tidlist; If(haveSuppSuff(I3.tidlist)) Lp k=Lp k {I3}; remove I1.tidlist; ItemSetList.addList(k); end;

\\

Hình 3.1 Cây FP-Growth đếm mức phổ biến

Hình 3.2 Cây điều kiện FP - Tree

Tiếp theo là quá trình xử lý cho tập mục ứng cử viên thứ k cho đến khi: nếu I1 là phổ biến và là ứng cử viên thứ k-1 được mở rộng thêm từ mục I2 phổ biến thứ k-1, trong đó I3 là mục phổ biến và là ứng cử viên thứ k thoả ngưỡng hỗ trợ cục bộ thì kết nạp hoặc không thoả ngưỡng thì không kết nạp. (adsbygoogle = window.adsbygoogle || []).push({});

Đếm toàn CSDL A:9 lst B:9 lst C:2 lst D: 4 lst E: 2 lst F: 1 st FP-Tree 0 A:1 B:0 C:1 A:2 E:1 D:1 E:1 F:1 cond FP Tree E A:2 B:1 C:2 Đếm toàn CSDL A:9 st B:9 lst C: 2 lst D: 4 lst E: 2 lst F:1 st

Hình 3.3 Mức hoạt động của giải thuật

Phát sinh các tập mục phổ biến: các tập mục phổ biến và là ứng cử viên toàn cục được đưa ra từ kết quả của các mục phổ biến cục bộ khác nhau của các n – thành phần CSDL. Việc thực hiện đọc lại tất cả các phần dữ liệu và đưa ra các mối liên quan giữa các TidList của tất cả các mức ứng cử viên đầu tiên. Tại điểm này phải kiểm tra bằng thủ tục CheckSupportBaseDef, nếu có ứng cử viên ở mức đầu tiên không thoả ngưỡng hỗ trợ. Với việc khai phá các ứng cử viên, có thể tỉa từng tập mục và loại bỏ những ứng cử viên không phù hợp. Bên cạnh đó, bản đồ băm sẽ kết nạp các ứng cử viên thoả độ hỗ trợ.

Cuối cùng, điều mong muốn của thủ tục Gen_Final_Count trong các mức cao còn lại sẽ thực hiện trong cải tiến 3 khi sinh tất cả các mục thoả ngưỡng hỗ trợ.

+ Cải tiến 3:

Thủ tục này sử dụng không gian tìm kiếm theo chiều rộng để giải trình các bước trước nó được thể hiện trong thủ tục HashMap chứa các tập mục (k-1), việc này rất dễ kiểm tra, nếu tập mục ở mức sau xác định là thoả ngưỡng hỗ trợ. Trong thực tế, tất cả các tập mục ở mức k-1 phải tồn tại. Nếu như nó không tồn tại trong các bước của HashMap thì sự kết nối tập mục ở mức k sẽ không thoả ngưỡng hỗ trợ.

Theo thứ tự không gian lưu trữ, thủ tục HashMap rất cần thiết trong quá trình xử lý, mỗi một mức cần xử lý đầy đủ để HashMap tái sử dụng cho mức tiếp theo.

Hình 3.4 Mô phỏng dữ liệu cây băm Procedure Gen_final_count(HashMap,HashMapNew) for(k=2; Lkp  0; k++) ItemSetList.getListOfPtrLevel(k-1); gen_final_count_Helper(HashMap,HashMapNew) hashMap=hashMapNew; end;

Procedure Gen_final_count(HashMap, HashMapNew)

For all itemset I1 Lk-1pdo For all itemset I2 Lk-1pdo

c.findTies(myAncestor,I2,level);// c là ứng cử viên if(okTies)

c.tidlist=I1.tidlist  I2.tidlist; if(haveSuppSuff(c.tidlist)) Lkp=Lkp {c} HashMapNew.insert(myAncesstor+c); else Pruning(c);//bước tỉa remove I1.tidlist; end; A B C D ... A B C D ... C:OK D:.. ... HashMap lev 2 AB AC AD BC BD ....

Hỏi: Tập mục ACD có phải là ứng cử viên thích hợp hay không ? Trả lời: Không vì CD không tồn tại trong HashMap

+ Cải tiến 4: Partition mở rộng cho luật khai phá

Giả sử xét một bức thư gồm các ký tự. Luật khai phá chứng minh là công cụ rất mạnh cũng như việc xác định sự hội tụ trong điều kiện khai phá trong thân và đầu của luật. Theo thứ tự thu được, thuật toán sẽ mô tả trước các phần mở rộng.

Theo các ký hiệu được thể hiện, điều kiện phân vùng các tập mục của thân và đầu luật được chiết xuất từ bên trong vùng hội tụ. Để chứng minh việc này phải dựa vào một số nhóm giống nhau được thể hiện trong tập mục đã được chọn của thân hoặc đầu của điều kiện thoả mãn. Điều này không cần thiết trong trường hợp nếu thân và đầu giống nhau hoặc cấu trúc của luật không hoàn toàn thuộc mô hình của thuật Partition.

Trước tiên, thuật toán thiết lập các tập mục thoả độ hỗ trợ toàn cục và sau đó từng bước nhỏ thiết lập các luật được chiết xuất từ các mục được tìm thấy trong thân và đầu của các tập mục. Đây chính là nguyên nhân phân vùng hội tụ và điều kiện khai phá dựa vào vai trò của mục, một số trong chúng nó có thể là thân của luật trong khi đó một vài mục khác lại thuộc về đầu của luật. Điều tương tự sẽ xảy ra nếu thân và đầu được định nghĩa trong các lược đồ khác nhau. Ý nghĩa này nói nên rằng, chúng ta cần phải phân chia cấu trúc của thân và đầu của tập mục phải hợp lý. Theo thứ tự cài đặt này, sẽ xây dựng một cấu trúc đơn giản chứa đựng thông tin thân tập mục và mỗi một trong chúng có cấu trúc tương tự gắn với ứng cử viên đầu tập mục sao cho khi thực hiện trường hợp cơ bản, vẫn tồn tại các ứng cử viên được kết nạp trong bước tỉa.

Hình 3.5 Cây cấu trúc thân

Khi xây dựng các mức trên, trong thực tế, một thân tập mục I3 là tổng quát hoá từ thân của tập mục I1 và I2 ở mức 2. Nếu chỉ khi đầu của tập mục I1 tương ứng với đầu của tập mục I2. Một kết hợp xảy ra, mặc dù thoả ngưỡng hỗ trợ bằng không I3 sẽ bị tỉa.

Tóm lại, một luật được chiết xuất trong quá trình xử lý, theo đó việc xử lý phần thân tập mục bị bùng nổ đầu tập mục được khi sinh ra luật.

Hình 3.6 Mô phỏng sự kết hợp đầu và thân của luật

Mở rộng thuật toán Partition trong việc phân vùng dữ liệu dựa vào luật

P=partition_database(D) n=number of the partitions for i=1 to n do //phase 1

itemSetList.init();// Đọc thông tin thân và đầu luật read_in_partition(piP)

gen_Large_Rules_Base(pi,nSup);

gen_Large_Rules(pi,itemSetList,nSup);

for (i=1; Lij=0 ; j=1,2,..n; i++) do // bước kết nạp CjG=j=1,2..,n Lij

for i=1 to n // bước 2 CG=read_in_partition(piP);

if(supportHeadOnly)headInformation(pi);

CG.checkSupportBaseDef(HashMap);// Kiểm tra và tỉa mức đầu tiên (adsbygoogle = window.adsbygoogle || []).push({});

CG.gen_final_count(HashMap,itemSetList); LG={cCG| c.count/ToTran  minSup} .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. Thân Thân và đầu . . .

Một phần của tài liệu Áp dụng luật kết hợp trong khai phá dữ liệu cho dữ liệu ngân hàng đầu tư và phát triển việt nam (Trang 41)