3. 1. 5. 1. Chọn cấu trúc bảng dữ liệu
Do số item trong một giao tác không thể biết trước và có thể khác nhau nên cấu trúc bảng dạng D (tid, item1, item2, …, itemn) là không thực tế. Ngoài ra, trong
thực tế, số item tối đa trong một giao tác có thể vượt quá số cột mà Hệ quản trị CSDL hỗ trợ. Chẳng hạn đối với SQL 2000/2005, số cột tối đa cho phép trong một bảng là 1024. Trong trường hợp này, cấu trúc bảng có dạng D (tid, item1, item2, …, itemn) là không khả thi vì n phải nhỏ hơn 1024. Ngoài ra, nếu lưu trữ bảng có nhiều cột, thì rất có thể sẽ lãng phí bộ nhớ khi mà số item trong các giao tác khác nhau quá nhiều. Do đó, để không phụ thuộc vào số item trong một giao tác, không phụ thuộc vào giới hạn cột trong một bảng của Hệ quản trị CSDL, và để tiết kiệm bộ nhớ, cấu trúc dữ liệu đề xuất cho việc khai thác có dạng D (Tid, List of Items).
Ví dụ:
Tid Danh sách các Items
1 Cefalecin, Paracetamol, AlphaChymotrypcin, Vitamin C, Vitamin B1
2 Cefalecin, Codacmin, Alpha Chymotrypcin, Vitamin C, Vitamin B1
3 Ameflu, Clorpheniramin, Vitamin C 4 Ameflu, Pamin, Cảm xuyên hương
Bảng 3. 1. Cấu trúc bảng dữ liệu ban đầu
Để thuận lợi trong quá trình cài đặt công việc khai thác dữ liệu tôi chuyển đổi cấu trúc bảng dữ liệu ban đầu dạng D (Tid, List of Items) về bảng có cấu trúc dạng D (Tid, Item). Tid Item 1 Cefalecin 1 Paracetamol 1 AlphaChymotrypcin 1 Vitamin C 1 Vitamin B1
2 Cefalecin 2 Codacmin 2 Alpha Chymotrypcin 2 Vitamin C 2 Vitamin B1 3 Ameflu 3 Clorpheniramin 3 Vitamin C 4 Ameflu 4 Pamin 4 Cảm xuyên hương
Bảng 3. 2. Cấu trúc bảng dùng để khai phá dữ liệu
3. 1. 5. 2. Giảm kích thước đầu vào
Khi chúng ta xét độ tin cậy hoặc tính độ tin cậy của một luật thì trước chúng ta phải tính độ hỗ trợ (hay độ thường xuyên của luật đó) và phải xét độ hộ trợ cho từng thuộc tính. Để giảm thời gian duyệt trong mỗi lần thực hiện các bài toán được đưa ra phía trên ta sẽ thực hiện giảm kích thước của bảng dữ liệu đầu vào.
Câu lệnh SQL sau đây giúp việc giảm kích thước bảng khaithac_bandau (Tid, item) SELECT * FROM khaithac_bandau GROUP BY item HAVING COUNT (*) >= α 3. 2. Chương trình thử nghiệm
Trường Cao đẳng Y tế Phú Thọ là một trường đào tạo về y học, các học viên đều sẽ phải trải qua các môn học về thuốc. Chương trình thử nghiệm này nhằm ứng dụng các bài toán 2, bài toán 3, bài toán 4 vào CSDL được thu thập trong thực tế từ đơn thuốc của phòng khám đa khoa trường Cao đẳng Y tế Phú Thọ về một loại bệnh
cúm. Kết quả này sẽ giúp ích cho các em học sinh sinh viên trong quá trình học dược lý, tiến tới có thể xây dựng một chương trình lớn bao gồm nhiều tri thức về thuốc và bệnh hơn nữa để áp dụng trong thực tiễn việc dạy và học dược lý.
Chương trình được cài đặt bằng Microsoft Visual Basic 6. 0, chạy trên máy tính PC CPU Intel (R) Pentium (R), bộ nhớ trong 2GB RAM, sử dụng hệ điều hành Windows XP Professional. Các thuật toán được thử nghiệm với dữ liệu khoảng 100 đơn thuốc về bệnh cúm lấy tại phòng khám đa khoa Trường Cao đẳng Y tế Phú Thọ, đó là các đơn thuốc của phòng khám qua quá trình khám chữa bệnh từ năm 2014 cho đến nay.
Hình 3. 1. Mẫu đơn thuốc của Phòng khám đa khoa Trường cao đẳng Y Phú Thọ
3. 2. 1. Cơ sở dữ liệu của bài toán
Cấu trúc dữ liệu ban đầu được nhập vào bảng khaithac_bandau (Tid, Items) trong đó:
Tid: kiểu số nhập mã giao dịch
Hình 3. 2. Minh họa cấu trúc dữ liệu ban đầu
Cấu trúc dữ liệu sau khi chuyển đổi được lưu vào bảng data_daxuly (Tid, Item) trong đó:
Tid: kiểu số nhập mã giao dịch
Item: kiểu chuỗi ghi một mặt hàng trong mỗi lần giao dịch
Hình 3. 3. Cấu trúc dữ liệu dùng để khai phá
Với dữ liệu như trên, chương trình thiết kế mỗi một bài toán được viết riêng thành một thủ tục, ta chạy bài toán nào chương trình sẽ gọi thủ tục đó.
3. 2. 2. Kết quả khai phá dữ liệu khi thực hiện các bài toán
Chương trình sẽ gọi thủ tục dbo. doluat_sc, các ký tự X Y nhập vào được gán thành các biến mh1, mh2. Sau đó chương trình chạy 2 vòng lặp cho mh1, mh2 để đếm số lần lặp của mh1, mh2 trong bảng data_daxuly. Độ hỗ trợ và độ tin cậy được tính như sau:
Độ hỗ trợ: Số lần lặp của X và Y/ Số các đơn thuốc Độ tin cậy: Số lần lặp của X và Y/ Số lần lặp X
Code thử nghiệm bài toán tính độ hỗ trợ và độ tin cậy của luật:
setANSI_NULLSON
setQUOTED_IDENTIFIERON
go
ALTERfunction [dbo]. [sc_11](@string1 nvarchar(100), @string2 nvarchar(100))
returns @temptable table(mh1 nvarchar(50), mh2 nvarchar(50), supp real, conf real
)
AS BEGIN
declare @hienthi1 nvarchar(100)
declare @hienthi2 nvarchar(100)
declare @s real declare @c real declare @t1 real declare @t2 real declare @t3 real declare @t10 real
Set @hienthi1='{'+''+@string1+''+'}'+'=>'
Set @hienthi2='{'+''+@string2+''+'}'
select @t1=count(*)from dbo. transaction2
mh=ltrim(rtrim(@string1))
select @t10=supp from bang_2mh2 where(mathang1=ltrim(rtrim(@string1))and
mathang2=ltrim(rtrim(@string2)))
ifNOTexiStS(select*from data_daxuly2 where mh=ltrim(rtrim(@string1))) ORNOTexiStS(select*from data_daxuly2 where mh=ltrim(rtrim(@string2)))
BEGIN
Set @s=0--@t10/@t1
Set @c=0--@t10/@t2
Insertinto @temptable(MH1, MH2, supp, conf)
values(@hienthi1, @hienthi2, @s, @c)
end ELSE begin if @t10>0 or @t10=0 begin set @s=@t10/@t1 Set @c=@t10/@t2 end else begin Set @s=0 Set @c=0 end
Insertinto @temptable(mh1, mh2, supp, conf)
values (@hienthi1, @hienthi2, @s, @c)
end Return END
Màn hình kết quả thử nghiệm tính độ hỗ trợ và độ tin cậy của luật:
Hình 3. 4. Tính độ hỗ trợ và độ tin cậy của luật {Cefalecin} => {Paracetamol}
Hình 3. 5. Tính độ hỗ trợ và độ tin cậy của một luật {Decolgen}=>{Vitamin C}
Bài toán này sử dụng cách tính độ hỗ trợ và độ tin cậy của luật giống như bên trên vừa trình bày, sau khi có kết quả sẽ so sánh với độ hỗ trợ, độ tin cậy mà nhà quản lý, người sử dụng đưa ra để đánh giá. Nếu độ hỗ trợ, độ tin cậy mà lớn hơn giá trị nhà quản lý, người sử dụng đưa ra thì đánh giá là “Không tin cậy”. Ngược lại, nếu nhỏ hơn thì sẽ đánh giá là “Tin cậy”.
Code thử nghiệm bài toán đánh giá độ tin cậy của luật theo ngưỡng:
setANSI_NULLSON
setQUOTED_IDENTIFIERON
go
ALTERfunction [dbo]. [DGKQ_11](@string1 nvarchar(100), @string2
nvarchar(100), @sp real, @cf real)
returns @temptable table(mh1 nvarchar(50), mh2 nvarchar(50), supp real, conf real
, danhgia nvarchar(100) )
AS BEGIN
declare @hienthi1 nvarchar(100)
declare @hienthi2 nvarchar(100)
declare @s real declare @c real declare @D nvarchar(100) declare @t1 real declare @t2 real declare @t3 real declare @t10 real
Set @hienthi1='{'+''+@string1+''+'}'+'=>'
Set @hienthi2='{'+''+@string2+''+'}'
select @t1=count(*)from dbo. transaction2
mh=ltrim(rtrim(@string1))
select @t3=count(distinct magd)from data_daxuly2 where
mh=ltrim(rtrim(@string2))
select @t10=supp from bang_2mh2 where(mathang1=ltrim(rtrim(@string1))and
mathang2=ltrim(rtrim(@string2)))
ifNOTexiStS(select*from data_daxuly2 where mh=ltrim(rtrim(@string1))) ORNOTexiStS(select*from data_daxuly2 where mh=ltrim(rtrim(@string2)))
BEGIN
Set @s=0--@t10/@t1
Set @c=0--@t10/@t2
Set @D='TRONG LUAT CHUA MAT HANG KHONG TON TAI TRONG CSDL D'
Insertinto @temptable(MH1, MH2, supp, conf, danhgia)
values(@hienthi1, @hienthi2, @s, @c, @D)
end ELSE begin if @t10>0 or @t10=0 if(@t10/@t1)<@sp or(@t3/@t1)<@sp or(@t2/@t1)<@sp begin set @s=@t10/@t1 Set @c=@t10/@t2
Set @D='KHONG TIN CAY'
end else
if @t10/@t2>@cf
begin
Set @c=@t10/@t2
Set @D='TIN CAY'
end else
begin
Set @s=@t10/@t1
Set @c=@t10/@t2
Set @D='KHONG TIN CAY'
end else
begin Set @s=0
Set @c=0
Set @D='KHONG TIN CAY'
end
Insertinto @temptable(mh1, mh2, supp, conf, danhgia)
values (@hienthi1, @hienthi2, @s, @c, @D)
end Return END
Hình 3.6. Đánh giá độ tin cậy của luật {Decolgen}=>{Vitamin B1}
Hình 3.7. Đánh giá độ tin cậy của luật {Cefalecin}=>{Vitamin C}
3. 3. Kết luận chương
Ở chương 3, luận văn đã đưa ra cụ thể các bài toán về tính độ hỗ trợ, tính độ tin cậy của luật và đánh giá một luật có tin cậy hay không. Các bài toán được minh
họa và chạy thử nghiệm qua phần mềm được viết từ Microsoft Visual Basic 6. 0, chạy trên máy tính PC CPU Intel (R) Pentium (R), bộ nhớ trong 2GB RAM, sử dụng hệ điều hành Windows XP Professional. Cơ sở dữ liệu là hàng trăm đơn thuốc của phòng khám đa khoa Trường Cao đẳng Y tế Phú Thọ về bệnh cúm từ năm 2014 đến nay. Kết quả này sẽ giúp ích cho sinh viên y dược trong quá trình học tập và các bác sĩ, dược sĩ có được những tri thức hay về thuốc, giúp ích cho công việc hàng ngày.
KẾT LUẬN
Kết quả đạt được của luận văn
Về mặt lý thuyết: Đề tài đã tìm hiểu những cách tiếp cận khai thác dữ liệu
dựa trên ngôn ngữ truy vấn SQL-92 và chú trọng vào cách tiếp cận K-way join. Đề phân tích, thử nghiệm, đánh giá và đề xuất cải tiến cho K-way join, đưa ra phương pháp phát sinh và rút gọn luật kết hợp.
Về mặt thực hành: Đề tài đã đưa ra phương án, cách thức để tìm ra những tri
thức tốt về thuốc với cơ sở dữ liệu là các đơn thuốc.
Kết luận: Khai phá dữ liệu đã và đang là một lĩnh vực rất thu hút các nhà
nghiên cứu vì tính khoa học và ứng dụng của nó trong cuộc sống. Những thử thách trong lĩnh vực khai phá còn rất nhiều, khai phá tri thức theo kiểu luật kết hợp cũng còn cả một khối khổng lồ, đặc biệt là cách tiếp cận khai phá dữ liệu dựa trên truy vấn SQL.
Hướng phát triển luận văn
Mở rộng thuật toán sang HQTCSDL quan hệ-đối tượng (sử dụng các đặc tính quan hệ-đối tượng trong SQL như: UDFs, BLOBs, Table functions) Đưa ràng buộc vào khai phá dữ liệu
Mở rộng sang khai phá mẫu phổ biến chuỗi (sequential partern mining). Vì đây là lĩnh vực có phạm vi ứng dụng rất rộng và hiện tại có rất ít nghiên cứu chuyên sâu về SQL để khai phá loại dữ liệu này.
Với những luật có độ tin cậy nhỏ hơn 100%, vấn đề luật thừa cũng cần phải được xem lại. Lấy ví dụ, chúng ta đã có luật AB như vậy luật (A, C) B là luật thừa. Nhưng trong thực tế thì (A, C) B phần lớn có độ tin cậy cao hơn, và chính những luật có độ tin cậy cao là những luật chúng ta cần quan tâm và tin tưởng hơn. Những luật mà vế trái càng nhiều items thì càng quí, cũng giống như công việc điều tra mà có càng nhiều chứng cứ càng tốt.
PHỤ LỤC
Luận văn sử dụng ngôn ngữ lập trình Microsoft Visual Basic 6. 0, hệ quản trị cơ sở dữ liệu SQL Sever 2005 để tính toán thử nghiệm với dữ liệu là các đơn thuốc cúm của phòng khám đa khoa Trường cao đẳng Y tế Phú Thọ.
Dữ liệu đầu vào: Tập các đơn thuốc bệnh cúm
Hình PL1: Minh họa dữ liệu đầu vào
Chương trình: Giao diện chính:
Private Sub mnubaitoan2_Click() baitoan2. Show
End Sub
Private Sub mnubaitoan3_Click() baitoan3. Show
End Sub
Private Sub mnubaitoan4_Click() baitoan4. Show
End Sub
Private Sub mnuketnoidulie_Click() Dim str As String
Set myCn = New Connection
str = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn. Open str
MsgBox "Ket noi thanh cong!!!", vbOKOnly, "Thong bao" End Sub
Tính độ hỗ trợ và tin cậy của luật:
Private Sub cmscluat_Click() Dim str1 As String
Set myCn1 = New Connection
str1 = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn1. Open str1 Dim sqlstr1 As String
Dim rs As ADODB. Recordset
sqlstr1 = "select * from dbo. doluat_sc('" & txtstr1. Text & "', '" & txtstr2. Text & "')" 'myCn. Execute (sqlstr)
'ket noi
Set rs = New ADODB. Recordset
rs. Open sqlstr1, myCn1, adOpenStatic, adLockOptimistic
Call HienKQLenGrid1(rs) rs. Close
MsgBox "Da do luat!!!" End Sub
Private Sub Cmthemgd_Click() Dim str1 As String
Set myCn1 = New Connection
'myCn. CursorLocation = adUseClient
str1 = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn1. Open str1 Dim sqlstr As String
Dim rsmathang As New Recordset
sqlstr = "exec dbo. themgiaodich '" & txtdsmathang. Text & "'" rsmathang. Open sqlstr, myCn1, adOpenStatic, adLockOptimistic 'MsgBox "Them thanh cong!!!"
Call hienthidsmh End Sub
Private Sub Cmxulydata_Click() Dim str1 As String
Set myCn1 = New Connection
'myCn. CursorLocation = adUseClient
str1 = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn1. Open str1 Dim sqlstr As String
sqlstr = "exec dbo. taodata_daxuly3" myCn1. Execute (sqlstr)
MsgBox "Xu ly du lieu xong!!!" End Sub
Private Sub HienKQLenGrid1(rs As ADODB. Recordset) Dim i As Integer
grdketqua1. Rows = 2 If (rs. EOF = False) Then i = 0
While (Not rs. EOF) i = i + 1
If (i >= grdketqua1. Rows - 1) Then grdketqua1. Rows = grdketqua1. Rows + 1 grdketqua1. TextMatrix(i, 0) = i
End If
grdketqua1. TextMatrix(i, 1) = rs!mh1 grdketqua1. TextMatrix(i, 2) = rs!mh2 grdketqua1. TextMatrix(i, 3) = rs!supp grdketqua1. TextMatrix(i, 4) = rs!conf
rs. MoveNext Wend
End If
'danh so thu tu cho cac cot Dim stt As Integer
grdketqua1. Col = 0
For stt = 1 To grdketqua1. Rows - 2 grdketqua1. Row = stt
grdketqua1. Text = stt Next stt
End Sub
Private Sub KtGird() grdketqua1. Clear grdketqua1. Rows = 2
grdketqua1. TextMatrix(0, 0) = "STT" grdketqua1. TextMatrix(0, 1) = "Mat hang 1" grdketqua1. TextMatrix(0, 2) = "Mat hang 2" grdketqua1. TextMatrix(0, 3) = "Supp" grdketqua1. TextMatrix(0, 4) = "Conf" grdketqua1. ColWidth(0) = 500 grdketqua1. ColWidth(1) = 2000 grdketqua1. ColWidth(2) = 2000 grdketqua1. ColWidth(3) = 1000 grdketqua1. ColWidth(4) = 1000 End Sub
Public Sub KhoiTaoGird_2() grdthemgd. Clear
grdthemgd. Rows = 2
grdthemgd. TextMatrix(0, 0) = "Stt" grdthemgd. TextMatrix(0, 1) = "ID" grdthemgd. TextMatrix(0, 2) = "Magd" grdthemgd. TextMatrix(0, 3) = "Mathang"
grdthemgd. ColWidth(1) = 500 grdthemgd. ColWidth(2) = 600 grdthemgd. ColWidth(3) = 5000 End Sub
Private Sub Command1_Click() Unload Me
End Sub
Private Sub Form_Load() Dim str1 As String
Set myCn1 = New Connection
str1 = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn1. Open str1 baitoan2. Show Call KtGird Call KhoiTaoGird_2 Call hienthidsmh End Sub
Public Sub hienthidsmh() Dim i, ii As Integer Dim sqlstr2 As String
Dim rs1 As ADODB. Recordset Dim str As String
Set myCn = New Connection
str = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn. Open str i = 1
ii = 0
sqlstr2 = "select * from transaction2" Set rs1 = New ADODB. Recordset grdthemgd. Rows = 1
rs1. Open sqlstr2, myCn, adOpenDynamic, adLockBatchOptimistic With rs1
If (Not (. BOF And . EOF)) Then Do Until rs1. EOF
grdthemgd. AddItem ""
grdthemgd. TextMatrix(i, 0) = "" & ii + 1
grdthemgd. TextMatrix(i, 1) = Trim(. Fields(0). Value) grdthemgd. TextMatrix(i, 2) = "" & Trim(. Fields(1). Value) grdthemgd. TextMatrix(i, 3) = "" & Trim(. Fields(2). Value) ' grdthemgd. TextMatrix(i, 4) = "" & Trim(. Fields(3). Value) ii = ii + 1 i = i + 1 . MoveNext Loop . MoveFirst Else Exit Sub
End If End With
End Sub
Đánh giá độ tin cậy của luật:
Option Explicit
'Dim WithEvents rsKhoa As Recordset Dim myCn As Connection
Dim rsmathang As New Recordset Dim sqlstr As String
Private Sub cmkiemtraluat_Click() Dim str As String
Set myCn = New Connection
str = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn. Open str Dim sqlstr As String
Dim rs As ADODB. Recordset
sqlstr = "select * from dbo. doluat_dg('" & txtstring1. Text & "', '" & txtstring2. Text & "', " & txtminsup. Text & ", " & txtmincof. Text & ")"
'myCn. Execute (sqlstr) 'ket noi
Set rs = New ADODB. Recordset
rs. Open sqlstr, myCn, adOpenStatic, adLockOptimistic
Call HienKQLenGrid(rs) rs. Close
MsgBox "Da kiem tra luat!!!" End Sub
Private Sub Cmthemgd_Click() Dim str As String
Set myCn = New Connection
'myCn. CursorLocation = adUseClient
str = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn. Open str Dim sqlstr As String
Dim rsmathang As New Recordset
sqlstr = "exec dbo. themgiaodich '" & Me. txtdsmathang & "'" rsmathang. Open sqlstr, myCn, adOpenStatic, adLockOptimistic MsgBox "Them thanh cong!!!"
Call hienthidsmh 'myCn. Execute (sqlstr) End Sub
Private Sub Cmxulydata_Click() Dim str As String
Set myCn = New Connection
'myCn. CursorLocation = adUseClient
str = "Provider=SQLOLEDB. 1;User ID=" & mUser & ";Password=" & mPwd & _ ";Initial Catalog=" & mData & ";Data Source=" & mDataSource & ""
myCn. Open str Dim sqlstr As String
sqlstr = "exec dbo. taodata_daxuly3" myCn. Execute (sqlstr)
MsgBox "Xu ly du lieu xong!!!" End Sub
Private Sub HienKQLenGrid(rs As ADODB. Recordset) Dim i As Integer
'load du lieu len grid grdketqua. Rows = 2 If (rs. EOF = False) Then i = 0
While (Not rs. EOF) i = i + 1
If (i >= grdketqua. Rows - 1) Then grdketqua. Rows = grdketqua. Rows + 1 grdketqua. TextMatrix(i, 0) = i
End If
grdketqua. TextMatrix(i, 1) = rs!mh1 grdketqua. TextMatrix(i, 2) = rs!mh2 grdketqua. TextMatrix(i, 3) = rs!danhgia
rs. MoveNext Wend
End If
'danh so thu tu cho cac cot Dim stt As Integer
grdketqua. Col = 0
For stt = 1 To grdketqua. Rows - 2