Với L là cây cần khai phá AFD
L1:= {{A} | A R}, L2 được tính từ L1, L3 được tính từ L2... C là tất cả các tổ hợp tại mức Ll nào đó
C+(X) = { A R | B X, X \ {A, B} → B không được suy diễn}. 1. L0:= {Ө} 2. C+( Ө):= R 3. L1:= {{A} | A R} 4 . ℓ:= 1 5 . while Ll ≠ Ө 6 . COMPUTE-DEPENDENCIES(Ll ) 7 . PRUNE(Ll) 8 . Ll+1:= GENERATE-NEXT-LEVEL(Ll ) 9 . ℓ:= ℓ + 1 Giải thích : Giải thích : 1 L0 khởi tạo bằng rỗng 2 C+(0) bằng R 3 L1 bằng tất cả các thuộc tính trong R 4 ℓ := 1
5 while Ll # rỗng
6 Tính toán các phụ thuộc hàm trong (Ll)
7 Prune(Ll) lọc Ll để tìm kiếm và xoá các phụ thuộc hàm ko cần thiết 8 Ll+1 bằng xây dựng các phụ thuộc hàm cho mức tiếp theo
9 l := l + 1 Thủ tục Procedure COMPUTE-DEPENDENCIES(Lℓ ) 1 for each X Ll do 2 C+(X):=∩AX C+(X \ {A}) 3 for each X Ll do 4 for each A X ∩ C+(X) do 5 if X \ {A} → A is valid then 6 output X \ {A} → A
7 remove A from C+(X)
8 remove all B in R \ X from C+(X)
Thủ tục Procedure PRUNE(L) 1 for each X Lℓ do 2 if C+(X) = Ө do 3 delete X from Lℓ 4 if X is a (super)key do 5 for each A C+(X) \ X do 6 if A :=∩ bX C+(X {A} \ {B}) then 7 output X → A 8 delete X from Lℓ 3.1.2 Độ phức tạp
Với một bảng cơ sở dữ liệu quan hệ R có |R| thuộc tính và |r| bản ghi. Thời gian để có thể khai phá các phụ thuộc hàm xấp xỉ theo thuật toán Tane ban đầu đề xuất phụ thuộc vào số thuộc tính |R|, số bản ghi |r|. Độ phức tạp theo hàm mũ O(2| r |).
3.2 Thuật toán AFDMCEC (phát triển từ thuật toán TANE)
Thuật toán AFDMCED(Approximate Functional Dependency using Mininal Conver and Equivalent Classes) :Khai phá phụ thuộc hàm xấp xỉ sử dụng Phủ tối thiểu và lớp tương đương.
Với bảng cơ sở dữ liệu quan hệ R với |R| thuộc tính. 2 tập thuộc tính X, Y là tập con của R. Nếu có hàm lỗi g3(XY) < ε thì phụ thuộc hàm xấp xỉ XY đúng và g3(YX) < ε thì X và Y tương đương. Ta có thể loại bỏ tập thuộc tính Y.
Thuật toán đề xuất sẽ quét toàn bộ bảng có kích thước | r | bộ dữ liệu để có thể tìm thấy tất cả các lớp tươg đương cho một phức tạp thời gian của | r |. Sau đó thuật toán AFDMCEC có một vòng lặp lặp | R | lần. Do đó, cơ thể này chính có độ phức tạp thời gian của | R |. Trong mỗi lần lặp của vòng lặp này, có một cuộc gọi cho mỗi thủ tục sau đây:
1. ComputeMinimalApproximate_FD()- FD. mỗi cuộc gọi của thủ tục này có | R | lần lặp lại. Trong mỗi lặp đi lặp lại này có một vòng lặp quét tất cả các ứng cử viên trong đó mức độ của kích thước = 2 | R |. Do đó tổng thời gian của bước này là s * | R |.
2. GeneratNextLevelCandidates (Candidate_Set) thủ tục này thực hiện hai vòng lặp lồng nhau, với mỗi |R| lặp đi lặp lại trong một thời gian tổng cộng | R|2
Do đó, tổng thời gian cần thiết bằng các thuật toán AFDMCEC yêu cầu là: O( |r| + |R| (s |R|+ |R|2 )) = O(|r| + s |R| 2 + |R|3 )
3.2.1 Phân tích thử nghiệm
Theo kết quả của cả hai thuật toán chạy (Tane và AFDMCEC), đặt cùng một AFDs từ các bộ dữ liệu UCI đã được tạo ra. Cho thấy các kết quả của các lần thực tế thay đổi thuật toán cần thiết cho TANE và cho FDMCEC thuật toán cho các bộ dữ liệu với UCI số thuộc tính khác nhau và bộ dữ liệu và với các ngưỡng khác nhau ε giá trị cho các khám phá tất cả AFDs.
Bảng 3.1: Thời gian thực tế cho cả hai thuật toán
( TANE và AFDMCEC các thuật toán) đối với một số bộ dữ liệu UCI cho ε ngưỡng khác nhau)
Từ Bảng 3.1, cùng AFDs được tìm thấy hiệu quả hơn bằng cách sử dụng thuật toán AFDMCEC với thuật toán Tane.
3.2.2 Những sự so sánh về độ phức tạp Thời gian.
Bảng 3 trình bày những so sánh phức tạp thời gian đó được tính toán trước đó cho AFDMCEC thuật toán và thuật toán TANE
Bảng 3.2: Thời gian phức tạp so sánh dựa trên T (n) cho cả hai thuật toán Cách tiếp cận dựa trên xem xét phân vùng của mối quan hệ và phát sinh phụ thuộc giá trị từ các phân vùng sẽ tìm kiếm thuật toán cho phụ thuộc vào chiều rộng một cách đầu tiên. Không gian tìm kiếm có thể được cắt tỉa một cách hiệu quả và làm thế nào các phân vùng và các phụ thuộc có thể được tính hiệu quả. Thử nghiệm và so sánh kết quả chứng minh rằng thuật toán nhanh chóng trong thực tế và quy mô tính chất của nó lên là cao hơn các phương pháp trước đó. Phương pháp này hoạt động tốt với các mối quan hệ lên đến hàng trăm ngàn bộ dữ liệu.
Ngoài ra còn có các ứng dụng khai thác các dữ liệu khác thú vị cho các phân vùng. Các quy tắc giữa các cặp thuộc tính-giá trị có thể được tính với một thay đổi nhỏ của các thuật toán hiện nay. Một lớp tương đương tương ứng sau đó đến một sự kết hợp đặc biệt giá trị của thuộc tính thiết lập. Bằng cách so sánh các lớp học tương đương thay vì phân vùng đầy đủ, chúng ta có thể tìm luật kết hợp.
KẾT LUẬN
Trong thời đại ngày nay, việc khám phá tri thức trong Cơ sở dữ liệu đang là một hướng quan trọng của nền CNTT thế giới. Nó có khả năng ứng dụng vào rất nhiều toán thực tế khác nhau. Bước quan trọng nhất của quá trình này là Khai phá dữ liệu, người sử dụng thu được những tri thức hữu ích từ những CSDL hoặc các nguồn khác. Chính vì thế, trước các nhu cầu của thực tế mà các nghiên cứu đã và đang không ngừng cải tiến các phương pháp khai phá dữ liệu nhằm đáp ứng ngày một tốt hơn nữa nhằm ứng dụng các phương pháp khai phá dữ liệu cho đời sống kinh tế, xã hội.
Sự phụ thuộc dữ liệu có ảnh hưởng lớn đến việc trích trọn mẫu huấn luyện nhằm xây dựng xây dựng cây quyết định có hiệu quả. Việc nhận ra sự phụ thuộc dữ liệu góp phần làm cải thiện hiệu quả trong bài toán phân lớp.
Việc khai phá dữ liệu ứng dụng phụ thuộc hàm xấp xỉ đã và đang được quan tâm nghiên cứu trong nhiều năm trở lại đây, với TANE, ta có thể tìm ra các phụ thuộc hàm xấp xỉ trên dữ liệu khá hiệu quả. Một trong những ứng dụng của việc tìm ra các phụ thuộc hàm xấp xỉ là xây dựng bảng quyết định. Từ đó xây dựng cây quyết định.
TÀI LIỆU THAM KHẢO
[1] Codd E.F(1970),”A relational model for large shared data banks”, Communication ACM12,pp.377-387
[2] Demetrovics J.,Thi V.D Relations and minimal keys. Acta Cybernetica 8,3(1988), 279-285
[3] Demetrovics J.,Thi V.D On keys in the Relations Datamodel, Inform.Process Cybern.EIK 24,10 (1988), 515-519
[4] Giannella, Chris and Robertson, Edward, 2004 “On Approximation Measures for Functional Dependencies”, Inform Action Systems Archive 29(6), 483-507. [5] Huhtala, Y., Karkkainen, J., Porkka P., and Toivonen, H., 1999. “Tane: An efficient algorithm for discovering functional and approximate dependencies”. The Computer Journal, 42(2):100-111.
[6] Kivinen, J., and Mannila, H., 1995. “Approximate Inference of Functional Dependencies From Relations”. Theoretical Computer Science, 149:129-149. [7] Kwok-Wa Lam, Victor C.S.Lee, Building Decision Trees Using Functional Dependencies, Processdings, of the International Conference on Information Technology: Coding and Computing(ITCC‟04), 2004.
PHỤ LỤC Thủ tục Tính phụ thuộc hàm xấp xỉ double tinh_phuthuochamxapxi() { double tong_phan_hoach = 0; double sobanghi = 0;
int [] a = new int [100002];
string tam = "";
for (int i = 0; i<=100000; i++) a[i] = 0; for (int i = 0; i<=lbX.Items.Count-1; i++) { vt = 0; dem = 0; for (j = 0; j <= lbX.Items[i].Text.Length - 1; j++) if (lbX.Items[i].Text[j] == ' ') { dem++; tam = lbX.Items[i].Text.Substring(vt, j - vt); vt = j; a[Convert.ToInt32(tam)] = 1; }
sobanghi = sobanghi + dem; int p; dem_1 = 0; max = 0; for (j = 0; j <= lbY.Items.Count - 1; j++) { int dem_tam = 0; vt = 0; for (k = 0; k <= lbY.Items[j].Text.Length - 1; k++) if (lbY.Items[j].Text[k] == ' ') { tam = lbY.Items[j].Text.Substring(vt, k - vt); p = Convert.ToInt32(tam); vt = k; if (a[p] == 1) { dem_tam++; dem_1++; a[p] = 2; } }
if (dem_tam > max) max = dem_tam; if (dem == dem_1) break;
}
tong_phan_hoach = tong_phan_hoach + max; }
return 1 - (tong_phan_hoach / sobanghi); }
Thủ tục phân hoạch
public void phanhoach(string x, ListBox lb) {
lb.Items.Clear(); int i;
string s = "";
string [] x1= new string[100]; int sophantux1 = 0;
char[] x2 = new char[100]; int sophantux2 = 0;
for (int j = 0; j<= x.Length-1; j += 2) {
sophantux2++;
x2[sophantux2] = x[j]; }
int vt;
for (i = 0; i <= ListBox1.Items.Count - 1; i++) {
sophantux1 = 0; vt = 0;
for (int j = 0; j <= ListBox1.Items[i].Text.Length - 1; j++) if (ListBox1.Items[i].Text[j] == '+') { sophantux1++; x1[sophantux1] = ListBox1.Items[i].Text.Substring(vt, j-vt); vt = j+1; } s = ""; string xau_select = ""; xau_select = xau_select + x2[1] + " = " + "'" + x1[1] + "'";
for (int j = 2; j <= sophantux1; j++)
xau_select = xau_select + " and " + x2[j] + " = " + "'" + x1[j] + "'"; string connectionstring = ConfigurationSettings.AppSettings["connectioninfo"];
SqlConnection connection = new
SqlConnection(connectionstring); connection.Open();
string select = "select TupleID from bang_dulieu where " + xau_select;
SqlCommand comm = new SqlCommand(select, connection); SqlDataReader reader = comm.ExecuteReader();
while (reader.Read()) s = s + reader[0].ToString() + " "; lb.Items.Add(s); connection.Close(); } } Thủ tục tính số tổ hợp
void sotohop(int k, int n) {
lbtohop.Items.Clear(); string s = "";
int i,j, ok;
int [] a = new int[100];
for (i=1; i<=k; i++) a[i] = i; while (a[1]<=n-k+1) { s = ""; ok = 0; for (j = 1; j <= k; j++) { s = s + a[j].ToString() + " "; if (kiemtra(a[j]) == 1)
{
ok = 0; break; }
if ((k>2) && (kiemtra(a[j])) == 0)
for (int p = 0; p <= lbtohop_luugiu.Items.Count - 1; p++) if (s == lbtohop_luugiu.Items[p].Text) ok = 1; } if (k <= 2) lbtohop.Items.Add(s);
else if (ok == 1) lbtohop.Items.Add(s); if (a[1] < (n - k + 1))
{
i = k;
if (a[i] == n) {
while ((a[i] == (n - k + i)) && (i>1)) { i--; a[i] = a[i] + 1; } for (j = i + 1; j <= k; j++) a[j] = a[j - 1] + 1; }
else a[i] = a[i] + 1; }
else a[1] = n - k + 2; }
}
Thủ tục loại bỏ
for (int i = 0; i <= lbtohop.Items.Count - 1; i++) {
vt = 0; tam = ""; dem = 0;
for (j = 0; j <= lbtohop.Items[i].Text.Length - 1; j++) if (lbtohop.Items[i].Text[j] == ' ') { dem++; tam = lbtohop.Items[i].Text.Substring(vt, j - vt); vt = j;
a[dem] = Convert.ToInt32(tam); }
string ketqua = ""; string s = ""; s = s + b[a[1]];
ketqua = ketqua + lbthuoctinh.Items[(int)b[a[1]] - 64].Text;
for (j = 2; j <= dem - 1; j++) {
s = s + "," + b[a[j]];
ketqua = ketqua + "," + lbthuoctinh.Items[(int)b[a[j]] - 64].Text;
}
hienthi_thuoctinh(s); phanhoach(s, lbX);
s = s + "," + b[a[dem]];
ketqua = ketqua + "->" + lbthuoctinh.Items[(int)b[a[dem]] - 64].Text;
hienthi_thuoctinh(s); phanhoach(s, lbY); lbtohop_luugiu.Items.Clear(); int giu = 0; if (tinh_phuthuochamxapxi() < Convert.ToDouble(esynol.Text)) { Response.Write(ketqua); Response.Write("<br>");
for (int k = 0; k <= lbtohop.Items.Count - 1; k++) { vt = 0; while (vt <= lbtohop.Items[k].Text.Length - 1) { vt = lbtohop.Items[k].Text.IndexOf(' ', vt) + 1; if (vt <= lbtohop.Items[k].Text.Length - 1) giu = vt; } string tam_1 = lbtohop.Items[k].Text.Substring(giu, lbtohop.Items[k].Text.Length - giu); if (Convert.ToInt32(tam_1) == a[dem]) lbtohop.Items.Remove(lbtohop.Items[k]); else lbtohop_luugiu.Items.Add(lbtohop.Items[k]); } lb_loaibo.Items.Add(a[dem].ToString()); } } tohop++; }