Chương trình thử nghiệm

Một phần của tài liệu nghiên cứu khai phá luật kết hợp mở (Trang 47 - 73)

Bộ công cụ FuzzyARM (Fuzzy Assocation Rules Mining) được phát triển với mục đích thử nghiệm. Nó được viết trên ngôn ngữ Microsoft Visual C#.

Hình 16 – Cửa sổ hiển thị kết quả khai phá luật kết hợp mờ

KẾT LUẬN

Những vấn đề đã được giải quyết:

Với cách tiếp cận dựa trên những đề xuất đã có trong lĩnh vực nghiên cứu về khai phá dữ liệu, bản báo cáo này là một sự tổng hợp những nét chính trong khai phá dữ liệu nói chung và khai phá luật kết hợp nói riêng. Sau đây là những điểm chính đã được giải quyết:

Chương một đã trình bày một cách tổng quát nhất về khai phá dữ liệu - cụ thể là định nghĩa về khai phá dữ liệu và những mục đích, động cơ thúc đẩy các nhà tin học chú trọng vào lĩnh vực nghiên cứu này. Nói tóm lại, chương này cung cấp cho người đọc một cái nhìn chung nhất về lĩnh vực khai phá dữ liệu.

Chương hai phát biểu bài toán khai phá luật kết hợp do R. Agrawal đề xuất năm 1993. Ngoài việc phát biểu các khái niệm một cách hình thức, chương này còn phác họa một số nhánh nghiên cứu cụ thể như luật kế hợp với thuộc tính trọng số, luật kết hợp mờ, khai phá song song luật kết hợp, v.v.. Mục tiêu của chương này là trình bày tất cả những khái niệm cơ bản trong bài toán khai phá luật kết hợp và những mở rộng của bài toán này.

Chương ba trình bày về luật kết hợp với thuộc tính trọng số cùng những ưu, nhược điểm của nó. Tuy nhiên, mục tiêu chính của phần này cũng như của toàn đồ án là trình bày về luật kết hợp mờ, một dạng luật kết hợp mở rộng, mềm dẻo hơn, gần gũi hơn của dạng luật kết hợp cơ bản trong chương hai. Báo cáo đã lý giải được tại sao lại sử dụng hoặc phép lấy min hoặc phép tích đại số cho toán tử T – norm (T - chuẩn) trong công thức 3.6. Phần này cũng đưa ra thuật toán tìm luật kết hợp mờ dựa trên thuật toán Apriori cùng với một vài sửa đổi nhỏ. Cuối chương này là một đề xuất về cách chuyển đổi từ luật kết hợp mờ sang luật kết hợp với thuộc tính trọng số. Đề xuất này làm nổi

bật ưu điểm của luật kết hợp mờ là khi cần thì nó cũng có thể chuyển được về dạng luật kết hợp thông thường một cách dễ dàng.

Phần một của chương bốn đã đưa ra các đánh giá theo nhiều tiêu chí như thời gian thực hiện (tốc độ), số lượng tập phổ biến và số lượng luật tin cậy, ảnh hưởng của các giá trị ngưỡng fminsup và fminconf, ảnh hưởng của kích thước CSDL (số trường và số bản ghi), tính hiệu quả tuỳ theo sự lựa chọn của toán tử T – norm. Phần hai của chương này đã minh hoạ một số giao diện trong bộ công cụ FuzzARM (Fuzzy Association Rule Mining).

Hướng nghiên cứu trong tương lai:

Khai phá luật kết hợp là bài toán được khá nhiều nhà nghiên cứu quan tâm bởi nó được ứng dụng rộng rãi trong các lĩnh vực cũng như chứa đựng nhiều hướng mở rộng khác nhau. Ngay trong luận văn này, em cũng chỉ chọn một hướng nhỏ để nghiên cứu. Trong thời gian tới, em sẽ mở rộng nghiên cứu của mình theo hướng sau:

Nghiên cứu thuật toán song song khai phá luật kết hợp. Mục tiêu của nó là không cần truyền dữ liệu giữa các bộ xử lý trong quá trình tính toán. Do đó chúng có thể hoạt động độc lập và không đồng bộ với nhau trong quá trình duyệt dữ liệu trên bộ nhớ hoặc ổ đĩa cục bộ dẫn đến tốc độ xử lý được tăng lên rất nhiều.

Trên đây là những đánh giá tổng quan nhất về những công việc đã làm được trong quá trình nghiên cứu và hoàn thành đồ án tốt nghiệp. Mặc dù em đã thực sự cố gắng nhưng đề tài vẫn không thể tránh được những thiếu sót. Em rất mong nhận được ý kiến đóng góp của thầy cô và các bạn. Một lần nữa em xin chân thành cảm ơn Thầy giáo Th.S Vũ Vinh Quang cùng toàn thể các thầy cô trong khoa đã tận tình hướng dẫn, giúp đỡ em hoàn thành đồ án này.

(Ngày thực hiện: 01 – 02 – 2007 đến 30 – 02 – 2007) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Classes; using System.IO; using System.Collections; namespace FuzyARM {

public partial class FuzzyARMDlg : Form { int m_intNoOfRows; float [,] m_ptrPtrFloatData; int m_intCols; int m_intRows; int [] m_ptrIntItemIDs; ArrayList m_arrFuzzySetNames; ArrayList m_strArrRules; float m_floatMinConf; float m_floatMinSup; CFreItemSets m_ptrFISs; CMapStringToOb m_mapItemName2Item; CMapWordToOb m_mapItemID2Item; CMapStringToOb m_mapMinedItemName2Item; CMapWordToOb m_mapMinedItemID2Item; public FuzzyARMDlg() { InitializeComponent(); }

private void FuzzyARMDlg_Load(object sender, EventArgs e) {

OpenDialog.DereferenceLinks = true; OpenDialog.CheckPathExists = true; OpenDialog.CheckFileExists = true;

OpenDialog.Filter = "Data Files(*.name;*.names;*.txt)| *.name;*.names*;.txt";

m_mapMinedItemID2Item = new CMapWordToOb(); m_mapMinedItemName2Item = new CMapStringToOb(); m_mapItemID2Item = new CMapWordToOb();

m_mapItemName2Item = new CMapStringToOb(); m_mapItemName2Item = new CMapStringToOb(); m_ptrPtrFloatData = null;

m_intCols = m_intRows = 0; m_ptrIntItemIDs = null; m_ptrFISs = null;

}

private void Init() { MinSup = 5; MinConf = 85; CanMine = false; m_lstItem.Sorted = true; m_lstMinedItem.Sorted = true; m_lstFuzzySet.Sorted = true; DataType = ""; txtDescription.Text = "";

m_arrFuzzySetNames = new ArrayList(); m_strArrRules = new ArrayList(); }

private void OpenDatabase() {

OpenDialog.FileName = "";

DialogResult dlgResult = OpenDialog.ShowDialog(); if (dlgResult != DialogResult.OK)

{

return; }

ResetAll(); (adsbygoogle = window.adsbygoogle || []).push({});

// open *.names file to read database description

Path = OpenDialog.FileName;

OpenDialog.InitialDirectory = Path; string dataFileName;

dataFileName = OpenDialog.FileName;

dataFileName = dataFileName.Replace(".names", ".data"); dataFileName = dataFileName.Replace(".name", ".data"); StreamReader namesFile = new StreamReader(Path);

long filesize = namesFile.BaseStream.Length; int sizeread = 0;

// number of record column

m_lstCtrlData.Columns.Add("Number", "No."); int itemCount = 1;

string result, line, buffer = "";; do

{

buffer = namesFile.ReadLine(); if (buffer == null)

} result = ""; // if read successfully if (buffer.Length > 0) { result = buffer; line = result.Trim();

int colon = line.IndexOf(':');

string itemName = "", itemType = "", strPssValues = "", description = "";

if (buffer[0] != '|' && colon >= 0) {

// extract item name from database discription

itemName = line.Substring(0, colon); m_lstItem.Items.Add(itemName);

line = line.Substring(colon + 1).Trim(); // extract the data type

colon = line.IndexOf(':'); if (colon >= 0)

{

itemType = line.Substring(0, colon); line = line.Substring(colon + 1).Trim(); }

colon = line.IndexOf(':');

int possibleValues = -1; // possible values

if (colon >= 0) {

strPssValues = line.Substring(0, colon); possibleValues = int.Parse(strPssValues); line = line.Substring(colon + 1).Trim(); description = line;

}

// create a new item

CItem ptrItem = new CItem(itemCount, itemName, itemType, description, null, possibleValues);

// add item name and item to m_mapItemNameItem (adsbygoogle = window.adsbygoogle || []).push({});

m_mapItemName2Item.SetAt(itemName, ptrItem); // add item id and item to m_mapItemID2Item

m_mapItemID2Item.SetAt(itemCount, ptrItem); // insert item name into datasheet (a list control)

m_lstCtrlData.Columns.Add(itemName, itemName); itemCount ++;

} }

} while (true); namesFile.Close(); itemCount--;

// read data from *.data file

ReadData(dataFileName, itemCount); }

private void ReadData(string dataFileName, int nItems) {

if (!File.Exists(dataFileName)) return;

// open data file

StreamReader dataFile = new StreamReader(dataFileName); // buffer to contain read data

string buffer, result = "", line = "";

int item = 0; // count the number of records

do

{

// read a record from the open data file

buffer = dataFile.ReadLine(); if (buffer == null) { break; } result = buffer; line = buffer + ",";

ListViewItem listRow = new ListViewItem(); // insert the record number (No.)

listRow.SubItems[0].Text = (item + 1)+""; // prepare for reading real data

string itemContent; int i;

for (i = 0; i < nItems; i++) {

// extract ith item value among the others

int comma = line.IndexOf(',');

itemContent = line.Substring(0, comma).Trim(); // insert the item content into the data-sheet

listRow.SubItems.Add(itemContent);

// replace line with its tail (delete the first item)

line = line.Substring(comma + 1); }

} while (buffer != null); m_intNoOfRows = item; dataFile.Close();

for (int j = 1; j <= nItems; j++) ExamineData(j, item);

} (adsbygoogle = window.adsbygoogle || []).push({});

//void CFuzzyARMDlg::ExamineData(int itemID, int nRows)

private void ExamineData(int itemID, int nRows) {

string buffer = ""; CItem ptrItem;

// lookup Item via the "Item ID" -> "Item" map

ptrItem = (CItem)m_mapItemID2Item.Lookup(itemID); if (ptrItem == null) { MyMessageBox.ContactTechSupport("VALID REFERENCE EXPECTED"); return; }

double minValue = 0, // for Real and Ordered item only

maxValue = 0;

bool firstLine = true;

for (int i = 0; i < nRows; i++) {

// get the text (is also data of this item) of item ith

buffer = m_lstCtrlData.Items[i].SubItems[itemID].Text; if (ptrItem.DataType == "Real" || ptrItem.DataType == "Ordered")

{ // if data type is Real

// convert text into dobule

double value = double.Parse(buffer); if (firstLine)

{ // for first line only

minValue = maxValue = value; firstLine = false; ;

} else

{ // find min and max value of this item

if (value < minValue) { minValue = value; } if (value > maxValue) { maxValue = value; } } }

else if (ptrItem.DataType == "Categorical" || ptrItem.DataType == "Binary")

{

int size = ptrItem.ArrValues.Count; if (size >= ptrItem.PossValues) {

// if reading all possible values

i = nRows; }

else

{

string itemContent = buffer; bool found = false;

found = (ptrItem.ArrValues.IndexOf(itemContent) >= 0); if (!found) { ptrItem.ArrValues.Add(itemContent); } } } else {

// for any future data type

} } (adsbygoogle = window.adsbygoogle || []).push({});

if (ptrItem.DataType == "Real" || ptrItem.DataType == "Ordered") { string str = minValue.ToString(); ptrItem.ArrValues.Add(str); str = maxValue.ToString(); ptrItem.ArrValues.Add(str); }

else if (ptrItem.DataType == "Categorical" || ptrItem.DataType == "Binary")

{

int nFuzzySets = ptrItem.ArrValues.Count; for (int j = 0; j < nFuzzySets; j++) {

string fSName = ptrItem.ItemName + "_" + ptrItem.ArrValues[j].ToString();

CFuzzySet ptrFS = new CFuzzySet(j + 1, fSName, 0.5f, ptrItem);

string strFunc = "";

for (int k = 0; k < nFuzzySets; k++) {

// allocate a new CFRange object

ptrRange = new CFSRange(k,

ptrItem.ArrValues[k].ToString(), ptrItem.ArrValues[k].ToString(), true, (k == j ? 1.0f : 0.0f), strFunc); ptrFS.AddRange(ptrRange); } ptrItem.AddFuzzySet(ptrFS); ptrItem.MapFSName2FS.SetAt(fSName, ptrFS); } } else {

// for any future data type

} }

private void MoveListItems(ListBox source, ListBox destination) {

for (int index = 0; index < source.Items.Count; index++) { destination.Items.Add(source.Items[index].ToString()); } source.Items.Clear(); OnList_MinedItems(); }

private void MoveListItem(ListBox source, ListBox destination) {

int index = source.SelectedIndex; if (index >= 0) { destination.Items.Add(source.Items[index].ToString()); source.Items.RemoveAt(index); OnList_MinedItems(); } }

private void OnList_MinedItems() {

int idx = m_lstMinedItem.SelectedIndex; if (idx < 0) { m_lstFuzzySet.Items.Clear(); m_lstCtrlFSRange.Items.Clear(); DataType = ""; return; }

string itemName = m_lstMinedItem.Items[idx].ToString(); CItem ptrItem = (CItem)m_mapItemName2Item.Lookup(itemName); if (ptrItem == null)

{ MyMessageBox.ContactTechSupport("VALID REFERENCE EXPECTED"); return; } DataType = ptrItem.DataType; m_lstFuzzySet.Items.Clear(); int nFS = ptrItem.FuzzySets.Count; for (int i = 0; i < nFS; i++) { CFuzzySet ptrFS = (CFuzzySet)ptrItem.FuzzySets[i]; m_lstFuzzySet.Items.Add(ptrFS.Name); } if (ptrItem.CurrentFS != null) { int index = m_lstFuzzySet.Items.IndexOf(ptrItem.CurrentFS.Name); if (index >= 0) { m_lstFuzzySet.SelectedIndex = index; } } OnList_FuzzySet(); }

private void OnList_FuzzySet() {

int idx = m_lstFuzzySet.SelectedIndex; if (idx < 0) { m_lstCtrlFSRange.Items.Clear(); return; } string fSName;

// get the selected fuzzy set name

fSName = m_lstFuzzySet.SelectedItem.ToString(); int dash = fSName.IndexOf('_');

// get the corresponding item name of this fuzzy set

string itemName = fSName.Substring(0, dash); // lookup the item via its name

CItem ptrItem = (CItem)m_mapItemName2Item.Lookup(itemName); // lookup the fuzzy set via its name

CFuzzySet ptrFS = (adsbygoogle = window.adsbygoogle || []).push({});

(CFuzzySet)ptrItem.MapFSName2FS.Lookup(fSName); ptrItem.CurrentFS = ptrFS;

txtThreshold.Text = ptrFS.Threshold.ToString(); // delete all ranges of previous fuzzy set

m_lstCtrlFSRange.Items.Clear();

// reading all possible ranges of this fuzzy set

int nRanges = ptrFS.FSRanges.Count; ListViewItem listrow = null;

for (int i = 0; i < nRanges; i++) {

listrow = new ListViewItem();

CFSRange ptrRange = (CFSRange)ptrFS.FSRanges[i]; // range ID

string rangeID = ptrRange.RangeID.ToString(); listrow.SubItems[0].Text = rangeID; // start value listrow.SubItems.Add(ptrRange.Start); // end value listrow.SubItems.Add(ptrRange.End); string value; if (ptrRange.IsConst) { value = ptrRange.Value.ToString(); } else { value = ptrRange.Function; }

// value (constant or function)

listrow.SubItems.Add(value);

m_lstCtrlFSRange.Items.Add(listrow); }

}

private void m_lstItem_SelectedIndexChanged(object sender, EventArgs e)

{

// TODO: Add your control notification handler code here

int idx = m_lstItem.SelectedIndex; string itemName = ""; string description = ""; if (idx >= 0) { itemName = m_lstItem.SelectedItem.ToString(); CItem ptrItem = (CItem)m_mapItemName2Item.Lookup(itemName); if (ptrItem != null)

{

// show the discription for the corresponding item

description = ptrItem.Description; } } txtDescription.Text = description; }

private void m_btnAddFuzzySet_Click(object sender, EventArgs e) {

int idx = m_lstMinedItem.SelectedIndex; if (idx < 0)

{

MyMessageBox.ShowError("You must select an item for adding fuzzy set");

return; }

string itemName;

itemName = m_lstMinedItem.SelectedItem.ToString();

AddFuzzySetDlg addFuzzySetDlg = new AddFuzzySetDlg(itemName + "_");

CItem ptrItem = (CItem)m_mapItemName2Item.Lookup(itemName); // pass this pointer (point to item) to addFuzzySetDlg dialog

addFuzzySetDlg.Item = ptrItem; double minValue = (adsbygoogle = window.adsbygoogle || []).push({});

double.Parse(ptrItem.ArrValues[0].ToString()); double maxValue =

double.Parse(ptrItem.ArrValues[1].ToString()); // convert double values into integers

addFuzzySetDlg.MinItemValue = (int)(minValue); addFuzzySetDlg.MaxItemValue = (int)(maxValue); if (addFuzzySetDlg.ShowDialog() == DialogResult.OK) {

OnList_MinedItems(); }

}

private void m_btnRemoveFuzzySet_Click(object sender, EventArgs e)

{

// TODO: Add your control notification handler code here

int idxFS = m_lstFuzzySet.SelectedIndex;

// checking whether users specify a fuzzy set for removing

if (idxFS < 0) {

MyMessageBox.ShowError("You must select a fuzzy set from the fuzzy set list");

return; }

// get name of fuzzy set

strFSName = m_lstFuzzySet.SelectedItem.ToString(); int idxItem = m_lstMinedItem.SelectedIndex;

// checking whether users select an item

if (idxItem < 0) {

MyMessageBox.ShowError("No item is currently selected"); return;

}

string strItemName;

// get name of the selected item

strItemName = m_lstMinedItem.SelectedItem.ToString(); // lookup the item via its name

CItem ptrItem =

(CItem)m_mapItemName2Item.Lookup(strItemName); // remove this fuzzy set

ptrItem.RemoveFuzzySet(strFSName); m_lstFuzzySet.Items.RemoveAt(idxFS); m_lstCtrlFSRange.Items.Clear(); }

private void m_btnModifyFuzzySet_Click(object sender, EventArgs e)

{

AddFuzzySetDlg modifyFuzzySetDlg = new AddFuzzySetDlg(); int idxFS = m_lstFuzzySet.SelectedIndex;

if (idxFS < 0) { (adsbygoogle = window.adsbygoogle || []).push({});

MyMessageBox.ShowError("You must select a fuzzy set from the fuzzy set list");

return; }

string strFSName;

strFSName = m_lstFuzzySet.SelectedItem.ToString(); int idxItem = m_lstMinedItem.SelectedIndex;

if (idxItem < 0) {

MyMessageBox.ShowError("No item is currently selected"); return; } string strItemName; strItemName = m_lstMinedItem.SelectedItem.ToString(); CItem ptrItem = (CItem)m_mapItemName2Item.Lookup(strItemName); CFuzzySet ptrFS = (CFuzzySet)ptrItem.MapFSName2FS.Lookup(strFSName); ; modifyFuzzySetDlg.Item = ptrItem;

modifyFuzzySetDlg.FuzzySet = ptrFS; modifyFuzzySetDlg.FuzzySetName = strFSName; double minValue = double.Parse(ptrItem.ArrValues[0].ToString()); double maxValue = double.Parse(ptrItem.ArrValues[1].ToString());

modifyFuzzySetDlg.MinItemValue = (int)(minValue); modifyFuzzySetDlg.MaxItemValue = (int)(maxValue); if (modifyFuzzySetDlg.ShowDialog() == DialogResult.OK) {

OnList_MinedItems(); }

}

private void OnCalculate() { m_lstCtrlMinedData.Items.Clear(); m_lstCtrlMinedData.Clear(); m_mapMinedItemName2Item.RemoveAll(); m_mapMinedItemID2Item.RemoveAll(); string strMinedItemName; CItem ptrItem;

int nMinedItems = m_lstMinedItem.Items.Count; if (nMinedItems <= 0)

{

MyMessageBox.ShowError(("There is no item to be mined")); CanMine = false; return; } int nFuzzyItems = 0; int i = 0; while (i < nMinedItems) { strMinedItemName = m_lstMinedItem.Items[i].ToString(); ptrItem = (CItem)m_mapItemName2Item.Lookup(strMinedItemName); if (ptrItem.FuzzySets.Count <= 0) {

MyMessageBox.ShowError("Each item must have at least one fuzzy set associated with it");

m_mapMinedItemName2Item.RemoveAll(); m_mapMinedItemID2Item.RemoveAll(); CanMine = false; return; } nFuzzyItems += ptrItem.FuzzySets.Count; m_mapMinedItemName2Item.SetAt(strMinedItemName, ptrItem); m_mapMinedItemID2Item.SetAt(ptrItem.ItemID, ptrItem);

}

m_ptrIntItemIDs = new int[nFuzzyItems]; m_arrFuzzySetNames.Clear();

m_lstCtrlMinedData.Columns.Add("No"); int nItems = m_mapItemName2Item.Count; int k = 1;

for (i = 0; i <= nItems; i++) {

ptrItem = (CItem)m_mapMinedItemID2Item.Lookup(i); // if this item exists

if (ptrItem != null) {

int nFuzzySets = ptrItem.FuzzySets.Count; for (int j = 0; j < nFuzzySets; j++) { CFuzzySet ptrFS = (CFuzzySet)ptrItem.FuzzySets[j]; m_lstCtrlMinedData.Columns.Add(ptrFS.Name); m_arrFuzzySetNames.Add(ptrFS.Name); m_ptrIntItemIDs[k - 1] = i; k++; } } }

// insert the record No.

for (i = 0; i < m_intNoOfRows; i++) { string strNo = (i + 1) + ""; m_lstCtrlMinedData.Items.Add(strNo); } m_intCols = nFuzzyItems; m_intRows = m_intNoOfRows;

m_ptrPtrFloatData = new float[m_intCols, m_intRows]; string buffer = "";

k = 1;

for (i = 0; i <= nItems; i++) {

ptrItem = (CItem)m_mapMinedItemID2Item.Lookup(i); if (ptrItem!=null) (adsbygoogle = window.adsbygoogle || []).push({});

{

int nFuzzySets = ptrItem.FuzzySets.Count; for (int fs = 0; fs < nFuzzySets; fs++) {

CFuzzySet ptrFS = (CFuzzySet)ptrItem.FuzzySets[fs];

for (int j = 0; j < m_intRows; j++) {

buffer =

m_lstCtrlData.Items[j].SubItems[ptrItem.ItemID].Text; string strValue = buffer;

strValue = result.ToString(); m_lstCtrlMinedData.Items[j].SubItems.Add(strValue);

m_ptrPtrFloatData[k - 1, j] = (float)result; } k++; } } } CanMine = true; ; }

private void OnMine() {

if (MinSup < 0 || MinSup > 100) {

MyMessageBox.ShowError("Minsup must be between 0 and 100");

return; }

if (MinConf < 0 || MinConf > 100) {

MyMessageBox.ShowError("Minconf must be between 0 and 100");

return; }

m_floatMinSup = (float)(MinSup) / 100; m_floatMinConf = (float)(MinConf) / 100; m_ptrFISs = new CFreItemSets(m_intCols + 1); ARMine();

}

private void ARMine() {

string str; int k;

long time1 = DateTime.Now.TimeOfDay.Milliseconds; Counting();

k = 2;

while (m_ptrFISs.LookupOnItemsetSize(k - 1).Count >= 2) { Join(k - 1); Prune(k); Checking(k); k++; }

long time2 = DateTime.Now.TimeOfDay.Milliseconds

long time3 = DateTime.Now.TimeOfDay.Milliseconds; long rule_gen_time = (long)((time3 - time2) / (60)); MiningResultDlg mRDlg = new MiningResultDlg();

mRDlg.FISs = m_ptrFISs;

mRDlg.ArrFuzzySetNames = m_arrFuzzySetNames; mRDlg.ArrRules = m_strArrRules;

mRDlg.FreItemsetTime = fre_itemset_time + " (s)"; mRDlg.GenRuleTime = rule_gen_time + " (s)"; ;

mRDlg.TotalTime = (fre_itemset_time + rule_gen_time) + " (s)"; ; mRDlg.NumOfRecords = m_intRows; mRDlg.TotalAttributes = m_lstMinedItem.Items.Count; mRDlg.NumOfFuzzyItems = m_intCols; mRDlg.NumOfItems = m_mapMinedItemName2Item.Count; mRDlg.MinSup = MinSup + " %"; mRDlg.MinConf = MinConf + " %"; mRDlg.ShowDialog(); }

private void Counting() { (adsbygoogle = window.adsbygoogle || []).push({});

CFreItemSet ptrFIS;

for (int i = 0; i < m_intCols; i++) {

BitSet ptrBs = new BitSet(m_intCols); ptrBs.Add(i);

ptrFIS = new CFreItemSet(ptrBs); float support = 0;

for (int j = 0; j < m_intRows; j++) { support += m_ptrPtrFloatData[i, j]; } support /= m_intRows; if (support >= m_floatMinSup) { ptrFIS.Supprot = support; m_ptrFISs.AddFreItemSet(ptrFIS); } else { } } }

private void Join(int k) { int i, j, card; ArrayList ptrArr; BitSet ptrBs; CFreItemSet ptrFIS; ptrArr = m_ptrFISs.LookupOnItemsetSize(k); if (ptrArr == null) return;

card = ptrArr.Count;

for (i = 0; i < card - 1; i++) {

for (j = i + 1; j < card; j++) {

ptrBs = new BitSet(m_intCols);

CFreItemSet ptrFISI = (CFreItemSet)ptrArr[i]; CFreItemSet ptrFISJ = (CFreItemSet)ptrArr[j]; int max_i = ptrFISI.BsItemSet.GetMaxElement(); int max_j = ptrFISJ.BsItemSet.GetMaxElement();

if (ptrFISI.BsItemSet.MatchPrefix(ptrFISJ.BsItemSet) && (m_ptrIntItemIDs[max_i] != m_ptrIntItemIDs[max_j]))

{

ptrBs =

ptrFISI.BsItemSet.Op_Union(ptrFISJ.BsItemSet);

ptrFIS = new CFreItemSet(ptrBs); m_ptrFISs.AddFreItemSet(ptrFIS); }

} } }

private void Prune(int k) {

if (k <= 2) // if k <= 2 then exit

return; int i, j, u;

ArrayList ptrArr = m_ptrFISs.LookupOnItemsetSize(k);

ArrayList ptrArrK_1 = m_ptrFISs.LookupOnItemsetSize(k - 1); int cardK_1 = ptrArrK_1.Count;

int[] temp = new int[k]; int size;

CFreItemSet ptrFIS = new CFreItemSet(); i = 0;

while (i < ptrArr.Count) {

ptrFIS = (CFreItemSet)ptrArr[i];

ptrFIS.BsItemSet.Convert2Array(out size, temp); bool frequent = true;

j = 0;

while (j < size && frequent) {

ptrFIS.BsItemSet.Remove(temp[j]); bool exist = false; (adsbygoogle = window.adsbygoogle || []).push({});

for (u = 0; u < cardK_1; u++) {

if (ptrFIS.BsItemSet.Op_Equal(ptrFISK_1.BsItemSet)) { exist = true; break; } } if (!exist) frequent = false; ptrFIS.BsItemSet.Add(temp[j]); j++; } if (!frequent) { ptrArr.RemoveAt(i); } else { i++; } } }

private void Checking(int k) {

int i, j, u; ArrayList ptrArr = m_ptrFISs.LookupOnItemsetSize(k); if (ptrArr == null) return; CFreItemSet ptrFIS; int [] temp = new int[k]; int size; i = 0; while (i < ptrArr.Count) {

ptrFIS = (CFreItemSet)ptrArr[i]; ptrFIS.BsItemSet.Convert2Array(out size, temp); float support = 0; for (j = 0; j < m_intRows; j++) {

float recordsup = 1; for (u = 0; u < size; u++) {

Một phần của tài liệu nghiên cứu khai phá luật kết hợp mở (Trang 47 - 73)