Đẻ thử nghiệm một số khía cạnh lí thuyết liên quan đến khai phá dữ liệu, luận văn thực hienẹ chương trình minh họa. Chương trình cài đặt trên ngôn ngữ C#, CSDL thiết kế trên SQL Server 2005, hệ điều hành WindowsXP, chip máy tính Pentium IV 1.7 GHz, RAM 512 MB, ổ cứng 80 GB còn trống gần 7 GB. Chương trình có một số giao diện chính sau:
Hình 3.7: Phần kết nối CSDL
Hinh 3.8: Form cập nhật điểm sinh viên
Hình 3.10: Phần dữ liệu đã được mã hoá
Hình 3.12: Phần mô phỏng thuật toán với dữ liệu nhập vào từ bàn phím
3.4. Kết luận
Chương trình thực hiện tìm các tập phổ biến và luật kết hợp thông qua thuật toán Apriori. Từ các luật kết hợp thu được từ chương trình ta có thể tìm ra các luật mạnh phục vụ cho công tác đào tạo, hỗ trợ cho sinh viên lựa chọn môn học, ngành nghề.
Để xác định độ Support của các tập ứng viên, thuật toán Apriori luôn luôn phải quét lại toàn bộ các giao dịch trong CSDL. Do vậy sẽ tiêu tốn rất nhiều thời gian khi số k-items tăng (số lần xét duyệt các giao dịch tăng).
Hướng phát triển
Tiếp tục hoàn thiện và mở rộng chương trình trong luận văn này để có thể áp dụng vào thực tế toàn diện hơn. Mở rộng khai phá luật kết hợp với dữ liệu đầu vào rộng hơn, không chỉ dừng lại ở điểm của sinh viên mà còn có thể là các yếu tố khác như: chuyên ngành về mạng máy tính thì sau khi ra trường có thể dễ xin việc hơn nên có nhiều sinh viên đăng ký học ngành này hơn. Xây dựng thêm phần tiền xử lý dữ liệu. Các tệp CSDL khác nhau như: Microsoft Access, Foxpro, Oracle… đều có thể chuyển về một dạng thống nhất để chương trình xử lý được.
Nghiên cứu sâu các thuật toán khai phá dữ liệu, và áp dụng vào một số bài toán khai phá dữ liệu phù hợp với giai đoạn hiện nay: dự báo dân số, bệnh dịch, thời tiết, định hướng trong kinh doanh …
KẾT LUẬN
Khai phá dữ liệu là một lĩnh vực vẫn còn khá mới mẻ, lý thú. Luận văn đã trình bày, một số vấn đề cơ bản nhất, các phương pháp cơ bản để khai phá dữ liệu, đặc biệt trình bày chi tiết, làm rõ vấn đề khai phá luật kết hợp. Phương pháp khai phá dữ liệu có thể là: phân lớp, hồi quy, cây quyết định, suy diễn, quy nạp, K- láng giềng gần, … các phương pháp trên có thể áp dụng trong dữ liệu thông thường và trên tập mờ.
Bài toán khai phá luật kết hợp là bài toán khó. Luận văn đã trình bày thuật toán khai phá kinh điển Apriori và các thuật toán mới hiệu quả nhất (Apriori_Tid, Setm, Ais, Charm). Một cách tiếp cận khai phá luật kết hợp đảm bảo không dư thừa các luật và cho hiệu quả khai phá cao là dựa trên tập đóng. Thuật toán khai phá hiệu quả điển hình là thuật toán CHARM.
Kết quả xây dựng chương trình thử nghiệm dựa trên thuật toán Apriori nhằm mô phỏng rõ hơn về khai phá dữ liệu bằng luật kết hợp. Chương trình ứng dụng vào bài toán dự báo kết quả học tập của sinh viên, hỗ trợ sinh viên lựa chọn môn học, lựa chọn ngành học, hỗ trợ cho cán bộ đào tạo đưa ra định hướng đào tạo trong các năm tiếp theo.
PHỤ LỤC
Lớp Apriori
public class Apriori {
//Mang danh sach cac tap phan tu luu trong cac tap muc pho bien protected ItemsetArrayList itemsetsFrequentCollection;
//Mang danh sach cac phan tu luu trong tap muc cac ung cu protected ItemsetArrayList itemsetsCandidateCollection; //Xay dung lop Apriori
public Apriori() {
this.itemsetsCandidateCollection = new ItemsetArrayList(); this.itemsetsFrequentCollection = new ItemsetArrayList(); }
public void OnProgressMonitorEvent(ProgressMonitorEventArgs e) { if (ProgressMonitorEvent != null) { ProgressMonitorEvent(this, e); } }
public event ProgressMonitorEventHandler ProgressMonitorEvent; protected DataRow[] FindItems(string find, DataTable data)
{
return data.Select(find); }
protected int FindItems(string find, string data) {
string[] splitstring = data.Split(new Char[] { ',' }); int length = splitstring.Length;
int countFound = 0;
string[] found = new string[length];
for (int counter = 0; counter < length; counter++) {
found[counter] = splitstring[counter].Trim(); }
foreach (string member in found) { if (member == find) { countFound++; } } return countFound; }
//Mang danh sach cac tap muc
{
string[] splitstring = data.Split(new Char[] { ',' }); int length = find.Count;
string[] found = new string[splitstring.Length]; int minimumValue = 0;
int[] search = new int[length];
for (int counter = 0; counter < splitstring.Length; counter++) {
found[counter] = splitstring[counter].Trim(); }
for (int count = 0; count < length; count++) {
foreach (string member in found) { if (member == (string)find[count]) { search[count]++; } } } switch (length) { case 0: { minimumValue = 0; break; } case 1: { minimumValue = search[0]; break; } default: {
for (int counter = 0; counter < search.Length; counter++) { if (counter == 0) { minimumValue = search[counter]; } else { if (search[counter] < minimumValue) { minimumValue = search[counter]; } }
} break; } } return minimumValue; }
//Tinh Support cua 1 tap muc trong CSDL
public int SupportCount(string find, Database Transactions_Data) {
int count = 0;
DataTable datatable = Transactions_Data.Transactions.Tables[0]; foreach (DataRow datarow in datatable.Rows)
{
count = count + FindItems(find, (datarow["Transactions"]).ToString()); }
return count; }
//Lay gia tri Support cua 1 tap muc
public int SupportCount(ItemsetArrayList find, Database transactionsData) {
int count = 0; int total = 0;
DataTable dataTable
=transactionsData.Transactions.Tables["TransactionTable"]; foreach (DataRow datarow in dataTable.Rows) {
count = this.FindItems(find, (datarow["Transactions"]).ToString()); total = count + total;
}
return total; }
//Tao tap cac tap muc tu CSDL cua cac giao [ReservedAttribute(false, "December 25, 2002")]
public ItemsetCandidate CreateOneItemsets(Database dataBase) {
DataTable dataTable = dataBase.Transactions.Tables["TransactionTable"]; ItemsetCandidate candidateItemset = new ItemsetCandidate();
ItemsetArrayList uniqueItems = new ItemsetArrayList(1); ; ItemsetArrayList candidateItems;
ItemsetArrayList items;
StringBuilder item = new StringBuilder(10); int itemSupportCount = 0;
int counter = 1;
string msg = "Creating One Itemsets";
ProgressMonitorEventArgs e = new ProgressMonitorEventArgs(1, 100, 80, "Apriori.CreateOneItemsets(Database)", msg);
this.OnProgressMonitorEvent(e);
{ item.Append(dataRow["Transactions"].ToString()); if (counter < (dataTable.Rows.Count)) { item.Append(", "); counter++; } } candidateItems =
ItemsetArrayList.ConvertToItemsetArrayList(item.ToString(), new Char[] { ',' }); for (int count = 0; count < candidateItems.Count; count++)
{
item = new StringBuilder(10);
item.Append(((string)candidateItems[count]).Trim()); if (!(item.ToString() == ""))
{
if (!uniqueItems.Contains(item.ToString())) {
itemSupportCount = this.SupportCount(item.ToString(), dataBase); dataBase.AddItemset(item.ToString(), 1, itemSupportCount); items = new ItemsetArrayList(1);
uniqueItems.Add(item.ToString()); items.Add(item.ToString()); items.Level = 1; items.SupportCount = itemSupportCount; items.TrimToSize(); candidateItemset.Items.Add(items); } } } candidateItemset.Items.TrimToSize(); candidateItemset.Level = 1; return candidateItemset; } //Lop Apriori_Gen
public void AprioriGenerator(ItemsetCandidate Candidate_Itemset, Database TransactionsData, int minimum_support)
{
string start = "Generating Level " + Candidate_Itemset.Level + " Candidates : " + Candidate_Itemset.Items.Count + " Items";
ProgressMonitorEventArgs e = new ProgressMonitorEventArgs(1, 100, 25, "Apriori.AprioriGenerator()", start);
this.OnProgressMonitorEvent(e);
//Them 1 tap muc ung cu vien vao tap cac tap muc ung cu vien ItemsetCandidate candidateItemset =
this.JoinCandidateItemsets(Candidate_Itemset, TransactionsData, minimum_support); if (candidateItemset.Items.Count > 0)
this.AprioriGenerator(candidateItemset, TransactionsData, minimum_support);
}
string done = "Finished Generating Candidate Itemsets ";
e = new ProgressMonitorEventArgs(1, 100, 70, "Apriori.AprioriGenerator()", done);
this.OnProgressMonitorEvent(e); }
//tap muc ung cu vien
protected ItemsetCandidate GenerateFrequentItemsets(ItemsetCandidate candidateItemset, int minimum_support)
{
ItemsetCandidate itemsetFrequent = new ItemsetCandidate(); foreach (ItemsetArrayList itemsFrequent in candidateItemset.Items) { if (itemsFrequent.SupportCount >= minimum_support) { itemsetFrequent.Items.Add(itemsFrequent); } } itemsetFrequent.Items.Capacity = itemsetFrequent.Items.Count; return itemsetFrequent; }
//Kiem tra neu 1 phan tap muc co 1 tap muc con pho bien protected bool HasInfrequentSubSet()
{
throw new Exception("This is a reserved attribute! Do not use it"); }
public ItemsetArrayList ItemsetsFrequentCollection { get { return itemsetsFrequentCollection; } set { itemsetsFrequentCollection.Add(value); } }
//Lua chon tap cac ung cu vien
public ItemsetArrayList ItemsetsCandidateCollection { get { return itemsetsCandidateCollection; } set {
itemsetsCandidateCollection.Add(value); }
}
//Tao 1 tap muc bang 1 tap muc ung cu vien
public ItemsetCandidate JoinCandidateItemsets(ItemsetCandidate candidate_itemset, Database transactionsData, int minimumSupport) {
//neu so tap muc bang 0
if (candidate_itemset.Items.Count == 0) {
throw new Exception("cannot join items : no items are present!"); }
else {
ItemsetArrayList copy_candidate_itemset = candidate_itemset.Items; ItemsetCandidate new_candidate_itemset = new ItemsetCandidate(); new_candidate_itemset.Level = candidate_itemset.Level + 1;
//thanh phan cua 1 tap muc cua k phan tu duoc ket noi //neu (k-2) phan tu dau tien tham gia vao ket noi
int count_common_items = (new_candidate_itemset.Level - 2); foreach (ItemsetArrayList itemset in candidate_itemset.Items) {
int count_members = 0;
foreach (ItemsetArrayList copy_itemset in copy_candidate_itemset) {
bool join_items = true;
for (count_members = 0; count_members < count_common_items; count_members++) { if (itemset[count_members] != copy_itemset[count_members]) { join_items = false; break; } } If (itemset[count_common_items].ToString().CompareTo(copy_itemset[count_common _items].ToString()) != -1) { join_items = false; } if (join_items == true) {
ItemsetArrayList new_itemset = new ItemsetArrayList(1);
for (count_members = 0; count_members <= count_common_items; count_members++)
{
{ new_itemset.Add(itemset[count_members]); } else { new_itemset.Add(itemset[count_members]); new_itemset.Add(copy_itemset[count_members]); } } new_itemset.Capacity = new_itemset.Count; //lay ra support cho moi tap muc new_itemset.SupportCount = this.SupportCount(new_itemset, transactionsData); new_itemset.Level = new_candidate_itemset.Level; itemset.Capacity = itemset.Count; //Them tap muc vao bang cac tap muc transactionsData.AddItemset(new_itemset, ","); //Khong them cac tap muc neu co support < minsupp
if (new_itemset.SupportCount >= minimumSupport) { new_candidate_itemset.Items.Add(new_itemset); } } } } new_candidate_itemset.Items.Capacity = new_candidate_itemset.Items.Count; return new_candidate_itemset; } }
//Tao tap cac luat tu cac tap muc
public void CreateItemsetRuleset(ItemsetArrayList parentRuleset, ItemsetArrayList leftRuleset, ItemsetArrayList rightRuleset, Database transactionsData) {
//Tao va them 1 luat ket hop vao CSDL transactionsData.AddRuleset(parentRuleset, leftRuleset, rightRuleset); }
public void CreateItemsetSubsets(int Level, ItemsetArrayList itemSubset, ItemsetArrayList parentItemset, Database transactionsData) {
int length = 0; ItemsetArrayList childSubset = new ItemsetArrayList(1); ItemsetArrayList rulesItemset; if (itemSubset.Count > Level) {
foreach (ItemsetArrayList item in itemSubset) {
ItemsetArrayList[] subsets = this.CreateItemsetSubsets(item); if (parentItemset == null) { parentItemset = item; } if (subsets != null) { length = subsets.Length; } else { break; }
for (int count = 0; count < length; count++) {
//them tap muc va tap con vao bangAdd the itemset and the subset to the subsets table
transactionsData.AddSubset(item, subsets[count]); childSubset.Add(subsets[count]);
//Tao 1 tap muc co support, conf va luat ket hop rulesItemset = (parentItemset - subsets[count]);
this.CreateItemsetRuleset(parentItemset, subsets[count], rulesItemset, transactionsData);
} }
childSubset.TrimToSize();
this.CreateItemsetSubsets(0, childSubset, parentItemset, transactionsData); }
}
public ItemsetArrayList[] CreateItemsetSubsets(ItemsetArrayList itemSubset) {
int length = itemSubset.Count;
ItemsetArrayList[] subset = new ItemsetArrayList[length]; switch (length) { case 0: { subset = null; break; } case 1: { subset = null; break; } default: {
for (int count = 0; count < (length - 1); count++) {
subset[0].Add(itemSubset[count]); }
subset[0].TrimToSize();
subset[1] = new ItemsetArrayList(1);
for (int count = 1; count < (length); count++) {
subset[1].Add(itemSubset[count]); }
subset[1].TrimToSize();
for (int count = 1; count < (length - 1); count++) {
int position = 0;
subset[(count + 1)] = new ItemsetArrayList(1); subset[(count + 1)].Add(itemSubset[position]); for (position = 1; position < length; position++) { if (position != count) { subset[(count + 1)].Add(itemSubset[position]); } } subset[(count + 1)].TrimToSize(); } break; } } return subset; } } }
TÀI LIỆU THAM KHẢO Tiếng Việt
[1].Thái Nguyên (29 – 31 tháng 8 năm 2003), Một số vấn đề chọn lọc của công nghệ thông tin, Nhà xuất bản Khoa học Kỹ thuật.
[2]. Nguyễn Công Cường, Nguyễn Doãn Phước (2001), Hệ mờ, mạng nơron và ứng dụng - NXB Khoa học Kỹ thuật.
[3] Nguyễn Văn Vỵ (2006), Phân tích thiết kế hệ thống, NXB. Đại học Quốc gia Hà Nội.
[4]. Đỗ Trung Tuấn (1999), Cơ sở dữ liệu, Nhà xuất bản Giáo dục. [5]. Nguyễn Đình Thúc (1998), Mạng nơron, Nhà xuất bản Giáo dục.
Tiếng Anh
[6]. John Wiley & Sons (2003) - Data Mining-Concepts Models Methods And Algorithms, Copyright © 2003 The Institute of Electrical and Electronics Engineers, Inc.
[7]. Bao Ho Tu (1998), Introduction to Knowledge Discovery and Data mining,
Institute of Information Technology National Center for Natural Science and Technology.
[8]. Jean – Marc Adamo (2001), Data Mining for Association Rules and Sequential Patterns, Sequential and Parallel Algorithms, Springer – Verlag New York, Inc.
[9]. Mohammet J. Zaki and Chin Jui Hasiao CHAM, An efficient Algorithm for Close Itemset Mining.
[10]. Jean-Marc Adamo (2001), Data Mining for Association Rule and Sequential Pattens, With 54 Illustrations. ISBN0-95048-6.
[11]. John Wiley & Son, Visual Data Mining: Techniques and Tools for Data Visualization and Mining, by Tom Soukup and Ian Davidson, ISBN: 0471149993.
[12]. John Wiley & Sons (2003), Data Mining: Concepts, Models, Methods, and Algorithms, by Mehmed Kantardzic, ISBN:0471228524.
[13]. W. H. Inmon, R. D. Hackthon, Using the Data Warehouse, A Wiley-QEA Publication.
[14]. J.R. Quinlan (1986), Introduction of Decision Trees. Machine learning 1, Kluwer Academic Press,81-106.
Địa chỉ trang Web [15] http://cn2.vnuit.vn/gtrinh/TH302/Htm/Chuong_07_04.htm [16] http://www.cs.unc.edu/Courses/comp290-90-f03/associationrule3.pdf [17] http://www.data-mine.com [18] http://www.mines.edu/~jaelee/dm/Apriori.pdf [19]http://www.cs.ualberta.ca/~joerg/courses/cmput695/fall2003/AssociationRul es-4spp.pdf