Thông tin về giới hạn số cột trong một bảng, số dòng trong một bảng, ..v..v được Oracle đưa ra để cho chúng ta dễ dàng đánh giá bài toán và lựa chọn thuật toán cũng như thiết kế chương trình, dưới đây liệt kê một số giới hạn trong CSDL Oracle:
Mục Kiểu Giới hạn
Số indexs Tối đa trên một bảng Không giới hạn
Số cột Trên một bảng 1000 cột
Số cột Trên một indexs 32 cột
Số cột Trên một phân khu 16 cột
Số dòng Trên một bảng Không giới hạn
Số bảng Trên một CSDL Không giới hạn
45
Chương 4 Phân tích Luật kết hợp dựa trên Cơ Sở Dữ Liệu Oracle 4.1 Đặc tả bài toán
Dữ liệu vào: định dạng đầu vào là một bảng có hai cột. Cột đầu tiên là định danh giao dịch (tid) và cột thứ hai là danh mục mặt hàng (item). Trong mỗi giao dịch, nếu có nhiều hơn một mặt hàng, thì sẽ có nhiều dòng dữ liệu trong bảng giao dịch với cùng giá trị trong cột tid và các giá trị khác nhau trong cột mặt hàng.
Hình 4.1: Cách chuyển đổi cấu trúc bảng dữ liệu giao dịch
Một tùy chọn khác có thể là định dạng bảng bình thường với nhiều cột, một cột là tid và phần còn lại là các mặt hàng (items).
Đối với giao dịch với số lượng lớn các mặt hàng, định dạng đầu tiên sẽ có danh sách hữu hạn các mặt hàng như số lượng thực tế mà các mặt hàng tồn tại trong giao dịch. Đề tài lựa chọn cách thứ nhất là vì hai lý do:
1. Đầu tiên là chúng ta không biết số lượng của các mục trong mỗi giao dịch. 2. Ngoài ra cơ sở dữ liệu hiện tại trên thị trường có thể chỉ hỗ trợ số lượng nhất
định các cột cho một bảng. Nếu một trường hợp phát sinh trong đó có số lượng mặt hàng trong một giao dịch hơn mức cho phép của các cơ sở dữ liệu cơ bản, không có cách nào chúng ta có thể quản lý chính xác của dữ liệụ Cũng sẽ có
46
rất nhiều các giá trị null trong các hàng, các item không được sử dụng trong tất cả các giao dịch.
Dữ liệu ra: Đầu ra là một tập các bộ quy tắc, dữ liệu được trình bày theo hình thức bảng được đặt tên là RULES. Không phải luật kết hợp nào được sinh ra cũng cùng độ dài do đó chúng ta sẽ sử dụng độ dài tối đa để xác định số lượng các cột của bảng đầu rạ Một luật kết hợp được sinh ra cần phải có ít mặt hàng (item) hơn số lượng cột trong bảng. Những cột bổ sung cho luật kết hợp được sinh ra được gán giá trị 0. Cấu trúc bảng RULES (item1, item2, … ,itemk, nullm, rulem, confidence, support). Ở đây k là độ dài của tập phổ biến có độ dài lớn nhất. Cột nullm là cột có giá trị 0 đầu tiên, rulem là vị trí của „=>‟ trong luật kết hợp. Confidence và support lần lượt là độ tin cậy và độ hỗ trợ của luật kết hợp được sinh rạ
4.2 Sinh tập các ứng viên
4.2.1 Thực hiện phép nối giữa tập mục phổ biển Fk
Thuật toán Apriori đã được trình bầy trong chương 2, với mỗi k, tập ứng viên có độ dài k (Ck) có thể được sinh từ tất cả các tập mục phổ biến có độ dài bằng k-1 (Fk-1). Fk-1 sẽ có k-1 cột: Item1, Item2, …, Itemk-1, các giá trị lần lượt của tập mục phổ biến được sắp xếp theo thứ tự tăng dần.
(1) insert into Ck
(2) select I1.item1, … ,I1.itemk-1, I2.itemk-1
(3) from Fk-1 I1, Fk-1 I2
(4) where I1.item1 = I2.item1 and
(5) …
(6) I1.itemk-2 = I2.itemk-2 and
(7) I1.itemk-1 < I2.itemk-1
Hình 4.2: Thực hiện phép nối giữa tập mục phổ biến Fk Ví dụ, Tập mục phổ biến có độ dài k=3,
47
F3: {{1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {1, 3, 5}, {2, 3, 4}}, ta sẽ có được tập các ứng viên có độ dài k = 4 như sau: C4: {1, 2, 3, 4}, and {1, 3, 4, 5}.
4.2.2 Thực hiện bước tỉa loại bỏ ứng viên không có lợi
Tiếp theo, là bước tỉa để loại bỏ các ứng viên không có lợị Các tập con độ dài (k-1) của tập các ứng viên Ck không tồn tại trong các tập mục phổ biến có độ dài bằng k-1 (Fk-1) là được xóa bỏ. Chúng ta sử dụng phương pháp K-way join[15] để thực hiện, dựa vào các giá trị lần lượt của tập mục phổ biến được sắp xếp theo thứ tự tăng dần và tất cả tập con của tập phổ biến phải phổ biến. Các tập con (tập phổ biến) độ dài k-1 sẽ xác nhận cho các tập phổ biến độ dài k. Điều này được thực hiện bằng việc thêm phép kết nối với điều kiện để xác nhận lần lượt cho từng cột (item). Đầu tiên kiểm tra item1, nếu tập ứng viên (I1.item2, I1.item3, …, I1.itemk-1, I2.itemk-1) thuộc Fk-1 như trong phép kết nối với I3 được thể hiện ở hình bên dướị Một phép kết nối với Ir (3 <= r <= k) chúng ta sẽ kiểm tra item r-2 với điều kiện:
(1) I1.item1 = Ir.item1 and
(2) …
(3) I1.itemr-3 = Ir.itemr-3 and
(4) I1.itemr-1 = Ir.itemr-2 and
(5) …
(6) I1.itemk-1 = Ir.itemk-2 and
(7) I2.itemk-1 = Ir.itemk-1
48
Hình 4.4: Sinh và tỉa tập các ứng viên có độ dài k
Ví dụ, bảng F3 có tập dữ liệu {{1 2 3}, {1 2 4}, {1 3 4}, {1 3 5}, {2 3 4}}. Sau khi thực hiện kết nối F3 với chính nó ta được kết quả trả về là {{1 2 3 4}, {1 3 4 5}. Bước tỉa sẽ xóa tập con {1 3 4 5} không phổ biến. Bởi vì tập {1 3 4 5} được sinh ra từ hai tập con là {1 3 4} và {1 3 5} nhưng tập con {3 4 5} không tồn tại trong tập mục phổ biến F3. Do đó nó bị xóa và tập các ứng viên có độ dài 4 (C4) là {1 2 3 4}.
49
4.3 Tính độ hỗ trợ
Đây là một phần quan trọng và chiếm hầu hết thời gian của quá trình KPDL. Bước này là cần thiết để xác định tất cả các tập phổ biến từ các tập ứng cử viên. Trình bày phương pháp sử dụng chuẩn SQL-92 cho việc tính toán độ hỗ trợ, K-way (Kwj) [15]:
Phương pháp cơ bản để tính độ hỗ trợ tại k bất kỳ, thực hiện kết nối giữa tập các tập mục của tập các ứng viên với k bảng giao dich T và thực hiện hàm nhóm (Group by) trên các tập mục của tập các ứng viên đó. Câu lệnh SQL và sơ đồ cây với k-way kết nối được hiển thị dưới đây:
(1) Insert into Fk
(2) Select item1, … , itemk, count(*) (3) From Ck,Tt1,…,Ttk
(4) Where t1.item = Ck.item1 and
(5) …
(6) tk.item = Ck.itemk and
(7) t1.tid = t2.tid and
(8) …
(9) tk-1.tid = tk.tid
(10) Group by item1, item2, … ,itemk (11) Having count(*) > minsup
50
Hình 4.7: Mô hình cây tính độ hỗ trợ bằng phương pháp nối K-way
4.4 Sinh các luật kết hợp từ các tập mục phổ biến
4.4.1 Kết hợp các tập mục phổ biến có độ dài từ 1 đến k
Từ các tập mục phổ biến có độ dài từ 1 đến k, chúng ta kết hợp dữ liệu từ các bảng F1 đến Fk vào bảng dữ liệu FISETS(item1,…,itemk, nullm, count) với nullm là vị trí có giá trị 0 đầu tiên, và count là độ hỗ trợ của tập mục, như sau:
(1) Insert into fisets as
(2) select item1, …, 0 itemk, 2 nullm,count from F1 (3) union all
(4) select item1, item2, …, 0 itemk, 3 nullm,count from F2 (5) union all
(6) … (7) union all
(8) select item1, item2,…, itemk, k+1 nullm,count from Fk
51
4.4.2 Sinh các tập con bảng tập mục phổ biến FISETS
Bước tiếp theo, sinh các tập con cho mỗi tập hữu hạn trong bảng tập mục phổ biến FISETS. Sau đó cập nhật vào bảng SUBSETS(item1, …, itemk, nullm, rulem, count) với cột nullm là cột có giá trị 0 đầu tiên, rulem là vị trí của „=>‟ trong luật kết hợp và count là độ hỗ trợ. Đối với một dòng dữ liệu trong bảng FISETS, có giá trị trong các cột (item1,…,itemk) tăng dần. Để sinh các tập con cho mỗi tập hữu hạn trong bảng tập mục phổ biến FISETS đề tài sử dụng thuật toán đệ quy liệt kê tổ hợp chập k của n phần tử:
(1) declare
(2) n number; --Mảng có độ dài n
(3) source number [ ] := null; --Mảng kết quả (4) k number := 3; --Số lượng phần tử (5) selected boolean [ n ]; --Mảng lưu trạng thái
(6) procedure choose(element number, startIdx number) is
(7) begin
(8) if element = k then
(9) --In danh sách phần tử trong mảng source[k] (10) for i in 1 .. n loop
(11) if selected[i] = true then
(12) --In phần tử mảng sẽ được chọn (13) end if;
(14) end loop;
(15) else
(16) for i in startIdx .. n loop
(17) if selected [ i ] = false then
(18) selected [ i ] = true;
(19) --Thực hiện thuật toán đệ quy (20) choose(element + 1, i + 1);
52 (21) selected [ i ] = false; (22) end if; (23) end loop; (24) end if; (25) end choose; (26) Begin (27) choose(0, 0); (28) End;
Hình 4.9: Liệt kê tổ hợp chập k của n phần tử
4.4.3 Sinh các luật kết hợp
Chúng ta sẽ kết hợp hai bảng FISETS và SUBSETS với điều kiện: . min_ . SUBSETS count conf FISETS count
Cập nhật dữ liệu vào bảng RULES (item1,…, itemk, nullm, rulem, confidence, support)
(1) insert into Rules
(2) select s.item1, …, s.itemk, s.nullm, s.rulem,
(float(s.count)/f.count)*100 Confidence, s.count Support
(3) from SUBSETS s, FISETS f
(4) where (s.item1 = f.item1 OR s.rulem <= 1 )
(5) AND (s.item2 = f.item2 OR s.rulem <= 2 )
(6) ...
(7) AND (s.itemk = f.itemk OR s.rulem <= k )
(8) AND s.rulem = f.nullm
(9) AND s.count*100/ f.count >= minconf
53
4.5 Ví dụ minh họa
Dữ liệu đầu vào là hai bảng như sau: Bảng: Transaction1
Bảng: Transaction2
Bước 1: Chúng ta kết hợp hai bảng, tổng hợp và tạo ra hai bảng MappedTidsTable và MappedItemsTable như hình bên dưới:
Bảng: MappedTidsTable
Bảng: MappedItemsTable
Bước 2: Sau đó chúng ta cập nhật dữ liệu đã được chuyển đổi vào bảng FinalInput (TID, ITEM)
54 Bước 3:
Với k =1, tập mục phổ biến được cập nhật trong bảng F1 như sau:
Với k = 2, tập mục phổ biến được cập nhật trong bảng F2 như sau:
Với k = 3, tập mục phổ biến được cập nhật trong bảng F3 như sau:
Sau đó kết hợp 3 bảng F1, F2, F3 để được bảng FISETS chứa tập mục phổ biến cuối cùng
55
Sử dụng bảng FISETS và SUBSETS, các luật kết hợp đã được sinh và lưu trữ vào bảng RULES như sau:
Kết hợp bảng RULES và bảng MappedItemsTable từ bước 1, chúng ta có được tập các luật kết hợp như sau:
56
Chương 5 Ứng dụng vào phân tích dữ liệu viễn thông tại Beeline 5.1 Mô tả và chuyển đổi dữ liệu
5.1.1 Mô tả các bảng dữ liệu
Dữ liệu chi tiết cuộc gọi (call detail data - CDR): Mỗi một cuộc gọi của khách hàng trên mạng viễn thông đều phát sinh một mẫu tin chi tiết cuộc gọị Các mẫu tin này bao gồm các thông tin đặc tả thuộc tính quan trọng của cuộc gọi như : số gọi, số bị gọi, thời gian bắt đầu và thời gian đàm thoạị
1. CDR_DATA_FULL là bảng dữ liệu CDR có hàng triệu bản ghi, và các thuộc tính chính như phụ lục B, mục 1.
2. ACCOUNT_SUBSCRIBER là bảng dữ liệu chứa thông tin tài khoản khách hàng như gói dịch vụ hiện tại khách hàng đang dùng và được kích hoạt vào khi nào, các thuộc tính chính như phụ lục B, mục 2.
3. Bảng CDR_BALANCE_FULL chứa dữ liệu về số dư hiện tại của một số thuê bao được đăng ký bởi một người sử dụng (một người sử dụng có thể đăng ký nhiều số thuê bao), như phụ lục B, mục 3.
4. Bảng OFFER_VALUES lưu dữ liệu danh mục chi tiết các dịch vụ giá trị gia tăng trong hệ thống của nhà phân phối dịch vụ viễn thông, như phụ lục B, mục 4.
5. Bảng AUT_TEMP lưu giữ thông tin chi tiết của các dịch vụ giá trị gia tăng như tin nhắn thường, tin nhắn đa phương tiện, cuộc gọi trong nước, cuộc gọi quốc tế.., như phụ lục B, mục 5.
5.1.2 Các bước chuyển đổi dữ liệu
Từ dữ liệu thu thập được chúng ta sẽ làm sạch và tiền xử lý dữ liệu, xây dựng bảng dữ liệu từ điển cho các thuê bao và các dịch vụ gia tăng chuẩn bị dữ liệu đầu vàọ
57
1. Bảng dữ liệu chi tiết cuộc gọi cdr_data_full, bảng dữ liệu này là rất lớn lưu toàn bộ dữ liệu dịch vụ phát sinh của khách hàng. Trung bình 1TB dữ liệu trong vòng 4 tháng. Vì dữ liệu là rất lơn nên bảng dữ liệu được phân vùng dữ liệu theo từng ngày giao dịch trong trường rate_dt:
create table CDR_DATA_FULL (
trans_id VARCHAR2(20),
account_no NUMBER(10) not null, external_id VARCHAR2(144), rate_dt DATE not null ...)
Với cách phân vùng dữ liệu như sau :
partition by range (RATE_DT) (
partition DATA20100601 values less than '2010-06-01') partition DATA20100602 values less than '2010-06-02' ... )
Chúng ta thu nhỏ dữ liệu bằng việc xây dựng bảng tổng hợp dữ liệu dựa trên từng phân vùng dữ liệu của bảng cdr_data_full, việc tìm kiếm và xử lý trên từng phân vùng giúp tốc độ truy cập tìm kiếm nhanh hơn hàng trăm lần, tham khảo thủ tục pkg_apriorịtransform_data trong phụ lục B.
Create table CRD_AGGREGATE201006 as Select c.external_id,
c.aut_id,
sum(c.charged_amount / 1000) charged_amount, sum(c.primary_units) primary_units
from (select external_id, charged_amount, primary_units, aut_id from cdr_data_full partition(data20100601)
where charged_amount <> 0 or primary_units <> 0) c group by c.external_id, c.aut_id
2. Từ bảng aut_temp lưu danh sách các dịch vụ giá trị gia tăng trong hệ thống, xây dựng bảng danh mục các dịch vụ giá trị gia tăng như sau, tham khảo pkg_apriorịcreate_aut_mapping_table trong phụ lục B:
58
create table MappedItemsTable as
select aut_id , display_value, rownum itemi ,reseller_version_id from aut_temp a where ạlanguage_code = 1 -- Tiếng Anh
and ạreseller_version_id = 90 -- Phiên bản mới nhất
Chúng ta thu được bảng từ điển các dịch vụ gia MappedItemsTable tăng như sau:
3. Từ hai bảng trên chúng ta xây dựng bảng TRANSACTIONS, tham khảo pkg_apriorịcreate_transactions_table trong phụ lục B.
create table transactions as select external_id tid, itemi item
from CRD_AGGREGATE201006 t, aut_mapping a where t.aut_id = ạaut_id
5.2 Xây dựng hệ thống thực nghiệm
Từ dữ liệu đầu vào là bảng TRANSACTIONS (TID, ITEM), chúng ta sẽ xây dựng ứng dụng thực nghiệm theo các bước như đã giới thiệu trong chương bốn. Trong quá trình thực hiện ứng dụng sẽ có các bảng tạm (temp tables) được tạo ra lưu trữ tập các ứng viên Ck và tập mục phổ biến Fk với độ hỗ trợ tương ứng.
Để gọi chạy chương trình trong môi trường Oracle, chúng ta sử dụng:
begin pkg_apriorịapriori_main; end; Trong đó: procedure apriori_main is l_table_name varchar2(100):='CRD_AGGREGATÉ; --k-itemsets l_k_max number(5):=10;
59 begin pkg_apriorịtransform_datắ01-JUN-2010','10-JUN-2010',l_table_name); pkg_apriorịcreate_aut_mapping_table(l_table_name); --Sinh ra bảng CSDL giao dịch pkg_apriorịcreate_transactions_table(l_table_name); for k in 1 .. 10 loop
--Tạo ra bảng chứa tập các ứng viên pkg_apriorịcreate_c_table(k); --Tạo ra bảng k-tập mục phổ biến
pkg_apriorịcreate_f_table(k, 'transactions'); end loop;
--Tạo ra bảng k-tập mục phổ biến với độ hỗ trợ tương ứng pkg_apriorịcreate_fisets_table(l_k_max);
--Tạo ra bảng giao hoán vị trí các mục trong tập mục phổ biến pkg_apriorịcreate_subsets_table;
--Tạo bảng chứa các luật kết hợp với độ hỗ trợ, độ tin cậy tương ứng pkg_apriorịcreate_rules_table(l_k_max, 1715223);
end apriori_main;
5.2.1 Sinh tập các ứng viên và tính độ hỗ trợ
Đầu tiên chúng ta sẽ sinh ra các tập mục phổ biến F1 từ bảng TRANSACTIONS như sau:
create table F1 as
select item item1, count(*) count from transactions
group by item having count(*) > 1
Từ bảng tập mục phổ biến F1, tạo bảng sinh các ứng cử viên C2 bằng việc nối bảng F1 với chính nó:
create table C2 as
Select I1.item1, I2.item1 item2 From F1 I1, F1 I2 Where I1.item1 < I2.item1
Thực hiện phép nối giữa tập mục phổ biển Fk-1, để sinh tập các ứng viên Ck, sau đó thực hiện bước tỉa loại bỏ ứng viên không có lợi như được mô tả trong mục 4.2.2 (thực hiện bước tỉa loại bỏ ứng viên không có lợi). Tham khảo thủ tục
60
Tìm tập mục phổ biến có độ dài k (Fk) và tính độ hỗ trợ của mỗi tập mục, tham khảo thủ tục f_table_creation (trong phần phụ lục A, mục 2).
5.2.2 Sinh các luật kết hợp từ các tập mục phổ biến
Kết hợp các tập mục phổ biến có độ dài từ 1 đến k bằng cách kết hợp dữ liệu của bảng tạm đã tạo ra F1, …,Fk vào bảng FISETS, từ bảng FISETS chúng ta tìm tập con cảu tập mục phổ biến trong bảng FISETS và lưu vào bảng SUBSETS.
Tham khảo thủ tục Gensubs_combination (trong phần phụ lục A, mục 4) sẽ thực hiện việc tìm tất cả các tập con của các tập phổ biến trong bảng FISETS, thủ tục Gensubs_combination thực hiện việc tìm các tập con bằng cách liệt kê tổ hợp chập k