KẾT LUẬN
Những vấn đề đã đƣợc tìm hiểu và giải quyết trong luận văn
Hiện nay, khai phá dữ liệu là một lĩnh vực rất được quan tâm, nó bao gồm nhiều lĩnh vực và nhiều kỹ thuật khác nhau trong đó khai phá luật kết hợp và khai phá luật kết hợp mờ là các mục tiêu quan trọng trong lĩnh vực khai phá dữ liệu. Vì vậy, tôi đã cố gắng tìm tòi nhiều tài liệu để nghiên cứu những vấn đề cơ bản nhất về khai phá dữ liệu bằng luật kết hợp mờ. Sau đây là những điểm chính mà luận văn đã tập trung giải quyết:
Chương 1: Trong chương này ngoài việc phát biểu các khái niệm, định nghĩa một cách hình thức còn trình bày các thuật toán điển hình để giải quyết bài toán khai phá luật kết hợp do R. Agarawal đề xuất năm 1993.
Chương 2: Thực tế là các dữ liệu thường ở dạng thuộc tính số và hạng mục. Chính vì vậy bài toán tìm luật kết hợp với thuộc tính số và hạng mục đã được đề cập một cách sơ lược để đánh giá ưu và nhược điểm của chúng. Lý thuyết cơ bản về tập mờ được đề cập để chỉ ra tính ưu việt của tập mờ và việc gắn tập mờ với bài toán khai phá luật kết là một vấn đề tất yếu. Trong chương này cũng đề xuất việc đưa vào các toán tử phù hợp để xác định độ ủng hộ chứ không chỉ dùng các toán tử lấy min và tích đại số. Và khái niệm toán tử có ngưỡng [12] có thể đưa vào bài toán luật kết hợp mờ cũng làm cho việc khai phá dữ liệu đạt kết quả tốt hơn. Hay nói cách khác, ta có thể sử dụng các toán tử có ngưỡng cho bài toán khai phá dữ liệu bằng luật kết hợp mờ.
Chương 3: Đây là phần cài đặt thử nghiệm cho bài toán đưa ra ở chương 2. Dữ liệu của chương trình là về thời gian và các loại dịch vụ sử dụng internet ADSL. Chương trình này góp phần thực hiện một cách trực quan nhất các bước mà thuật toán ở chương 2 đã đưa ra.
Hƣớng mở rộng nghiên cứu trong tƣơng lai
Khai phá dữ liệu lĩnh vực được nhiều nhà nghiên cứu quan tâm vì nó ứng dụng rộng rãi trong đời sống xã hội ngày nay và vì vậy có rất nhiều hướng nghiên cứu mở rộng khác nhau.
Trong luận văn này tôi chỉ chọn một vấn đề nhỏ để nghiên cứu, khi có điều kiện tôi sẽ mở rộng hướng nghiên cứu ra một số hướng sau:
- Nghiên cứu, đánh giá các thuật toán cải tiến tối ưu hơn để từ đó gắn với các toán tử mờ có ngưỡng.
- Ngiên cứu các thuộc tính đa mức để đưa vào bài toán tìm luật kết hợp mờ
của các toán tử sao cho tối ưu với từng loại bài toán cụ thể.
- Ứng dụng các kết quả nghiên cứu vào thực tiễn như ngân hàng, thị trường chứng khoán, bệnh viện, kinh doanh.
Trong quá trình thực hiện luận văn mặc dù đã cố gắng tìm hiểu nhiều tài liệu tuy nhiên do trình độ và thời gian có hạn không tránh khỏi những sai sót. Rất mong các thầy cô, bạn bè, đồng nghiệp thông cảm.
TÀI LIỆU THAM KHẢO
Tiếng Việt
[1]. Bùi Công Cường, Nguyễn Doãn Phước (2001), Hệ mờ, mạng Nơron và ứng dụng, Nhà xuất bản Khoa học và Kỹ thuật.
[2]. Nguyễn Thanh Thủy (8/2001), Khai phá dữ liệu - Kỹ thuật và ứng dụng, Bài giảng Trường thu Hệ mờ và ứng dụng, Hà Nội
[3]. Bùi Công Cường, Lê Chí Ngọc (2005), Mấy vấn đề về luật kết hợp mờ và t- chuẩn có ngưỡng.
Tiếng Anh
[4]. Rakesh Agrawal Ramakrishnan Srikant (1994), Fast Algorithms for Mining Association Rules in Large Database, IBM Research Report RI9839, IBM Almaden Research Center San Jose, Califorlia.
[5]. Jiawei Han, Jian Pei, and Yiwen Yin (2000), Mining Frequent Patterns without Candidate Generation, Proceedings of the 2000 ACM SIGMOD International Cinference on Manaement of Data, volume 29(2) of SIGMOD Record, pages 1- 12
[6]. Gosta Grahne and Jianfei Zhu (2003), Efficiently Using Prefix-trees in Mining Frequent Itemsets, In Proceedings of FIMI’03, Concordia University Montreal, Canada
[7]. Chan Man Kuok, Ada Fu, Man Hon Wong, (1998) Mining Fuzzy Association Rules in Databases, Department of Computer Science and Engineering The Chinese University of Hong Kong Shatin, New Territories, Hong Kong
[8]. Zahra Farzanyar, Moharnrnadreza Kangavari, Sattar Hashemi (2006), A New Algorithm for Mining F'uzzy Association Rules in the Large Databases Based on Ontolog, Workshops Proceedings of the 6th IEEE International Conference on Data Mining, Hong Kong, China. IEEE Computer Society 2006
[9]. Weining Zhang (1999), Mining Fuzzy Quantitative Association Rules, Proceedings of IEEE International Conference on Tools with Artificial Intelligence 1999 Piscataway, NJ, IEEE Press
[10]. David L. Olson, Yanhong Li (1/2007), Mining Fuzzy Weighted Association Rules, 40th Hawaii International International Conference on Systems Science (HICSS-40 2007), CD-ROM / Abstracts Proceedings, Waikoloa, Big Island, HI, USA. IEEE Computer Society 2007
Quantitative Association Rules Mining Algorithm and Its Simulation, Fourth International Conference on Fuzzy Systems and Knowledge Discovery (FSKD 2007)
[12]. Bui Cong Cuong, Some computing procedures in fuzzy systems Institute of Mathematics
[13]. Attila Gyenesei (3/2000), A Fuzzy Approach for Mining Quantitative Association Rules, Turku Centre for Computer Science TUCS Technical Report, No 336
PHỤ LỤC
Public Sub Mohoa(ByVal CSDL_goc As String)
Dim i As Long Dim j As Long Dim sql As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset
sql = "select * from tt_mo order by id" clsConn.GetRs connQLPK, sql, RS
If Not (RS.BOF And RS.EOF) Then
sql = "create table " & Trim(tblMO) & "(TID long " i = 1
Do While Not RS.EOF
sql = sql & "," & RS!ma & " Double " i = i + 1 RS.MoveNext Loop sql = sql & ")" clsConn.ExecQuery connQLPK, sql End If RS.Close
sql = "select * from " & CSDL_goc clsConn.GetRs connQLPK, sql, RS sql = "select * from Mo"
clsConn.GetRs connQLPK, sql, rs1 If Not (RS.BOF And RS.EOF) Then Do While Not RS.EOF
rs1.AddNew rs1.Fields(0).Value = RS.Fields(0).Value rs1.Update RS.MoveNext Loop For i = 1 To rs1.Fields.Count - 1 RS.MoveFirst rs1.MoveFirst
sql = "select * from tt_mo where ma='" & rs1.Fields(i).Name & "'"
clsConn.GetRs connQLPK, sql, rs2 If Not (rs2.EOF And rs2.BOF) Then Do While Not RS.EOF
' Loai nhi phan
If rs2!id_loaitm = 1 Then If rs2!hsa = 1 Then
rs1.Fields(i).Value = RS.Fields("" & rs2!ttgoc & "").Value
Else
rs1.Fields(i).Value = IIf(RS.Fields("" & rs2!ttgoc & "").Value = 0, 1, 0)
End If ' Loai tam giac
ElseIf rs2!id_loaitm = 2 Then
rs1.Fields(i) = Tamgiac(RS.Fields("" & rs2!ttgoc & "").Value, rs2!hsa, rs2!hsb, rs2!hsc)
' Loai hinh thang
rs1.Fields(i) = Hinhthang(RS.Fields("" & rs2!ttgoc & "").Value, rs2!hsa, rs2!hsb, rs2!hsc, rs2!hsd)
End If rs1.Update rs1.MoveNext RS.MoveNext Loop End If rs2.Close Next End If RS.Close rs1.Close End Sub
' Dua vao bang CK voi k = 1 Public Sub CK1()
Dim sql As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim rs3 As New ADODb.Recordset Dim i As Integer
Dim k As Integer ' Cap thu nhat
sql = "select * from tt_mo" clsConn.GetRs connQLPK, sql, RS If Not (RS.BOF And RS.EOF) Then sql = "select "
i = 1
Do While Not RS.EOF
If i + 1 > RS.RecordCount Then
sql = sql & " sum(" & RS!ma & ") as " & RS!ma Else
sql = sql & " sum(" & RS!ma & ") as " & RS!ma & ", " End If
RS.MoveNext i = i + 1 Loop
sql = sql & " from " & tblMO clsConn.GetRs connQLPK, sql, rs1 sql = "select * from Ck"
clsConn.GetRs connQLPK, sql, rs2 If Not (rs1.EOF And rs1.BOF) Then For i = 0 To rs1.Fields.Count - 1
sql = "select id from tt_mo where ma ='" & rs1.Fields(i).Name & "'"
clsConn.GetRs connQLPK, sql, rs3 rs2.AddNew
rs2!TT = rs1.Fields(i).Name
rs2!dohotro = rs1.Fields(i).Value / RecNum rs2!cap = 1
rs2!ck_truoc = 0
If (rs1.Fields(i).Value / RecNum) > fminsupp Then rs2!phobien = True
Else
rs2!thichhop = True
If Not (rs3.EOF And rs3.BOF) Then rs2!id_ttmo_tiep = rs3!id End If
rs2!tt_mo = rs1.Fields(i).Name rs2.Update
rs3.Close
sql = "insert into Ck_TTMo values(" & rs2!id & "," & rs2!id_ttmo_tiep & ")" clsConn.ExecQuery connQLPK, sql Next End If rs1.Close rs2.Close End If End Sub ' --- ' Cac ham bo tro cho viec tinh toan
Public Function max(ByVal x As Double, ByVal y As Double) As Double If x >= y Then max = x Else max = y End If End Function
Public Function min(ByVal x As Double, ByVal y As Double) As Double If x >= y Then min = y Else min = x End If End Function
Public Function min2(ByVal x As Double, ByVal y As Double, ByVal z As Double) As Double
Dim t As Double t = min(x, y) min2 = min(t, z) End Function
Public Function T1(ByVal x As Double, ByVal y As Double) As Double If x >= y Then T1 = y Else T1 = x End If End Function
Public Function T2(ByVal x As Double, ByVal y As Double) As Double If (x + y - x * y) = 0 Then T2 = 0 Else T2 = (x * y) / (x + y - x * y) End If End Function
T3 = x * y End Function
Public Function T4(ByVal x As Double, ByVal y As Double) As Double If (2 - (x + y - x * y)) = 0 Then T4 = 0 Else T4 = (x * y) / (2 - (x + y - x * y)) End If End Function
Public Function T5(ByVal x As Double, ByVal y As Double) As Double If (x + y) >= 1 Then Tl = x + y - 1 Else Tl = 0 End If End Function
Public Function T6(ByVal x As Double, ByVal y As Double) As Double If max(x, y) = 1 Then Td = min(x, y) Else Td = 0 End If End Function
Public Function NhiphanA(ByVal z As Double, ByVal a As Double, ByVal b As Double) As Double If b = 1 Then NhiphanA = 0 Else NhiphanA = 1 End If End Function
Public Function Tamgiac(ByVal z As Double, ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double
Dim t As Double Dim T1 As Double If b - a = 0 Then t = (z - a) / (b - a) Else t = 1 End If If c - b = 0 Then T1 = 1 Else T1 = (c - z) / (c - b) End If Tamgiac = max(min2(t, 1, T1), 0) End Function
Public Function Hinhthang(ByVal z As Double, ByVal a As Double, ByVal b As Double, ByVal c As Double, ByVal d As Double) As Double
Dim t As Double Dim T1 As Double
t = 1 Else t = (z - a) / (b - a) End If If d - c = 0 Then T1 = 1 Else T1 = (d - z) / (d - c) End If Hinhthang = max(min2(t, 1, T1), 0) End Function
Public Function F1(ByVal colname As String, ByVal tblname As String) As Double
Dim sql As String
Dim RS As New ADODb.Recordset Dim t As Double
Dim T1 As Double Dim T2 As Double
sql = "select sum(" & colname & " ) as tong from " & tblname End Function
'Dua dieu kien vao de fuc vu cho tinh do ho tro - Thuc hien sau khi Joint Public Sub Dieukien(ByVal cap As Integer)
Dim sql As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim rs3 As New ADODb.Recordset Dim rs4 As New ADODb.Recordset Dim rs5 As New ADODb.Recordset Dim i As Integer
Dim bien1 As String
sql = "select * from " & tblMO & " order by TID " clsConn.GetRs connQLPK, sql, RS
If cap = 1 Then
sql = "select * from tt_mo order by id " clsConn.GetRs connQLPK, sql, rs1
If Not (RS.EOF And RS.BOF And rs1.EOF And rs1.BOF) Then Do While Not RS.EOF
rs1.MoveFirst
Do While Not rs1.EOF
If RS.Fields("" & rs1!ma & "").Value >= rs1!nguong Then sql = "insert into dieukien(cot,TID,giatri)
values('" & rs1!ma & "'," & RS!TID & ",True)" Else
sql = "insert into dieukien(cot,TID,giatri) values('" & rs1!ma & "'," & RS!TID & ",False)"
End If clsConn.ExecQuery connQLPK, sql rs1.MoveNext Loop RS.MoveNext Loop End If rs1.Close
Else
Dim cot1 As String Dim cot2 As String
Dim value_cot1 As Boolean Dim value_cot2 As Boolean Dim value_cuoi As Boolean
sql = "select * from ck where cap = " & cap clsConn.GetRs connQLPK, sql, rs2
If Not (rs2.EOF And rs2.EOF) Then Do While Not rs2.EOF
RS.MoveFirst
Do While Not RS.EOF
sql = "select * from dieukien where (cot ='" & rs2!tt_truoc & "' or cot ='" & rs2!tt_mo & "' ) and TID=" & RS!TID clsConn.GetRs connQLPK, sql, rs3
If Not (rs3.EOF And rs3.BOF) Then If rs3.RecordCount = 2 Then rs3.MoveFirst
value_cot1 = rs3!giatri rs3.MoveNext
value_cot2 = rs3!giatri
value_cuoi = value_cot1 And value_cot2 sql = "insert into
dieukien(cot,TID,giatri,id_ck) values('" & rs2!TT & "'," & RS!TID & "," & value_cuoi & "," & rs2!id & ")"
clsConn.ExecQuery connQLPK, sql End If End If rs3.Close RS.MoveNext Loop rs2.MoveNext Loop End If rs2.Close End If End Sub
' Thay doi cau truc bang Mo de dua them cac truong du lieu la tap phobien Public Sub Alter_tbl_Mo(ByVal cap As Integer)
Dim sql As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim temp As String
Dim cot As String Dim tt1 As String Dim tt2 As String
sql = "select * from Ck where cap = " & cap & " and thichhop =true order by id "
clsConn.GetRs connQLPK, sql, RS If Not (RS.EOF And RS.BOF) Then Do While Not RS.EOF
cot = RS!TT tt1 = RS!tt_mo
sql = "alter table MO add column [" & cot & "] Double " clsConn.ExecQuery connQLPK, sql
sql = "select * from Mo"
clsConn.GetRs connQLPK, sql, rs1 If Not (rs1.EOF And rs1.BOF) Then Do While Not rs1.EOF
sql = "select * from dieukien where cot='" & RS!TT & "' and TID =" & rs1!TID
clsConn.GetRs connQLPK, sql, rs2 If Not (rs2.EOF And rs2.BOF) Then If rs2!giatri Then
rs1.Fields("" & cot & "") = Result_F(id_F1, rs1.Fields("" & Trim(tt1) & ""), rs1.Fields("" & Trim(tt2) & ""))
Else
rs1.Fields("" & cot & "") = Result_F(id_F2, rs1.Fields("" & Trim(tt1) & ""), rs1.Fields("" & Trim(tt2) & ""))
End If End If rs2.Close rs1.Update rs1.MoveNext Loop End If rs1.Close RS.MoveNext Loop End If RS.Close End Sub
' Thuc hien noi cac tap lai voi nhau Public Sub Joint(ByVal cap As Integer) Dim sql As String
Dim sql2 As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim rs3 As New ADODb.Recordset Dim rs4 As New ADODb.Recordset Dim rs5 As New ADODb.Recordset Dim id_ttmo As Long
Dim Ma_tt_mo As String Dim tt_goc As String Dim id_ck_goc As Long Dim id_ck2 As Long Dim id_ck_new As Long
sql = "select * from ck where cap =" & cap & " and phobien =true order by id"
clsConn.GetRs connQLPK, sql, RS If Not (RS.EOF And RS.BOF) Then Do While Not RS.EOF
tt_goc = RS!TT id_ck_goc = RS!id
sql = "select * from ck where cap = " & cap & " and id >" & id_ck_goc & " and phobien=true order by id"
clsConn.GetRs connQLPK, sql, rs1 If Not (rs1.EOF And rs1.BOF) Then
Do While Not rs1.EOF id_ck2 = rs1!id
id_ttmo = Check(id_ck_goc, id_ck2, cap) If id_ttmo > 0 Then
' Insert vao bang Ck
Ma_tt_mo = Ma_ttmo(id_ttmo) sql = "select * from ck" clsConn.GetRs connQLPK, sql, rs2 rs2.AddNew rs2!cap = cap + 1 rs2!ck_truoc = id_ck_goc rs2!tt_truoc = tt_goc
rs2!TT = tt_goc & "," & Trim(Ma_tt_mo) rs2!id_ttmo_tiep = id_ttmo
rs2!tt_mo = Ma_tt_mo rs2.Update
id_ck_new = rs2!id rs2.Close
' Insert vao bang Ck_ttmo
' sql = "select Ck_TTMo.id_tt_mo,tt_mo.ma from Ck_TTMo,tt_mo where tt_mo.id=ck_ttmo.id_tt_mo and Ck_TTMo.id_ck=" & rs!id sql = "select id_tt_mo from Ck_TTMo where id_ck=" & id_ck_goc
clsConn.GetRs connQLPK, sql, rs3 If Not (rs3.EOF And rs3.BOF) Then Do While Not rs3.EOF
'sql2 = "insert into
ck_ttmo(id_ck,id_tt_mo) values(" & rs2!id & "," & rs3!id_tt_mo & ")"
sql2 = "insert into ck_ttmo(id_ck,id_tt_mo) values("
sql2 = sql2 & id_ck_new & "," sql2 = sql2 & rs3!id_tt_mo & ")" clsConn.ExecQuery connQLPK, sql2 rs3.MoveNext
Loop End If rs3.Close
sql2 = "insert into ck_ttmo(id_ck,id_tt_mo) values("
sql2 = sql2 & id_ck_new & "," sql2 = sql2 & id_ttmo & ")" clsConn.ExecQuery connQLPK, sql2 End If rs1.MoveNext Loop End If rs1.Close RS.MoveNext Loop End If RS.Close End Sub
' Kiem tra dieu kien de tap1 noi voi tap2
Public Function Check(id_tap1 As Long, id_tap2 As Long, cap As Integer) As Long
Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim rs3 As New ADODb.Recordset Dim i As Integer, j As Integer Dim Result As Boolean
Dim find As Boolean Dim id_tt_mo As Long Result = False id_tt_mo = 0 find = False
'sql = "select id_tt_mo from ck_ttmo where id_ck=" & id_tap1 & " order by id_tt_mo"
sql = "select ck_ttmo.id_tt_mo,tt_mo.ttgoc from ck_ttmo,tt_mo where tt_mo.id = ck_ttmo.id_tt_mo and ck_ttmo.id_ck=" & id_tap1 & " order by id_tt_mo"
clsConn.GetRs connQLPK, sql, RS
sql = "select ck_ttmo.id_tt_mo,tt_mo.ttgoc from ck_ttmo,tt_mo where tt_mo.id = ck_ttmo.id_tt_mo and ck_ttmo.id_ck=" & id_tap2 & " order by id_tt_mo"
clsConn.GetRs connQLPK, sql, rs1
If Not (RS.EOF And RS.BOF And rs1.EOF And rs1.BOF) Then
If (RS.RecordCount = rs1.RecordCount) And (RS.RecordCount = cap) Then
i = 1
RS.MoveFirst rs1.MoveFirst
For i = 1 To cap - 1
If RS!id_tt_mo = rs1!id_tt_mo Then RS.MoveNext rs1.MoveNext Result = True Else Exit For Result = False End If Next If i = cap Then
' Kiem tra cung thuoc tinh goc khong If (RS!ttgoc = rs1!ttgoc) Then
Result = False
' Kiem tra xem q.Ik-1 <p.Ik-1
ElseIf RS!id_tt_mo < rs1!id_tt_mo Then ' Kiem tra co ban ghi nao trung ko
sql = "select * from ck where cap=" & cap + 1 & " and ck_truoc = " & id_tap1
clsConn.GetRs connQLPK, sql, rs2 If Not (rs2.EOF And rs2.BOF) Then
' Da co ban ghi truoc cung thuoc tinh goc Do While Not rs2.EOF
sql = "select id_tt_mo from ck_ttmo where id_ck = " & rs2!id & " and id_tt_mo not in (select id_tt_mo from ck_ttmo where id_ck = " & id_tap1 & ")"
clsConn.GetRs connQLPK, sql, rs3 If Not (rs3.EOF And rs3.BOF) Then
If rs3!id_tt_mo = rs1!id_tt_mo Then find = True
End If End If rs3.Close
If Not find Then rs2.MoveNext Else
rs2.MoveLast End If
Loop
If Not find Then
id_tt_mo = rs1!id_tt_mo Result = True End If Else id_tt_mo = rs1!id_tt_mo Result = True End If rs2.Close End If Else Result = False End If End If End If RS.Close rs1.Close Check = id_tt_mo End Function
' Tinh do ho tro va xem no pho bien hay ko Public Sub Do_HT(ByVal cap As Integer) Dim sql As String
Dim RS As New ADODb.Recordset Dim rs1 As New ADODb.Recordset Dim rs2 As New ADODb.Recordset Dim dohotro As Double
sql = "select * from ck where cap = " & cap & " and thichhop =true" clsConn.GetRs connQLPK, sql, RS
If Not (RS.EOF And RS.BOF) Then Do While Not RS.EOF
sql = "select sum([" & RS!TT & "]) as AA from Mo" clsConn.GetRs connQLPK, sql, rs1
If Not (rs1.EOF And rs1.BOF) Then dohotro = rs1!AA / RecNum RS!dohotro = dohotro
RS!phobien = IIf(dohotro >= fminsupp, True, False) End If rs1.Close RS.Update RS.MoveNext Loop End If RS.Close End Sub
Public Function Ma_ttmo(id_ttmo As Long) As String Dim sql As String