- Sinh luật: Sử dụng thủ tục sinh luật từ cỏc tậpmục phổ biến đó nờu đối với cơ sở dữ liệu nhị phõn trờn.
2. Phõn tớch thiết kế chƣơng trỡnh và cài đặt cỏc thuật toỏn
Trờn cơ sở thiết kế của hệ thống quản lý dữ liệu tai nạn giao thụng, hồ sơ một vụ tai nạn giao thụng bao gồm cỏc bảng dữ liệu chớnh:
- Dữ liệu tai nạn giao thụng: Thụng tin chớnh về vụ tai nạn giao thụng (TNGT) - Phƣơng tiện: Thụng tin về cỏc phƣơng tiện liờn quan tới vụ tai nạn giao thụng
- Ngƣời điều khiển phƣơng tiện: Thụng tin về ngƣời điều khiển phƣơng tiện liờn đới tới TNGT
- Hành khỏch bộ hành: Thụng tin liờn quan tới hành khỏch trờn phƣơng tiện hoặc ngƣời đi bộ liờn đới tới vụ TNGT
Một vụ tai nạn giao thụng cú thể bao gồm nhiều phƣơng tiện liờn đới, nhiều ngƣời điểu khiển và nhiều hành khỏch bộ hành. Do đú quan hệ giữa thực thể số liệu tai nạn với cỏc thực thể núi trờn là quan hệ một nhiều.
Bờn cạnh cỏc bảng dữ liệu chớnh núi trờn hệ thống quản lý số liệu tai nạn giao thụng cũn bao gồm cỏc danh mục sau:
- Danh mục chuyển động: Chuyển động của phƣơng tiện trƣớc thời điểm gõy TNGT - Danh mục dự kiến xử lý: Dự kiến của cảnh sỏt xử lý vụ TNGT
- Danh mục hạn giấy phộp lỏi xe: Hạn của giấy phộp lỏi xe - Danh mục hạn kiểm định
- Danh mục hạng giấy phộp lỏi xe
- Danh mục hành động: Hành động trƣớc thời điểm TNGT - Danh mục hỡnh thức tai nạn
- Danh mục loại phƣơng tiện
- Danh mục lỗi điều khiển: Lỗi của ngƣời điều khiển phƣơng tiện gõy TNGT - Danh mục nghề: Nghề của ngƣời điều khiển phƣơng tiện
- Danh mục nguyờn nhõn gõy tai nạn - Danh mục nhón hiệu phƣơng tiện
- Danh mục nồng độ rƣợu: Nồng độ rƣợu cú trong mỏu tại thời điểm gõy TNGT - Danh mục thƣơng tật: Tỡnh trạng thƣơng tật của cỏc nạn nhõn
- Danh mục tỡnh trạng kỹ thuật của phƣơng tiện - Danh mục tỡnh trạng kỹ thuật của đƣờng cấu phà
- Danh mục cỏc tuyến đƣờng - Danh mục Tỉnh/thành phố - Danh mục Quận/huyện
Cỏc thực thể danh mục trờn bao gồm 02 trƣờng cơ bản là mó và nội dung. Cỏc thực thể dữ liệu chớnh cú cấu trỳc cơ bản sau:
Bảng số liệu tai nạn
Số TT Tờn trƣờng Mụ tả
1. id Mó số hồ sơ
1. so_bc Số hệ thống
2. so_bc_dv Số bỏo cỏo
3. don_vi Mó đơn vị
4. gio Giờ xảy ra tai nạn
5. phut Phỳt
6. thoi_gian Ngày thỏng năm xảy ra tai nạn
7. km Tại km
8. ten_duong Tờn đƣờng 9. ma_tuyen Mó tuyến đƣờng
10. d_ql Loại đƣờng
11. ma_qh Mó quận huyện
12. tt_nt Tai nạn xảy ra ở thành thị hay nụng thụn 13. t3 Số ngƣời bị chết 14. t4 Số ngƣời bị thƣơng 15. t51 Số xe con bị hủy 16. t52 Số xe khỏch bị hủy 17. t53 Số xe tải bị hủy 18. t54 Số mụ tụ bị hủy 19. t55 Số xe đạp bị hủy
20. t56 Số phƣơng tiện khỏc bị hủy 21. t61 Số xe con bị hỏng
22. t62 Số xe khỏch bị hỏng 23. t63 Số xe tải bị hỏng
24. t64 Số mụ tụ bị hỏng 25. t65 Số xe đạp bị hỏng 26. t66 Số phƣơng tiện khỏc bị hỏng 27. t7 Thiệt hại 28. t8 Thời thiết 29. t9 Mật độ giao thụng 30. t10 Gõy tai nạn và bỏ chạy 31. t11 Hỡnh thức tai nạn 32. t121 Loại mặt đƣờng 33. t122 Dạng đƣờng 34. t123 Chiếu sỏng 35. t124 Nỳt giao thụng 36. t125 Giao cắt với đƣờng sắt 37. t126 Tổ chức giao thụng 38. t127 Cấp đƣờng 39. t128 Cú bỏo hiệu 40. t129 Tỡnh trạng mặt đƣờng 41. t14 Dự kiến xử lý
42. tom_tat Túm tắt nội dung vụ tai nạn 43. ng_nhan Nguyờn nhõn gõy tai nạn 44. tom_tatnn Túm tắt nguyờn nhõn tai nạn 45. ng_nhan2 Nguyờn nhõn thứ hai
46. ng_nhan3 Nguyờn nhõn thứ ba 47. ng_nhan4 Nguyờn nhõn thứ tƣ 48. ng_nhan5 Nguyờn nhõn thứ năm 49. nguoi_nhap Ngƣời nhập liệu 50. ngaynhap Ngày nhận liệu 51. so_do Sơ đồ hiện trƣờng
52. toadox Tọa độ X địa điểm gõy tai nạn 53. toadoy Tọa độ Y địa điểm gõy tain nạn
Bảng phương tiện:
Số TT Tờn trƣờng Mụ tả
1 so_bc Số hệ thống 2 so_pt Số phƣơng tiện
3 pt_tn Phƣơng tiện gõy tai nạn 4 loai_pt Loại phƣơng tiện 5 nhanhieu Nhón hiệu
6 bien Biển kiểm soỏt 7 chu_pt Chủ phƣơng tiện
8 dc_chu_pt Địa chỉ chủ phƣơng tiện 9 han_kd Hạn kiểm định
10 ch_dong Chuyển động trƣớc khi tai nạn 11 tt_vt Tỡnh trạng vận tải
12 tt_kt Trỡnh trạng kỹ thuật của phƣơng tiện 13 ph_tien_id ID của phƣơng tiện
Bảng người điều khiển phương tiện:
Số TT Tờn trƣờng Mụ tả
1 so_bc Số hệ thống 2 so_pt Số phƣơng tiện
3 ho_ten Họ và tờn ngƣời điều khiển phƣơng tiện 4 gioi_tinh Giới tớnh
5 tuoi Tuổi
6 quoc_tich Quốc tịch 7 dia_chi Địa chỉ 8 tuoi_nghe Tuổi nghề
9 sogplx Số giấy phộp lỏi xe 10 hang_gplx Hạng giấy phộp lỏi xe 11 han_gplx Hạn giấy phộp lỏi xe 12 nd_ruoi Nồng độ rƣợu
13 bh_at Mũ bảo hiểm – Dõy an toàn 14 loi_dk Lỗi điều khiển
15 thuong_tat Thƣơng tật
16 ng_dkpt_id ID ngƣời điều khiển phƣơng tiện
Hành khỏch bộ hành và người trờn phương tiện:
Số TT Tờn trƣờng Mụ tả 1 so_bc Số hệ thống 2 ho_ten Họ và tờn 3 gioi_tinh Giới tớnh 4 tuoi Tuổi 5 quoc_tich Quốc tịch 6 dia_chi Địa chỉ
7 trenpt Trờn phƣơng tiện
8 hk_bh Hành khỏch hay bộ hành
9 nghe Nghề nghiệp
10 hanh_dong Hành động trƣớc tai nạn 11 thuong_tat Thƣơng tật
12 hkbh_id ID hành khỏch bộ hành
Theo cỏc chuyờn đề liệt kờ núi trờn và dựa vào dữ liệu của hệ thống ta thấy rằng cỏc luật cần khai phỏ ở đõy là cỏc luật kết hợp định lƣợng. Để khai phỏ dữ liệu tỡm cỏc luật, ta sẽ phải thực hiện cỏc bƣớc cơ bản sau:
b1). Trớch lọc dữ liệu từ cơ sở dữ liệu mẫu (nguyờn mẫu cơ sở dữ liệu TNGT) về cơ sở dữ liệu phục vụ chuyờn đề cần nghiờn cứu (cơ sở dữ liệu D).
b2). Duyệt cơ sở dữ liệu D, đếm số lần xuất hiện của từng mục, loại bỏ cỏc mục khụng đủ độ hỗ trợ.
b3). Sắp cỏc mục đủ độ hỗ trợ theo thứ tự giảm dần của độ hỗ trợ (tạo danh sỏch L). b4). Duyệt cơ sở dữ liệu lần 2 xõy dựng cõy FP-tree.
b5). Sử dụng thuật toỏn FP-Growth tỡm cỏc tập mục phổ biến. b6). Sinh luật từ cỏc tập mục phổ biến.
Chƣơng trỡnh đƣợc xõy dựng bằng VB 6.0 và cơ sở dữ liệu SQL Server, do đú dƣới đõy ta sẽ cỏi đặt thuật toỏn bằng ngụn ngữ VB 6.0.
Vớ dụ minh họa cỏc bƣớc và cài đặt thuật toỏn ở phần dƣới đõy là khai phỏ dữ liệu theo lỗi với tỡnh trạng thƣơng tật
Bước 1: Trớch lọc dữ liệu từ cơ sở nguyờn mẫu
Để trớch lọc dữ liệu từ cơ sở dữ liệu nguyờn mẫu thành cơ sở dữ liệu cho phộp sinh luật tỡm hiểu quan hệ giữa lỗi với tỡnh trạng thƣơng tật ta quan tõm tới bảng dữ liệu ngƣời điều khiển phƣơng tiện và cỏc danh mục lỗi điều khiển, danh mục thƣơng tật. Trờn cơ sở dữ liệu của cỏc bảng này ta biến cỏc giỏ trị của thuộc tớnh thành thuộc tớnh. Vỡ thế đầu tiờn ta tạo ra một bảng dữ liệu tạm thời với cỏc trƣờng là thể hiện của cỏc giỏ trị trong 02 danh mục lỗi điều khiển và thƣơng tật. Cỏc trƣờng này đƣợc tạo theo nguyờn tắc
Tờn bảng + mó thể hiện giỏ trị cụ thể
Vớ dụ: L01 chỉ ra rằng trƣờng này thuộc bảng lỗi thể hiện giỏ trị chạy quỏ tốc độ quy định. Giỏ trị của bảng đƣợc cập nhật theo nguyờn tắc: Mỗi lần duyệt bảng dữ liệu ngƣời điều khiển phƣơng tiện ở trƣờng lỗi điều khiển nếu giỏ trị là 01 thỡ trong bảng dữ liệu tạm thời trƣờng L01 sẽ đƣợc cộng thờm 1 đơn vị
Tƣơng tự đối với cỏc trƣờng hợp cũn lại.
Bưới 2 và 3: Duyệt cơ sở dữ liệu D, đếm số lần xuất hiện của từng mục, loại bỏ
cỏc mục khụng đủ độ hỗ trợ sau đú sắp xếp tạo danh sỏch L.
Giả sử rằng rsMining là ADODB.Recordeset đƣợc mở gắn với bảng dữ liệu núi trờn khi đú nội dung cụng việc cú thể cài đặt bằng ngụn ngữ VB 6.0 nhƣ sau:
Public Type Tansuat 'Create user-defined type. Name As String
Tansuat As Long Vitri() As Long End Type
‘************************* Dim Mang() as TANSUAT Dim Mang() as TANSUAT
Dim i,j , f As Integer, sName As string Dim sSel as string
//Tớnh tần suất
Redim Mang(rsMining.Fields.Count -1) Do While Not rsMining.EOF
For i =0 to rsMining.Fields.Count -1
If Not isnull(rsMining.Fields(i).Value) then Mang(i).Name =rsMining.Fields(i).Name Mang(i).Tansuat =Mang(i).Tansuat +1 End if Next rsMining.MoveNext Loop //Sắp xếp
For i=0 to Ubound(Mang(i))
For j = i +1 to Ubound(Mang(i))
If Mang(j).Tansuat > Mang(i).Tansuat Then sName=Mang(i).Name f = Mang(i).Tansuat Mang(i).Name = Mang(j).Name Mang(i).Tansuat = Mang(j).Tansuat Mang(j).Name = sName Mang(j).Tansuat = f End if Next Next //Loại bỏ cỏc mục khụng cú đủ độ hỗ trợ
sSel=””//Chuỗi lấy thứ tự cỏc trƣờng trong cơ sở dữ liệu tƣơng ứng danh sỏch L For i=0 to Ubound(Mang(i))
If Mang(i).Tansuat < minsupp Then
Redim Preserve Mang(i-1) //Loại bỏ cỏc phần tử mảng từ phần tử thứ i Exit For //Khụng cần duyệt mảng nữa
End if
sSel=sSel & Mang(i).Name Next
Bước 4: Xõy dựng cầy FP-tree dựa trờn danh cơ sở dữ liệu và danh sỏch L
Để cài đặt ta sử dụng mảng cỏc nỳt, mỗi nỳt là một phần tử của mảng cỏc bản ghi tự định nghĩa.
Public Type myTree Ten As String Tansuat As Long Cha As Long Con() As Long End Type
Với cài đặt này, ta cú thể xõy dựng cõy nhƣ là một mảng cỏc nỳt. Tại mỗi lần duyệt cơ sở dữ liệu ta sẽ đƣa thờm vào cõy cỏc mục theo thuật toỏn đệ quy dƣới đõy:
Private Sub Create_FPTree(ByVal strItem As String, ByRef myTree() As myTree, ByVal iRoot As Long, ByVal myifrequent As Long, ByRef HeaderTable() As Tansuat)
'Thuật toỏn
'Input: Chuỗi cỏc mục cần thờm vào,Cõy T, vị trớ nỳt gốc, bảng liờn kết 'Out put: Cõy FP-Tree sau khi đó thờm cỏc mục
Dim i As Long, j As Long
Dim m As Long, n As Long, k As Long Dim strTemp As String
m = UBound(myTree(iRoot).Con) If m > 0 Then
For i = 1 To m
k = myTree(iRoot).Con(i)
If myTree(k).Ten = Mid(strItem, 1, 3) Then
myTree(k).Tansuat = myTree(k).Tansuat + myifrequent Exit For
End If Next
If i > m Then 'NGHIA LA KHONG CO CON NAO THAO MAN k = UBound(myTree) + 1
ReDim Preserve myTree(k)
myTree(k).Ten = Mid(strItem, 1, 3) myTree(k).Tansuat = myifrequent myTree(k).Cha = iRoot
ReDim Preserve myTree(k).Con(0)
ReDim Preserve myTree(iRoot).Con(m + 1) myTree(iRoot).Con(m + 1) = k
Call Node_Link(Mid(strItem, 1, 3), k, HeaderTable) End If
If Len(strItem) > 3 Then strTemp = Mid(strItem, 4)
Call Create_FPTree(strTemp,myTree,k,myifrequent, HeaderTable) End If
Else
k = UBound(myTree) + 1 ReDim Preserve myTree(k)
myTree(k).Ten = Mid(strItem, 1, 3) myTree(k).Tansuat = myifrequent myTree(k).Cha = iRoot
ReDim Preserve myTree(k).Con(0)
ReDim Preserve myTree(iRoot).Con(m + 1) myTree(iRoot).Con(m + 1) = k
Call Node_Link(Mid(strItem, 1, 3), k, HeaderTable) If Len(strItem) > 3 Then
strTemp = Mid(strItem, 4)
Call Create_FPTree(strTemp, myTree, k, myifrequent, HeaderTable) End If
End If End Sub
Tƣ tƣởng chớnh của thuật toỏn đƣợc cài đặt ở đõy là:
- Với cõy cú ID nỳt gốc là iRoot ta duyệt qua tất cả cỏc con của Cõy
+ Nếu tỡm thấy nỳt con nào đú cú tờn trựng với phần tử đầu tiờn của chuỗi thỡ ta chỉ việc tăng số đếm cho nỳt con này
+ Nếu chuỗi đƣa vào vẫn cũn giỏ trị sau khi cắt bỏ phần tử đầu tiờn thỡ ta gọi đệ quy tới thủ tục này một lần nữa
- Với tất cả cỏc nỳt con của nỳt gốc cú ID là iRoot mà ta khụng tỡm thấy nỳt nào cú tờn trựng với phần tử đầu tiờn của chuỗi cỏc mục thỡ ta chỉ việc tạo thờm số nỳt bằng số phần tử của chuỗi với chỳ ý là con của nỳt gốc cú ID là iRoot sẽ là phần tử đầu tiờn của chuỗi, cỏc phần tử cũn lại trong chuỗi sẽ là con của phần tử đầu tiờn của chuỗi.
Song song với việc thờm cỏc mục vào cõy, ta sẽ xõy dựng luụn bảng liờn kết định rừ vị trớ của cỏc mục trờn cõy. Việc này đƣợc thực thi thụng qua thủ tục Node_link
Private Sub Node_Link(ByVal Item As String, ByVal iPos As Long, ByRef Mang() As Tansuat)
Dim i As Integer, j As Integer Dim m As Integer
m = UBound(Mang) For i = 0 To m
If Mang(i).Name = Item Then n = UBound(Mang(i).Vitri) If n > 0 Then
For j = 1 To n
If Mang(i).Vitri(j) = iPos Then Exit Sub Next
If j > n Then
ReDim Preserve Mang(i).Vitri(n + 1) Mang(i).Vitri(n + 1) = iPos
End If Else
ReDim Preserve Mang(i).Vitri(n + 1) Mang(i).Vitri(n + 1) = iPos End If Exit For End If Next End Sub
Do một mục cú thể cú nhiều vị trớ trờn cõy FP-Tree cho nờn ta phải cú một mảng cỏc vị trớ. Ứng với mỗi vị trớ của mục trờn cõy FP-Tree là một phần tử của mảng Vitri
Bước 5: Duyệt cõy FP-Tree để tỡm cỏc tập mục phổ biến dựa vào thuật toỏn
Fp_Growth. Ở đõy ta bỏ qua cỏc tập mục phổ biến cú một mục vỡ cỏc luật sinh ra cú dạng
A->{} hay {} -> là khụng cú ý nghĩa
Private Sub FP_Growth(ByRef HeaderTable() As Tansuat, myT() As myTree, ByVal Item As String)
Dim i As Long, j As Long, k As Long Dim m As Long, n As Long, h As Long Dim myString As String, strTemp As String Dim fixId As Long, ifrequent As Long Dim myHead() As Tansuat
Dim myCay() As myTree
Dim bData As Boolean m = UBound(myT) n = UBound(HeaderTable) 'myString = Item If SingleTree(myT) Then strTemp = "" For i = 1 To m
strTemp = strTemp & myT(i).Ten Next
Call Generate_Itemset(strTemp, Item, myItemset, myT) 'Lay ra chuoi chua ta cac ten cac nut tren cay
'Tao mang chua tat ca cac tap con co the cua tap cac nut noi tren voi do ho tro la min trong tat ca
'Ket qua cuoi cung la duoc mang chua cac tap muc pho bien 'Bo qua luat A->{} va nguoc lai
Else
For i = 0 To n bData = False
k = UBound(HeaderTable(n - i).Vitri) cn.Execute "Delete from Mytree" 'Duyet cay day vao CSDL
For j = 1 To k
h = HeaderTable(n - i).Vitri(j) ifrequent = 0
strTemp = myT(h).Ten ifrequent = myT(h).Tansuat
'Lay cha cua muc strtemp de thuc thi h = myT(h).Cha
strInsert = "" strValue = "" Do While h > 0
strInsert = strInsert & "," & myT(h).Ten strValue = strValue & ",1"
h = myT(h).Cha Loop
strInsert = Mid(strInsert, 2) strValue = Mid(strValue, 2)
strInsert = "Insert into MYTREE(mau,Tansuat," & strInsert & ")"
strValue = " Values('" & strTemp & "'," & ifrequent & "," & strValue & ")"
cn.Execute strInsert & strValue bData = True
End If Next
'Duyet CSDL loai bo muc khong dap ung nguong va tao headertable If bData Then
Call Create_List("MyTree", myHead) 'Duyet CSDL lan 2 tao Cay phu thuoc
If UBound(myHead) = 0 And myHead(0).Tansuat < minsupp Then 'Khong lam gi ca nua
Else
'Neu cay phu thuoc khong rong thi goi de quy myString = myString & strTemp
ReDim myCay(0) ReDim myCay(0).Con(0) myCay(0).Cha = 0 myCay(0).Tansuat = 0 myCay(0).Ten = "" myCay(0).Con(0) = 0 Call Tao_cay("MyTRee", myCay, myHead)
If UBound(myCay) > 0 Then Call FP_Growth(myHead, myCay, myString) End If myString = "" bData = False End If Next End If End Sub