Cấu trúc tệp dữ liệu

Một phần của tài liệu Khai phá dữ liệu và thuật toán khai phá luật kết hợp (Trang 97)

Các tệp dữ liệu ở dạng nhị phân có nội dung mô tả dữ liệu như sau: Dòng đầu tiên là mô tả phiên bản của dữ liệu, tiếp đến là các thông tin giới thiệu về tệp dữ liệu, tiếp đến là số cột các mô tả các mục trong dữ liệu, các dòng thể hiện các giao tác trong cơ sở dữ liệu, mỗi giao tác có số thứ tự tương ứng với các mục có trong giao tác.

Ví dụ: tệp dữ liệu CSC.db là dữ liệu mô tả việc chọn môn học của các học viên thọc tại khoa Khoa học máy tính của trường Đại học Uregine Canada.

Tệp dữ liệu gồm:

+ 88 cột mô tả 88 môn học, số của mỗi cột là thể hiện mã của môn học. + 298 dòng, mỗi dòng (tương ứng với một giao tác trong cơ sở dữ liệu) mô tả một tập các môn học của khóa học mà học viên đã chọn. Như vậy trên mỗi dòng, các cột sẽ nhận một trong 2 giá trị 1 nếu tương ứng với mục đó có trong giao tác, 0 nghĩa là mục đó không có trong giao tác.

Khai phá tệp dữ liệu này nhằm tìm ra những môn học mà mà học viên hay chọn và những môn học nào hay được học viên chọn cùng với môn học

nào để có kế hoạch bố trí kế hoạch, chiến lược bố trí giảng viên, tổ chức lớp học, giới thiệu chương trình, định hướng đào tạo, ... cho phù hợp.

Để thực hiện khai phá thì chúng ta phải có giai đoạn tiền xử lý để đưa tệp dữ liệu về dạng Text, các mục được ánh xạ bởi các số tự nhiên từ bắt đầu từ số 1. Mỗi giao tác được mô tả thành một dòng text như sau: liệt kê số thứ tự của các mục có trong giao tác đó, mỗi mục cách nhau một dấu cách. Tìm tập mục thường xuyên và luật kết hợp dựa vào số thứ tự của các mục rồi sau đó ánh xạ ngược trở lại để lấy tên mục.

Một phần tệp Text của tệp dữ liệu CSC.db được mô tả như sau: phần đầu là ánh xạ các số tự nhiên vào các mục, các giao tác nằm giữa hai từ khóa BEGIN_DATA và END_DATA. 1 CS100F 2 CS101E 3 CS102E .... 85 CS796 86 CS899 87 CSC111 88 CSZ106 BEGIN_DATA 42 46 16 23 27 42 48 51 54 59 4 20 23 25 48 54 20 52 54 .... 23 42 43 44 51 52 54 57 62 43 44 45 46 END_DATA 3.2. XÂY DỰNG CHƯƠNG TRÌNH

Chương trình được xây dựng trên Java phiên bản 1.4. Một số lớp chính được mô tả như sau:

Lớp DocDL.java thực hiện đọc dữ liệu từ tệp .db để thực hiện khai phá luật kết hợp.

Lớp GhiDL.java thực hiện ghi vào tệp dữ liệu .db. Sử dụng lớp này chúng ta có thể tạo được tệp dữ liệu .db.

Lớp GhiCache.java thực hiện ghi vào tệp .cache, tệp này chứa nội dung là các tập mục thường xuyên tìm được trong quá trình khai phá.

Lớp DocCache.java thực hiện đọc tệp .cache để lấy các tập mục thường xuyên cho việc tìm luật kết hợp.

Lớp Tapmuc.java lớp này cài đặt các tập mục là một dãy các số tự nhiên theo một thứ tự định danh của từng mục, độ hỗ trợ của tập mục, độ tin cậy và định danh của các giao tác mà tập mục đó xuất hiện (phục vụ cho thuật toán Charm).

Lớp CayBam.java và SET.java là hai lớp cấu trúc sử dụng cho việc tìm kiếm các tập mục thường xuyên và luật kết hợp.

Lớp Apriori.java kế thừa lớp trừu tượng KhaiphaTapmuctx.java cài đặt thuật toán 2.3 tìm tập mục thường xuyên, trong lớp này phương thức

TimTapmuctx(DocDL Docdl, GhiCache Ghicache,double minSupport) thực hiện tìm tập mục thường xuyên. Phương thức Apriori_gen() sinh các tập ứng cử từ các tập mục thường xuyên.

Lớp Luatkethop.java (implements Serializable, CriteriaComparable) lớp này mô tả các luật có dạng: X  Y (X là tiên đề, Y là kết luận), X, Y là các tập mục.

Lớp AprioriRules.java cài đặt thuật toán 2.5 sinh luật từ tập mục thường xuyên. Phương thức TimLuat(DocCache cacheReader, double minSupport, double minConfidence) thực hiện tìm luật kết hợp từ các tập mục thường xuyên. Phương thức ap_genrules(Tapmuc is_txuyen, ArrayList ketluan) sinh luật.

Lớp Charm.java cài đặt thuật toán 2.8 (Charm) tìm các tập mục thường xuyên đóng. Phương thức Charm_extend tìm các tập mục thường xuyên và thường xuyên đóng.

*Giao diện chương trình:

Giao diện của chương trình được thể hiện như hình 3.1 bao gồm: phần trên là các trang để thực hiện chương trình, phần cuối màn hình thể hiện những thông tin trạng thái.

Trang Du lieu thể hiện các thông tin về tệp dữ liệu khi mở tệp dữ liệu nằm ở thư mục nào, tên gì, có bao nhiêu cột, dòng, tên các mục. Nút Chon du lieu cho phép chọn mở một tệp dữ liệu.

Trang Tap muc thuong xuyen thực hiện tìm các tập mục thường xuyên khi ta chọn thuật toán và nhập độ hỗ trợ vào ô Do ho tro. Nhấn nút Thuc hien để thực hiện thuật toán. Nút Huy bo dùng để ngừng thực hiện thuật toán. Nút Xoa dùng để xóa ô trạng thái và ô hiển thị kết quả tập mục.

Hình 3.3 Trang Tìm luật kết hợp.

Trang Luat ket hop thực hiện tìm luật kết hợp ứng với độ tin cây nhập vào ô

Do tin cay 3 nút Thuc hien Huy bo Xoa làm các nhiệm vụ tương tự như ở tab Tap muc thuong xuyen .

3.3. KẾT QUẢ THỬ NGHIỆM

Khai phá luật kết hợp ứng với mỗi tệp dữ liệu chương trình thực hiện các công việc sau:

+ Mở một tệp dữ liệu.

+ Tìm tập mục thường xuyên thỏa ngưỡng độ hỗ trợ nào đó.

+ Từ các tập mục thường xuyên thực hiện tìm các luật kết hợp thỏa ngưỡng độ tin cậy cực tiểu.

Chương trình thực hiện thử nghiệm trên tệp dữ liệu Mushroom.db có kết quả cụ thể như sau:

Với độ hỗ trợ 0.25 và thuật toán Apriori kết quả thể hiện trong hình 3.4 với 23 tập mục thường xuyên, trong thời gian 110 ms và 4 lần duyệt qua cơ sở dữ liệu.

Hình 3.4 Kết quả khai phá tập mục thường xuyên của thuật toán Apriori. Với độ hỗ trợ 0.25 và thuật toán Charm kết quả thể hiện hình 3.5 tìm Với độ hỗ trợ 0.25 và thuật toán Charm kết quả thể hiện hình 3.5 tìm được 15 tập mục thường xuyên, trong thời gian 60 ms và chỉ duyệt qua cơ sở dữ liệu 1 lần.

Hình 3.5 Kết quả khai phá tập mục thường xuyên của thuật toán Charm. Như vậy thời gian thực hiện của thuật toán Charm nhanh hơn và số tập Như vậy thời gian thực hiện của thuật toán Charm nhanh hơn và số tập mục tìm được ít hơn (vì là tập đóng).

Với độ tin cậy 0.8 và độ hỗ trợ 0.25 và thuật toán AprioriRules tìm được 11 luật trong trong thời gian 20 ms (hình 3.6).

Hình 3.6 Kết quả khai phá luật.

Thực hiện khai phá trên tệp dữ liệu Mushroom.db, có 128 mục và 8124 giao tác. trên máy Intel tốc độ 2.40 GHZ, bộ nhớ 128MB

Độ hỗ trợ Thời gian thực hiện Số tập mục

Apriori Charm Apriori Charm

0.3 14741 11298 2735 427 0.4 8832 6139 565 144 0.5 5778 4076 153 47 0.6 5548 3375 51 19 0.7 5437 3174 31 12 0.8 4387 3144 23 10 0.9 3285 2795 9 5 1 1222 1195 1 1

Bảng 3.1 thời gian thực hiện và số tập mục tìm đợc của 2 thuật toán Apriori và Charm.

Từ bảng số liệu trên cho chúng ta thấy thời gian thực hiện của thuật toán Charm nhỏ hơn thời gian thực hiện của thuật toán Apriori, số tập mục thường xuyên đóng nhỏ hơn số tập mục thường xuyên .

Ta có biểu đồ so sánh thời gian thực hiện của hai thuật toán như sau:

Hình 3.7 Biểu đồ thời gian thực hiện của 2 thuật toán Aproiri và Charm.

3.4. NỘI DUNG MỘT SỐ LỚP

//Lớp Charm.java import java.util.*;

import java.io.IOException;

public class Charm extends KhaiphaTapmuctx {

private static final int INITIAL_CAPACITY = 10000; private ArrayList Ungcu;

private ArrayList k_txuyen; private ArrayList ketqua; private CayBam cb_Ungcu; private CayBam cb_k_txuyen; private int pass_num =1; private long min_weight; private long num_rows; private long supp; private int id;

//phuong thuc tim tap muc thường xuyên public int TimTapmuctx(DocDL Docdl,

0 5000 10000 15000 20000 0 0.2 0.4 0.6 0.8 1 1.2 T h ê i g ia n ( m s ) §é hç trî Apriori Charm

GhiCache Ghicache, double minSupport) { Doc_dl = Docdl; Ghi_cache = Ghicache; num_rows = Docdl.getNumRows();

min_weight = (long)(num_rows * minSupport); Ungcu = new ArrayList(INITIAL_CAPACITY); k_txuyen = new ArrayList(INITIAL_CAPACITY); ketqua = new ArrayList(INITIAL_CAPACITY); cb_k_txuyen = new CayBam(k_txuyen);

cb_Ungcu = new CayBam(Ungcu); Tapmuc is;

//tim cac muc don

for (int i = 1; i <= Doc_dl.getNumColumns(); i++) { is = new Tapmuc(1); is.add(i); Ungcu.add(is); cb_Ungcu.add(Ungcu.size() - 1); } if (Ungcu.size() == 0) return pass_num; checkAbort();

//cap nhap tan suat cua cac muc 1-muc CapnhapTansuat();

//kiem tra yeu cau ngat dung chuong tring cua nguoi dung checkAbort();

//tim cac muc thuong xuyen don (1- muc) KtraTxuyen(minSupport);

if (k_txuyen.size() == 0) return pass_num;

// thưc hien thuat toan charm de tim tap muc thuong xuyen dong Charm_extend(k_txuyen);

//Ghi ket qua vao file cache.

for (int i = 0; i < ketqua.size() ; i++) {

Tapmuc isk = (Tapmuc)ketqua.get(i);

if ((double)isk.sizeid()/(double)num_rows)>=minSupport)

{

isk.setSupport((double)isk.sizeid()/(double)num_rows); try

if (Ghi_cache != null)

Ghi_cache.writeItemset(isk);

}

catch (IOException e)

{

System.err.println("Loi viet cache" + e);

} } } return pass_num; }

private void CapnhapTansuat() {

cb_Ungcu.Timnut(); id=0;

try {

Tapmuc row = Doc_dl.getFirstRow();

id++; cb_Ungcu.update(row, id); while (Doc_dl.hasMoreRows()) { row = Doc_dl.getNextRow(); id++; cb_Ungcu.update(row, id); } } catch (Exception e) {

System.err.println("Loi duyet du lieu!!!\n" + e); }

}

private void KtraTxuyen(double supp) {

Tapmuc is;

for (int i = 0; i < Ungcu.size(); i++) {

if (((double)is.Nhantansuat()/ (double)num_rows)>=supp) { is.setSupport((double)is.Nhantansuat()/ (double)num_rows); k_txuyen.add(is); cb_k_txuyen.add(k_txuyen.size() - 1); } } Ungcu.clear(); }

public void Add(Tapmuc X) {

X.setSupport((double)X.sizeid()/(double)num_rows); for (int i= 0; i<ketqua.size(); i++)

{

Tapmuc t1 = new Tapmuc((Tapmuc)ketqua.get(i)); if ((X.sizeid()==t1.sizeid())&& X.Tapcon(t1) ) return;

else if ((X.sizeid()==t1.sizeid())&& t1. Tapcon(X)) { ketqua.set(i, X); return; } } ketqua.add(X); }

private boolean canSet(Tapmuc tap) {

if (tap.sizeid()>=min_weight) return true;

return false; }

private void Charm_extend(ArrayList day) {

Tapmuc is, is_i, is_j;

ArrayList newN =new ArrayList(INITIAL_CAPACITY); if (day.size()==1)

Add((Tapmuc)day.get(0)); else

{

{ is_i = (Tapmuc)day.get(i); is = new Tapmuc(is_i); newN.clear(); int j = i+1; while( j<day.size()) { is_j = (Tapmuc)day.get(j); is = is.Tonghop(is_j); if (is.sizeid()>=min_weight) { if (is_i.Sosanhid(is_j)) { day.set(i,is); day.remove(j); if (newN.size()>0) { for (int k=0; k<newN.size(); k++) { Tapmuc t1 = (Tapmuc)newN.get(k); Tapmuc t2 = is.Tonghop(t1); if (canSet(t2)) newN.set(k,t2); } } } else if (is_i.Tapconid(is_j)) { day.set(i, is); j++; if (newN.size()>0) { for (int k=0; k<newN.size(); k++) { Tapmuc t1 = (Tapmuc)newN.get(k); Tapmuc t2 = is.Tonghop(t1);

if (canSet(t2)) newN.set(k,t2); } } } else if (is_j.Tapconid(is_i)) { day.remove(j); newN.add(is); is=new Tapmuc(is_i); } else { newN.add(is); is = new Tapmuc(is_i); j++; } } else { is_i =(Tapmuc)day.get(i); is = new Tapmuc(is_i); System.out.println(" Sau " + is ); j++; } } Add(is); if (newN.size()>0 ) Charm_extend(newN) ; } } } } Lớp Apriori /* Apriori.java */ import java.util.*; import java.io.IOException;

public class Apriori extends KhaiphaTapmuctx {

private ArrayList Ungcu; private ArrayList k_txuyen; private CayBam cb_Ungcu; private CayBam cb_k_txuyen; private int pass_num;

private long num_rows;

//Phương thức tìm tập mục thường xuyên

public int TimTapmuctx(DocDL Docdl,

GhiCache Ghicache, double minSupport) { Doc_dl = Docdl; Ghi_cache = Ghicache; num_rows = Docdl.getNumRows();

Ungcu = new ArrayList(INITIAL_CAPACITY); k_txuyen = new ArrayList(INITIAL_CAPACITY); cb_k_txuyen = new CayBam(k_txuyen);

cb_Ungcu = new CayBam(Ungcu); Tapmuc is;

for (int i = 1; i <= Doc_dl.getNumColumns(); i++) { is = new Tapmuc(1); is.add(i); Ungcu.add(is); cb_Ungcu.add(Ungcu.size() - 1); }

for (pass_num = 1; ; pass_num++) { checkAbort(); CapnhapTansuat(); checkAbort(); KtraTxuyen(minSupport); if (k_txuyen.size() == 0) break; if (pass_num >= Doc_dl.getNumColumns())

break; checkAbort(); Apriori_gen(); if (Ungcu.size() == 0) break; } return pass_num; }

// Đếm số lần xuất hiện trong cơ sở dữ liệu của mỗi tập mục private void CapnhapTansuat()

{

cb_Ungcu.Timnut(); try

{

Tapmuc row = Doc_dl.getFirstRow(); cb_Ungcu.update(row); while (Doc_dl.hasMoreRows()) { row = Doc_dl.getNextRow(); cb_Ungcu.update(row); } } catch (Exception e) {

System.err.println("Loi duyet du lieu!!!\n" + e); }

}

// Xác định các tập mục thường xuyên từ các tập ứng cử private void KtraTxuyen(double supp)

{

Tapmuc is;

for (int i = 0; i < Ungcu.size(); i++) { is = (Tapmuc)Ungcu.get(i); if (((double)is.getSupport()/(double)num_rows)>=supp) { is.setSupport((double)is.getSupport()/(double)num_rows); try { if (Ghi_cache != null)

Ghi_cache.writeItemset(is);

}

catch (IOException e)

{

System.err.println("Loi viet cache!!!\n" + e);

} k_txuyen.add(is); // cb_k_txuyen.add(k_txuyen.size() - 1); } } Ungcu.clear();

cb_Ungcu = new CayBam(Ungcu); }

//Phương thức sinh các tập ứng cử private void Apriori_gen()

{

Tapmuc is_i, is_j;

if (k_txuyen.size() == 0) return;

for (int i = 0; i < k_txuyen.size() - 1; i++) for (int j = i + 1; j < k_txuyen.size(); j++) { is_i = (Tapmuc)k_txuyen.get(i); is_j = (Tapmuc)k_txuyen.get(j); if (!is_i.Cothetohop(is_j)) break; else {

Tapmuc is1 = is_i.Tohop(is_j);

if (Ktra(is1)) { Ungcu.add(is1); cb_Ungcu.add(Ungcu.size() - 1); } } } k_txuyen.clear();

}

// Phương thức kiểm tra tập mục ungcu k-mục có tập mục (k-1)- mục nào không thường xuyên không ?

public boolean Ktra(Tapmuc ungcu) {

Tapmuc is_k= new Tapmuc(ungcu); Tapmuc is2;

for (int i=0; i< ungcu.size();i++) {

int muc = ungcu.get(i); if (is_k.remove(muc))

{

for (int j=0; j<k_txuyen.size(); j++) { is2=(Tapmuc)k_txuyen.get(j); if (is2.Sosanh(is_k)) return true; } } } return false; } } //lớp AprioriRules.java import java.util.*;

public class AprioriRules extends KhaiphaLuat {

private SET supports; private ArrayList rules; private void setSupport(Tapmuc is) { try { is.setSupport(supports.getSupport(is)); } catch (SETException e) {

System.err.println("Loi nhan do ho tro\n" + e); }

}

public ArrayList TimLuat(DocCache cacheReader, double minSupport, double minConfidence)

{

min_support = minSupport;

min_confidence = minConfidence; rules = new ArrayList();

supports = new SET();

SET.initializeSET(supports, min_support, cacheReader); ArrayList frequent = supports.getItemsets();

for (int i = 0; i < frequent.size(); i++) {

checkAbort();

Tapmuc is_frequent = (Tapmuc)frequent.get(i); if (is_frequent.size() <= 1)

continue;

ArrayList ketluan = new ArrayList(is_frequent.size());

for (int k = 0; k < is_frequent.size(); k++)

{

int item = is_frequent.get(k);

Tapmuc is_ketluan = new Tapmuc(1); is_ketluan.add(item); ketluan.add(is_ketluan); } ap_genrules(is_frequent, ketluan); } return rules; }

//Phương thức này sinh các luật kết hợp private void ap_genrules(Tapmuc is_txuyen,

ArrayList ketluan) { if (ketluan.size() == 0) return; if (is_txuyen.size() > ((Tapmuc)(ketluan.get(0))).size()) { Luatkethop ar;

for (int i = 0; i < ketluan.size(); i++)

{

Tapmuc is_ketluan = (Tapmuc)ketluan.get(i); Tapmuc is_tiende =

Tapmuc.Tru(is_txuyen,is_ketluan); double antecedent_support = 0;

{ antecedent_support = supports.getSupport(is_tiende); } catch (SETException e) {

System.err.println("loi nhan do ho tro \n"+ e);

} double confidence = is_txuyen.getSupport()/antecedent_support; if (confidence >= min_confidence) { setSupport(is_tiende); setSupport(is_ketluan); rules.add(new Luatkethop(is_tiende, is_ketluan, is_txuyen.getSupport(), confidence)); } else ketluan.remove(i--); } ketluan = apriori_gen(ketluan); ap_genrules(is_txuyen, ketluan); } }

private ArrayList apriori_gen(ArrayList l1 ) {

if (l1.size() == 0)

return new ArrayList(0);

CayBam cb_itemsets = new CayBam(t1); for (int i = 0; i < l1.size(); i++)

cb_itemsets.add(i); cb_itemsets.Timnut();

ArrayList result = new ArrayList(); Tapmuc is_i, is_j;

for (int i = 0; i < l1.size() - 1; i++) for (int j = i + 1; j < l1.size(); j++)

{

is_j = (Tapmuc)l1.get(j); if (!is_i.Cothetohop(is_j)) break; else { Tapmuc is = is_i.Tohop(is_j); if (Ktra(is, l1)) result.add(is); } } return result; }

private boolean Ktra(Tapmuc ungcu, ArrayList dayketluan) {

Tapmuc is_k= new Tapmuc(ungcu); Tapmuc is2;

for (int i=0; i< ungcu.size();i++) {

int muc = ungcu.get(i); if (is_k.remove(muc))

{

for (int j=0; j<dayketluan.size(); j++)

{ is2=(Tapmuc)dayketluan.get(j); if (is2.Sosanh(is_k)) return true; } } } return false; } }

//Lớp Luatkethop.java khởi tạo luật và thực hiện so sánh các luật public class Luatkethop

implements java.io.Serializable, CriteriaComparable {

public static final int BY_ANTECEDENT_SIZE = 0; public static final int BY_CONSEQUENT_SIZE = 1; public static final int BY_SUPPORT = 2;

private Tapmuc tiende; private Tapmuc ketluan; private double support; private double confidence; /*/tao luat ket hop

Tham so tiende la tien de cua luat

Tham so ketluan là phan ket luan cua luat Tham so support do ho tro cua luat Tham so confidence do tin caycua luat */

public Luatkethop(Tapmuc tiende, Tapmuc ketluan, double support, double confidence) {

if (tiende == null || ketluan == null || support < 0 || support > 1

|| confidence < 0 || confidence > 1)

throw new IllegalArgumentException("Loi cac tham so

khong phu hop "); this.tiende = tiende;

this.ketluan = ketluan; this.support = support; this.confidence = confidence; }

//Trả về kích thước của tiền đề public int antecedentSize() {

return tiende.size(); }

//Trả về kích thước của kết luận public int consequentSize() {

return ketluan.size(); }

//Trả về tiền đề của luật public Tapmuc getAntecedent() {

return tiende; }

//Trả về kết luận của luật public Tapmuc getConsequent() {

}

//Trả về độ hỗ trợ của luật public double getSupport() {

return support; }

//Trả về độ tin cậy của luật public double getConfidence() {

return confidence; }

//Thiết lập độ hộ trợ cho luật

public void setConfidence(double confidence) {

this.confidence = confidence; }

//Trả về mục thứ i của tiền đề public int getAntecedentItem(int i) {

return tiende.get(i); }

//Trả về mục thứ i của kết luận public int getConsequentItem(int i) {

return ketluan.get(i); }

//So sánh hai luật theo một tiêu chuẩn public int compareTo(Object obj, int criteria) {

if (!(obj instanceof Luatkethop))

throw new IllegalArgumentException("Khong phai la luat ket hop");

Luatkethop ar = (Luatkethop)obj; double diff;

if (criteria == BY_ANTECEDENT_SIZE) return this.tiende.size() - ar.tiende.size(); else if (criteria == BY_CONSEQUENT_SIZE) return this.ketluan.size() - ar.ketluan.size(); else if (criteria == BY_SUPPORT)

diff = this.support - ar.support;

else if (criteria == BY_CONFIDENCE) diff = this.confidence - ar.confidence; else

throw new IllegalArgumentException("tieu chuan khong phu hop"); if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; }

public boolean equals(Object obj) {

if (obj == this) return true;

if (!(obj instanceof Luatkethop)) return false;

Luatkethop other = (Luatkethop)obj; if (tiende.size() != other.tiende.size()) return false;

if (ketluan.size() != other.ketluan.size()) return false;

for (int i = 0; i < tiende.size(); i++) if (tiende.get(i) != other.tiende.get(i)) return false;

for (int i = 0; i < ketluan.size(); i++) if (ketluan.get(i) != other.ketluan.get(i)) return false;

return true; }

public String toString() {

String s = "{";

for (int i = 0; i < tiende.size(); i++) s += tiende.get(i) + " ";

s += "}->{";

for (int i = 0; i < ketluan.size(); i++) s += ketluan.get(i) + " ";

s += "} (" + support + ", " + confidence + ")"; return s;

}

Khai phá dữ liệu là một lĩnh rất rộng, gồm nhiều kĩ thuật. Chương trình trên là một thử nghiệm các thuật toán trên một lĩnh vực cụ thể là khai phá luật kết hợp đơn chiều trên cơ sở dữ liệu nhị phân. Chương trình cho kết quả là

Một phần của tài liệu Khai phá dữ liệu và thuật toán khai phá luật kết hợp (Trang 97)

Tải bản đầy đủ (PDF)

(124 trang)