Chƣơng trình mô phỏng thuật toán khai phá tập mục thƣờng xuyên có trọng số trên cơ sở dữ liệu giao tác, đƣợc viết bằng ngôn ngữ java. Yêu cầu của hệ thống khi sử dụng chƣơng trình
- Cài đặt JDK.
- Hệ điều hành tối thiểu Windows Xp SP2.
- Cấu hình máy tính bộ vi xử lý 2GHz, 1024M RAM. Các bƣớc:
Bước 1:
Ngƣời dùng nạp tệp dữ liệu giao tác dạng TXT. Mỗi dòng tệp TXT là một giao dịch (transaction).
Bước 2:
Ngƣời dùng nạp tệp dữ liệu trọng số dƣới dạng tệp TXT cho tệp giao tác đã chọn. Mỗi dòng là giá trị của các trọng số tƣơng ứng với các mục.
VD: Có file giao dịch
1 2 3 4 5 7 8 9 1 2 4
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Mỗi dòng là giá trị của các trọng số tƣơng ứng với 1, 2, 3, 4, 5, 7, 8, 9
Bước 3:
Nhập tham số với ngƣỡng hỗ trợ tƣơng ứng vớ các giao dịch.
Bước 4:
Thực hiện thuật toán FP-Growth và MINWAL, WFIM khai phá tập mục thƣờng xuyên có trọng số.
Kết quả của chƣơng trình thực hiện các thuật toán là tìm ra tập mục thƣờng xuyên. 0.1 0.5 0.7 0.9 0.2 0.3 1.0 0.6
Một số giao diện chƣơng trình
Nạp tệp dữ liệu giao tác
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
Thực hiện các thuật toán WFIM
KẾT LUẬN
1. Những kết quả chính của luận văn
Nghiên cứu và nắm đƣợc những kiến thức cơ bản về luật kết hợp cũng nhƣ tập mục thƣờng xuyên trong khai phá dữ liệu.
Nghiên cứu một số thuật toán khai phá tập mục thƣờng xuyên cơ bản nhất là Apriori và FP-Growth.
Thuật toán MINWAL đƣợc xây dựng dựa trên thuật toán Apriori, tuy nhiên phần lớn tập ứng viên là không thƣờng xuyên. Theo đánh giá của ngƣời viết, thuật toán tốn kém khi sử dụng k-cận hỗ trợ để giữ lại tính chặn dƣới đóng của tập mục thƣờng xuyên.
Thuật toán WFIM: có tác dụng và có thể phát triển đối với mô hình khai phá tập mục thƣờng xuyên có trọng số. Phần so sánh và đánh giá các thuật toán MINWAL, WFIM, FP-Growth thì đều nhận thấy thuật toán WFIM(FP-Growth) có thời gian thực hiện nhanh hơn so với các giải thuật khác nhƣ MINWAL, WFIM (Apriori) và FP- Growth. Ngoài ra, nó còn trở nên nhanh hơn và tìm ra ít tập mục thƣờng xuyên nhƣng là những tập mục rất quan trọng trong một CSDL lớn với ngƣỡng hỗ trợ nhỏ nhất. Một vài phƣơng pháp tiện cận dựa trên thuật toán FP-Growth với hiệu năng tốt hơn đƣợc phát triển tại, [7], [8], [9], [10], [11], [12]. Về hiệu năng của WFIM có thể đƣợc cải tiến nếu kết hợp với những giải thuật này.
Tác giả đã nắm bắt đƣợc một số thuật toán khai phá tập mục thƣờng xuyên có trọng số nhƣ MINWAL, WFIM.
Luận văn đã cài đặt, so sánh đánh giá các thuật toán trên các bộ số liệu thử nghiệm theo các tiêu chí khác nhau.
Luận văn đã chạy thử nghiệm thành công thuật toán WFIM khai phá tập mục thƣờng xuyên có trọng số dựa trên FP-Growth. Thuật toán MINWAL khai phá tập mục thƣờng xuyên có trọng số dựa trên Apriori.
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
2. Hƣớng nghiên cứu tiếp theo của đề tài
Sinh các tập luật kết hợp có trọng số và áp dụng khai phá luật kết hợp có trọng số vào một bài toán trong thực tiễn trong các lĩnh vực kinh doanh, tài chính…
Cải tiến chƣơng trình từ ngôn ngữ đến giao diện để thích ứng với ngƣời sử dụng Thu thập đƣợc một kho dữ liệu thực tế hơn để kết quả chƣơng trình có độ chính xác cao hơn.
TÀI LIỆU THAM KHẢO
Tiếng Việt:
1. Nguyễn Hữu Trọng, Lê Đức An, Trần Xuân Việt, Nguyễn Anh Hào (2014), “Một thuật toán tìm tập mục thƣờng xuyên trên cơ sở dữ liệu giao tác có trọng số”, Tạp chí khoa học và công nghệ, 1(02), tr. 65-71.
2. Nguyễn Huy Đức (2010), “Khai phá tập mục cổ phần cao và lợi ích cao trong cơ sở dữ liệu”, Luận án Tiến sĩ Toán học, Viện Công nghệ Thông tin – Viện KH và CN Việt Nam.
3. Trần Huy Dƣơng, Vũ Đức Thi, Trần Thế Anh (2014), Thuật toán khai phá mẫu dãy thƣờng xuyên đóng có trọng số chuẩn hóa với khoảng cách thời gian, Kỷ yếu hội nghị Khoa học Quốc gia lần thứ VII – Nghiên cứu cơ bản và ứng dụng CNTT (Fair’7), tr. 650-658.
4. Vũ Đức Thi, Nguyễn Huy Đức (2008), “Khai phá tập mục thƣờng xuyên cổ phần cao trong cơ sở dữ liệu lớn”, Tạp chí Tin học và Điều khiển học, 24(2), tr. 168-178.
5. Trần Huy Dƣơng, Vũ Đức Thi (2013), Thuật toán khai phá mẫu dãy thƣờng xuyên với trọng số chuẩn hóa sử dụng CSDL tiền tố, Kỷ yếu hội nghị Khoa học Quốc gia lần thứ VI – Nghiên cứu cơ bản và ứng dụng CNTT (Fair’6), tr. 502-511
Tiếng Anh:
6. Agrawal R. And Srikant R. (1994), “Fast algorithms for mining association rules”, in proceedings of 20th International Conference on Very Large Databases, Santiago, Chile.
7. C.H.Cai, A.W.Chee Fu, C.H.Cheng, and W.W.Kwong. “Mining Association Rules with Weighted Items”, IDEAS '98 Proceedings of the 1998 International Symposium on Database Engineering & Applications, pp. 68-77, 1998.
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
8. J.Han, J.Pei, and Y.Yin, “Mining Frequent Patterns without Candidate Generation,”
Proceedings of the 2000 ACM SIGMOD International Conference on Management of Data, pp. 1-12.
9. AzadehSoltani and M.-R.Ak barzadeh-T, “Confabulation-Inspired Association Rule Mining for Rare and Frequent Itemsets”, IEEE transactions on neural networks and learning systems, 2014.
10. Luca Cagliero and Paolo Garza, “Infrequent Weighted Itemset Mining using Frequent Pattern Growth”, IEEE Transactions on Knowledge and Data Engineering, pp. 1- 14, 2013.
11. A.KrishnaKumar, D.Amrita, N.Swathi Priya, “Mining Association Rules between Sets of Items in Large Databases”, International Journal of Science and Modern Engineering (IJSME) ISSN: 2319-6386, Volume-1, Issue-5, April 2013.
12. Unil Yun, John J. Leggett, „WFIM: Weighted Frequent Itemset Mining with a weight range and a minimum weight‟, Proceedings of the 2005 SIAM International Conference on Data Mining, 2005, pp. 636-640.
PHỤ LỤC Mã nguồn chƣơng trình package app.Main; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SpringLayout; import javax.swing.SwingConstants; //import ca.pfv.spmf.gui.MainWindow;
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/ import app.algorithms.sequentialpatterns.fournier2008_seqdim.AlgoFournierViger08; import app.algorithms.sequentialpatterns.fournier2008_seqdim.ItemSimple; import app.algorithms.sequentialpatterns.fournier2008_seqdim.multidimensionalsequentialpattern s.AlgoSeqDim; import app.frequentpatterns.fpgrowth.AlgoCofiTree; import app.frequentpatterns.fpgrowth.AlgoFPGrowth; import app.frequentpatterns.fpgrowth.Database; import app.frequentpatterns.fpgrowth.Itemset; import app.frequentpatterns.fpgrowth.Itemsets; import app.input.sequence_database_list_integers.SequenceDatabase; import app.tools.Utils; /*
* To change this template, choose Tools | Templates * and open the template in the editor.
* @author Kumori */
public class AppControl extends JFrame implements ActionListener { private JMenu fileMenu;
/** Threshold input menu. */ private JMenu tHoldInputMenu; /** Data pre-processing input menu. */ private JMenu dataPreProcMenu; /** Algorithm menu. */
private JMenu algoMenu; /** Output menu. */
private JMenu outputMenu; /** Data array output sub-menu. */ private JMenu dataArrayOutputMenu; /** Frequent set output sub-menu. */ private JMenu freqSetOutputMenu; /** Association rule output sub-menu. */ private JMenu assocRuleOutputMenu; /** Diagnostic output sub-menu. */
private JMenu diagnosticOutputSubMenu; // Menu items
/** File menu items. */
private JMenuItem[] fileMenuItems; /** Threshold input menu items. */
private JMenuItem[] tholdInputMenuItems; /** Data pre-processing menu items. */ private JMenuItem[] dataPreProcMenuItems; /** Algorithm menu items. */
private JMenuItem[] algoMenuItems; /** Output menu items. */
private JMenuItem[] outputMenuItems; /** Data array output sub-menu items. */
private JMenuItem[] dataArrayOutputMenuItems; /** Frequent set output sub-menu items. */
private JMenuItem[] freqSetOutputMenuItems; /** Association rule output sub-menu items. */ private JMenuItem[] assocRuleOutputMenuItems; /** Diagnostic output sub-menu items. */
private JMenuItem[] diagnosticOutputMenuItems; /** Call external project ca*/
private JMenuItem ca; // Menu labels
/* File menu labels. */
//private String fileMenuLabels[] = { "Về phần mềm", "Nạp file dữ liệu giao tác","Nạp file dữ liệu dãy","Nạp file dữ liệu dãy với khoảng cách thời gian", "Nạp file trọng số","Tạo trọng số ngẫu nhiên","Xóa màn hình",
// "Thoát" };
private String fileMenuLabels[] = { "Về phần mềm","Nạp file dữ liệu giao tác","Nạp file trọng số","Xóa màn hình",
"Thoát" };
private String fileMenuActions[] = { "About", "Load Data","Load Weight","Clear Screen",
"Exit" };
/** Threshold parameter input menu labels. */
private String tHoldInputMenuLabels[] = { "Độ hỗ trợ", "Trọng số nhỏ nhất (Chỉ dùng trong WFIM)" };
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
/** Data pre-processing menu labels. */
private String dataPreProcMenuLabels[] = { "Sort", "Sort & Prune" }; /** Algorithm menu labels. */
private String algoMenuLabels[] = { "WFIM (Khai phá tập mục thƣờng xuyên có trọng số dựa trên FP-Growth)",
"MINWAL (Khai phá tập mục thƣờng xuyên có trọng số dựa trên Apriori)", "FP-Growth (Khai phá tập mục thƣờng xuyên sử dụng cây FP-Tree)"}; private String algoMenuActions[] = {"WFIM","COFI-WFIM","WPrefixSpan"}; /** Ouput menu labels. */
private String outputMenuLables[] = { "Output Schema" }; /** Output data array sets sub-menu labels. */
private String outputDataArrayMenuLabels[] = { "Data Att. Numbers", "Data Output Schema" };
/** Output T-tree sub-menu labels. */
private String outputTtreeMenuLabels[] = { "T-tree Statistics", "T-Tree (Att. Numbers)", "T-tree (Graph)" }; /** Output T-tree sub-menu labels. */
private String outputDIC_TtreeMenuLabels[] = { "DIC T-tree Stats", "DIC T-Tree (Att. Numbers)" };
/** Output frequent sets sub-menu labels. */
private String outputFreqSetsMenuLabels[] = { "FSs Att. Numbers", "FSs Output Schema" };
/** Output ARs sub-menu labels. */
private String outputAssocRulesMenuLabels[] = { "ARs Att. Numbers", "ARs Output Schema" };
/** Diagnostic output sub-menu labels. */
private String outputDiagnosticMenuLabels[] = { "Conversion arrays" }; // OTHER COMPONBENTS
/** Credits panel */
private JPanel creditsPanel; /** Text Area. */
private JTextArea textArea; private int numRows; private int numCols;
protected short[][] dataArray = null;
//private String fileName; private File filePath;
private boolean haveDataFlag = true; protected BufferedReader fileInput;
public Database context = new Database();
public SequenceDatabase sequenceDatabase = new SequenceDatabase();
public app.algorithms.sequentialpatterns.fournier2008_seqdim.SequenceDatabase sequenceDatabase1 = new
app.algorithms.sequentialpatterns.fournier2008_seqdim.SequenceDatabase(); public AlgoFPGrowth algo = new AlgoFPGrowth();
public AlgoCofiTree algoCofi = new AlgoCofiTree();
public AlgoPrefixSpan algoPrefixSpan = new AlgoPrefixSpan();
public AlgoFournierViger08 algoFournierViger08 = new AlgoFournierViger08(0, 0, 0, 0, 0, null, false, false);
protected Itemsets patterns = new Itemsets("FREQUENT ITEMSETS"); private double support =40;
private double minWeight =0.7; private double minInterval=0; //C1 private double maxInterval=0; //C2 private double minWholeInterval=0; //C3 private double maxWholeInterval=0; //C4
private String datatype; //TDB transaction, SDB Sequence, STDB Sequence with time
// CONSTANTS
/** Minimum threshold value. */ final static double MIN_THOLD = 0.0; /** Minimum threshold value. */
final static double MAX_THOLD = 100.0; final static String VERSION ="14.07";
final static String title="Đề tài cơ sở CS‟14.07";
private JFrame randomCreateFrame = new JFrame("SpringForm"); public void actionPerformed(ActionEvent event) {
// File menu item About
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
aboutSoftware();
textArea.append("---\n"); }
// File menu load data
else if (event.getActionCommand().equals("Load Data")) { textArea.append("Tên file dữ liệu:\n");
try { loadData(); } catch (FileNotFoundException a) { } textArea.append("---\n"); }
else if (event.getActionCommand().equals("Load Sequence Data")) { textArea.append("Tên file dữ liệu:\n");
try { loadSequenceData(); } catch (FileNotFoundException a) { } textArea.append("---\n"); }
else if (event.getActionCommand().equals("Load Sequence Data with TimeStamp")) {
textArea.append("Tên file dữ liệu:\n"); try { loadSequenceDataWithTimeStamp(); } catch (FileNotFoundException a) { } textArea.append("---\n"); }
else if (event.getActionCommand().equals("Load Weight")) { textArea.append("Tên file trọng số:\n");
try{
loadWeight();
} catch (FileNotFoundException a){ }
textArea.append("---\n"); }
textArea.append("Tạo mảng trọng số ngẫu nhiên:\n"); createRandomWeight();
textArea.append("---\n"); }
//File menu clear screen
else if (event.getActionCommand().equals("Clear Screen")) { //textArea.append("Tạo mảng trọng số ngẫu nhiên:\n"); //createRandomWeight();
//textArea.append("---\n"); textArea.setText("");
}
// File menu exit
else if (event.getActionCommand().equals("Exit")) { System.exit(0);
}
// Threshold input menu item add support threshold
else if (event.getActionCommand().equals("ParamForm")) { //textArea.append("Ngƣỡng hỗ trợ:\n"); showParamForm(); //inputSupportThold(); //textArea.append("---\n"); } else if (event.getActionCommand().equals("Support")) { textArea.append("Ngƣỡng hỗ trợ:\n"); inputSupportThold(); textArea.append("---\n"); }
else if (event.getActionCommand().equals("Min Weight")) { textArea.append("Trọng số nhỏ nhất:\n");
inputMinWeight();
textArea.append("---\n"); }
// Threshold input menu item add confidence threshold else if (event.getActionCommand().equals("Confidence")) {
textArea.append("INPUT CONFIDENCE THRESHOLDS:\n"); // inputConfidenceThold();
textArea.append("---\n"); }
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
else if (event.getActionCommand().equals("Sort")) { textArea.append("SORT INPUT DATA:\n"); // sortInputData();
textArea.append("---\n"); }
// Data pre-processing menu item sort and prune input data. */ else if (event.getActionCommand().equals("Sort & Prune")) {
textArea.append("SORT AND PRUNE INPUT DATA:\n"); // sortAndPruneInputData();
textArea.append("---\n"); }
// Apriori-T menu item apriori-T without X checking. */ else if (event.getActionCommand().equals("Apriori T (with X check)")) {
textArea.append("APRIORI-T (WITH X CHECK):\n"); // aprioriTwithXcheck();
textArea.append("---\n"); }
//WFIM algorithm
else if (event.getActionCommand().equals("WFIM")) { patterns = new Itemsets("FREQUENT ITEMSETS"); algo = new AlgoFPGrowth();
textArea.append("Khai phá tập mục thƣờng xuyên với trọng số chuẩn hóa sử dụng cây FPTree:\n");
//support in double
double minsupp = support/100;
patterns = algo.runAlgorithm(context, minsupp, minWeight); printStart();
patterns.printItemsets(context.size(),textArea);
textArea.append("---END OF RESULT---\n"); private void inputDataSet(JTextArea textArea, File fName)
throws IOException { // Set filePath instance field int counter = 0;
filePath = fName; try {
// Open file
FileReader file = new FileReader(filePath); fileInput = new BufferedReader(file); } catch (IOException ioException) {
JOptionPane.showMessageDialog(null, "Lỗi mở file \"" + filePath + "\"", "FILE INPUT ERROR", JOptionPane.ERROR_MESSAGE); System.exit(1);
}
// Read the file
String line = fileInput.readLine(); while (line != null) {
// checkLine(counter+1,line);
StringTokenizer dataLine = new StringTokenizer(line); int numberOfTokens = dataLine.countTokens();
if (numberOfTokens == 0) break; counter++; if (numCols < numberOfTokens) { numCols = numberOfTokens; } line = fileInput.readLine(); } numRows = counter; createDataArray(fName);
// Check ordering (only if input format is OK) // if (inputFormatOkFlag) {
// if (checkOrdering()) { // Output to text area
textArea.append("Số bản ghi = " + numRows + "\n"); // countNumCols();
textArea.append("Số cột = " + numCols + "\n"); // Set have data flag to true
// haveDataFlag = true;
for (int i = 0; i < numRows; i++) { for (int j = 0; j < numCols; j++) {
textArea.append(dataArray[i][j] + " "); }
textArea.append("\n"); }
}
private void createDataArray(File fName) throws IOException { filePath = fName;
Số hóa bởi Trung tâm Học liệu - ĐHTN http://www.lrc-tnu.edu.vn/
try {
// Open file
FileReader file = new FileReader(filePath); fileInput = new BufferedReader(file); } catch (IOException ioException) {
JOptionPane.showMessageDialog(null, "Error Opening File \"" + filePath + "\"", "FILE INPUT ERROR", JOptionPane.ERROR_MESSAGE); System.exit(1);
}
dataArray = new short[numRows][numCols]; String line = fileInput.readLine();
int irows = 0;
while (line != null) {
StringTokenizer dataLine = new StringTokenizer(line); int numberOfTokens = dataLine.countTokens();
for (int icols = 0; icols < numberOfTokens; icols++) {
dataArray[irows][icols] = new Short(dataLine.nextElement() .toString()); } irows++; line = fileInput.readLine(); } } }