V. GIỚI THIỆU CHƯƠNG TRÌNH DEMO THUẬT TOÁN APRIORI
3. Giao diện chương trình:
- Khi load form lên đã có sẵn các item là a, b, c, d.
Lưu ý: Nếu muốn thêm item e, thì nhập e vào ô Item và Click nút Add Item. Nếu chỉ có 3 item thì Click nút Delete Item để xóa item không cần thiết.
- Đánh dấu vào các ô item a, b,c, d tùy theo giao tác yêu cầu
Click nút Add Transaction
Test (thử nghiệm) với ví dụ minh họa:
Cho CSDL nhị phân với tập mặt hàng I = {a, b, c, d, e} và tập giao tác T = {t1, t2, t3, t4, t5} như sau: a b c d e t1 1 1 0 0 0 t2 1 1 1 0 0 t3 0 1 1 1 1 t4 0 0 0 1 1 t5 1 1 1 1 0
1.Tìm các tập phổ biến thòa minsub = 40%.
2. Tìm các luật kết hợp thỏa minsub = 40% và minconf = 60%
Sau khi nhập xong các giao tác và minsub, minconf theo yêu cầu.
- Khung Transactions sẽ hiện ra các giao tác, nếu cần hiệu chỉnh sẽ Click nút Edit Transaction
- Click nút Solve để Output ra kết quả.
- Rules và Confidence là các luật kết hợp và độ tin cậy đã tìm được thỏa
Nhập vào giá trị minconf
Hiệu chỉnh một giao tác
Nhập vào giá trị Minsup Nhập vào giá trị MinConf
Nhập thêm giá tri
Nhập thêm một mặt hàng Xóa một mặt hàng
Thêm một giao tác Hiệu chỉnh một giao tác Xóa một giao tác Xóa tất cả giao tác
Kết quả như sau:
- Các tập luật phổ biến:
F1 = {a, b, c, d, e]
F2 = {{ab}, {ac}, {bc}, {bd}, {cd}, {de}) F3 = {{abc}, {bcd})
- Tập luật phổ biến tối đại (Maximail Items): {{de}, {abc}, {bcd}}
- Có 21 luật kết hợp thỏa minsup = 40% và minconf = 60% 1. a->b 2. ba 3. ac 4. c->a 5. b->c 6. cb 7. db 100% 75% 67% 67% 75% 100% 67% 8. cd 9. dc 10. de 11. ed 12. abc 13. bca 14. acb 67% 67% 67% 100% 67% 67% 100% 15. cab 16. abc 17. cdb 18. cbd 19. bdc 20. dbc 21. bcd 67% 67% 100% 67% 100% 67% 67% 4. Code chương trình: using System; using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms; namespace Apriori
{
public partial class frmMain : Form {
#region Global Variables
Dictionary<int, string> m_dicTransactions = new Dictionary<int, string>();
Dictionary<string, double> m_dicAllFrequentItems = new Dictionary<string, double>(); int m_nLastTransId = 1; #endregion public frmMain() { InitializeComponent(); }
private void btn_AddItem_Click(object sender, EventArgs e) {
if (ValidateInput(txt_Item, false)) {
string strNewItem = txt_Item.Text;
foreach (ListViewItem lvItem in lv_Items.Items) {
if (lvItem.Text == strNewItem) {
MessageBox.Show("Item (" + strNewItem + ") already exists", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); txt_Item.Text = string.Empty; return; } } lv_Items.Items.Add(strNewItem); txt_Item.Text = string.Empty; } }
private void btn_DeleteItem_Click(object sender, EventArgs e) {
if (lv_Items.CheckedItems.Count > 0) {
for (int i = lv_Items.CheckedItems.Count - 1; i >= 0; i--) {
string strItemtoDelete = lv_Items.CheckedItems[i].ToString(); if (ItemIsRemovable(strItemtoDelete, ref lst_Transactions)) {
lv_Items.Items.Remove(lv_Items.CheckedItems[i]); }
else {
string strTransactions = string.Empty;
foreach (int nTransactionId in lst_Transactions) {
strTransactions += nTransactionId.ToString() + ","; }
strTransactions =
strTransactions.Remove(strTransactions.Length - 1); MessageBox.Show("Can not delete item " +
strItemtoDelete + ", item exists in transactions " + strTransactions, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
} } else
MessageBox.Show("please choose items to delete", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
private bool ValidateInput(TextBox txtBox, bool bIsNumber) {
if (txtBox.Text.Length == 0) {
errorProvider1.SetError(txtBox, "please enter value"); return false;
} else {
if (bIsNumber && int.Parse(txtBox.Text) > 100) {
errorProvider1.SetError(txtBox, "please enter value between 0 and 100"); return false; } else { errorProvider1.SetError(txtBox, ""); return true; } }
}
private void btn_AddTrans_Click(object sender, EventArgs e) {
if (lv_Items.CheckedItems.Count <= 0) {
MessageBox.Show("please choose items to add", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return; }
string strTransactiondic;
string strTransactionLV = GetTransactionFromListView(out strTransactiondic);
ListViewItem lvi = new ListViewItem(m_nLastTransId.ToString()); lvi.Tag = m_nLastTransId; lvi.SubItems.Add(strTransactionLV); lv_Transactions.Items.Add(lvi); m_dicTransactions.Add(m_nLastTransId, strTransactiondic); m_nLastTransId++; }
private void btn_EditTrans_Click(object sender, EventArgs e) {
int nChosenTransactions = lv_Transactions.CheckedItems.Count; if (nChosenTransactions > 1 || nChosenTransactions == 0)
{
MessageBox.Show("please choose one transaction to modify", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return; }
EnableControls(false);
int nTransId = (int)lv_Transactions.CheckedItems[0].Tag; string strTransaction = m_dicTransactions[nTransId]; foreach (ListViewItem lvi in lv_Items.Items)
{
lvi.Checked = false; }
foreach (char cItem in strTransaction) {
for (int i = 0; i < lv_Items.Items.Count; i++) { if (lv_Items.Items[i].Text == cItem.ToString()) { lv_Items.Items[i].Checked = true; } }
} }
private void btn_EndEdit_Click(object sender, EventArgs e) {
EnableControls(true);
int nTransId = (int)lv_Transactions.CheckedItems[0].Tag; string strTransactiondic;
string strTransactionLV = GetTransactionFromListView(out strTransactiondic);
m_dicTransactions[nTransId] = strTransactiondic; ListViewItem lvi = lv_Transactions.CheckedItems[0]; lvi.SubItems.Clear();
lvi.SubItems[0].Text = nTransId.ToString(); lvi.SubItems.Add(strTransactionLV);
}
private void btn_DeleteTrans_Click(object sender, EventArgs e) {
int nChosenTransactions = lv_Transactions.CheckedItems.Count; if (nChosenTransactions < 1)
{
MessageBox.Show("please choose at least one transaction to delete", "Alert", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation); return;
}
for (int i = 0; i < lv_Transactions.CheckedItems.Count; i++) { m_dicTransactions.Remove((int)lv_Transactions.CheckedItems[i].Tag); lv_Transactions.Items.Remove(lv_Transactions.CheckedItems[i]); } }
private void btn_ClearTransactions_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Clear All Transactions ?", "Apriori", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK) { m_nLastTransId = 1; lv_Transactions.Items.Clear(); m_dicTransactions.Clear(); }
}
private void btn_Solve_Click(object sender, EventArgs e) { #region validation if (!ValidateInput(txt_Support, true) || ! ValidateInput(txt_Confidence, true)) { return; } if (lv_Transactions.Items.Count <= 0) {
MessageBox.Show("Enter Transactions first", "Apriori", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } #endregion Solve(); }
private void txt_Confidence_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Back;
}
private void txt_Item_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsLetter(e.KeyChar) && e.KeyChar != (char)Keys.Back;
}
private string GetTransactionFromListView(out string strTransactiondic)
{
strTransactiondic = string.Empty;
string strTransactionReturn = string.Empty;
foreach (ListViewItem lviCheckedItem in lv_Items.CheckedItems) { strTransactiondic += lviCheckedItem.Text; strTransactionReturn += lviCheckedItem.Text + ","; } strTransactionReturn = strTransactionReturn.Remove(strTransactionReturn.Length - 1); return strTransactionReturn;
}
private void Solve() {
double dMinSupport = double.Parse(txt_Support.Text) / 100; double dMinConfidence = double.Parse(txt_Confidence.Text) / 100;
////Scan the transaction database to get the support S of each 1- itemset,
Dictionary<string, double> dic_FrequentItemsL1 = GetL1FrequentItems(dMinSupport);
Dictionary<string, double> dic_FrequentItems = dic_FrequentItemsL1;
Dictionary<string, double> dic_Candidates = new Dictionary<string, double>(); do { dic_Candidates = GenerateCandidates(dic_FrequentItems); dic_FrequentItems = GetFrequentItems(dic_Candidates, dMinSupport); } while (dic_Candidates.Count != 0);
Dictionary<string, Dictionary<string, double>> dicClosedItemSets = GetClosedItemSets();
List<string> lstMaximalItemSets = GetMaximalItemSets(dicClosedItemSets);
List<clssRules> lstRules = GenerateRules(); List<clssRules> lstStrongRules =
GetStrongRules(dMinConfidence, lstRules);
frmOutput objfrmOutput = new frmOutput(m_dicAllFrequentItems, dicClosedItemSets,
lstMaximalItemSets, lstStrongRules); objfrmOutput.ShowDialog();
}
private Dictionary<string, Dictionary<string, double>> GetClosedItemSets()
{
Dictionary<string, Dictionary<string, double>>
dicClosedItemSetsReturn = new Dictionary<string, Dictionary<string, double>>();
Dictionary<string, double> dicParents;
for (int i = 0; i < m_dicAllFrequentItems.Count; i++) {
string strChild = m_dicAllFrequentItems.Keys.ElementAt(i); dicParents = GetItemParents(strChild, i + 1); if (IsClosed(strChild, dicParents)) dicClosedItemSetsReturn.Add(strChild, dicParents); } return dicClosedItemSetsReturn; }
private List<string> GetMaximalItemSets(Dictionary<string, Dictionary<string, double>> dicClosedItemSets)
{
List<string> lstMaximalItemSetsReturn = new List<string>(); Dictionary<string, double> dicParents;
foreach (string strItem in dicClosedItemSets.Keys) { dicParents = dicClosedItemSets[strItem]; if (dicParents.Count == 0) lstMaximalItemSetsReturn.Add(strItem); } return lstMaximalItemSetsReturn; }
private bool IsClosed(string strChild, Dictionary<string, double> dicParents)
{
foreach (string strParent in dicParents.Keys) { if (m_dicAllFrequentItems[strChild] == m_dicAllFrequentItems[strParent]) { return false; } } return true; }
private Dictionary<string, double> GetItemParents(string strChild, int nIndex)
{
Dictionary<string, double> dicParents = new Dictionary<string, double>();
for (int j = nIndex; j < m_dicAllFrequentItems.Count; j++) {
string strParent = m_dicAllFrequentItems.Keys.ElementAt(j); if (strParent.Length == strChild.Length + 1)
{
{ dicParents.Add(strParent, m_dicAllFrequentItems[strParent]); } } } return dicParents; }
private List<clssRules> GetStrongRules(double dMinConfidence, List<clssRules> lstRules)
{
List<clssRules> lstStrongRulesReturn = new List<clssRules>(); foreach (clssRules Rule in lstRules)
{
string strXY = Alphabetize(Rule.X + Rule.Y);
AddStrongRule(Rule, strXY, ref lstStrongRulesReturn, dMinConfidence);
}
lstStrongRulesReturn.Sort(); return lstStrongRulesReturn; }
private void AddStrongRule(clssRules Rule, string strXY, ref List<clssRules> lstStrongRulesReturn, double dMinConfidence) {
double dConfidence = GetConfidence(Rule.X, strXY); clssRules NewRule;
if (dConfidence >= dMinConfidence) {
NewRule = new clssRules(Rule.X, Rule.Y, dConfidence); lstStrongRulesReturn.Add(NewRule);
}
dConfidence = GetConfidence(Rule.Y, strXY); if (dConfidence >= dMinConfidence)
{
NewRule = new clssRules(Rule.Y, Rule.X, dConfidence); lstStrongRulesReturn.Add(NewRule);
} }
private double GetConfidence(string strX, string strXY) {
double dSupport_X, dSupport_XY;
dSupport_X = m_dicAllFrequentItems[strX]; dSupport_XY = m_dicAllFrequentItems[strXY]; return dSupport_XY / dSupport_X;
}
private List<clssRules> GenerateRules() {
List<clssRules> lstRulesReturn = new List<clssRules>(); foreach (string strItem in m_dicAllFrequentItems.Keys) {
if (strItem.Length > 1) {
int nMaxCombinationLength = strItem.Length / 2;
GenerateCombination(strItem, nMaxCombinationLength, ref lstRulesReturn);
} }
return lstRulesReturn; }
private void GenerateCombination(string strItem, int nCombinationLength, ref List<clssRules> lstRulesReturn) {
int nItemLength = strItem.Length; if (nItemLength == 2)
{
AddItem(strItem[0].ToString(), strItem, ref lstRulesReturn); return;
}
else if (nItemLength == 3) {
for (int i = 0; i < nItemLength; i++) {
AddItem(strItem[i].ToString(), strItem, ref lstRulesReturn); }
return; }
else {
for (int i = 0; i < nItemLength; i++) {
GetCombinationRecursive(strItem[i].ToString(), strItem, nCombinationLength, ref lstRulesReturn);
} } }
private void AddItem(string strCombination, string strItem, ref List<clssRules> lstRulesReturn)
string strRemaining = GetRemaining(strCombination, strItem); clssRules Rule = new clssRules(strCombination, strRemaining, 0);
lstRulesReturn.Add(Rule); }
private string GetCombinationRecursive(string strCombination, string strItem, int nCombinationLength, ref List<clssRules>
lstRulesReturn) {
AddItem(strCombination, strItem, ref lstRulesReturn); char cLastTokenCharacter = strCombination[strCombination.Length - 1]; int nLastTokenCharcaterIndex = strCombination.IndexOf(cLastTokenCharacter); int nLastTokenCharcaterIndexInParent = strItem.IndexOf(cLastTokenCharacter); char cNextCharacter;
char cLastItemCharacter = strItem[strItem.Length - 1]; if (strCombination.Length == nCombinationLength) { if (cLastTokenCharacter != cLastItemCharacter) { strCombination = strCombination.Remove(nLastTokenCharcaterIndex, 1); cNextCharacter = strItem[nLastTokenCharcaterIndexInParent + 1];
string strNewToken = strCombination + cNextCharacter; return (GetCombinationRecursive(strNewToken, strItem, nCombinationLength, ref lstRulesReturn));
} else { return string.Empty; } } else { if (strCombination != cLastItemCharacter.ToString()) { cNextCharacter = strItem[nLastTokenCharcaterIndexInParent + 1];
string strNewToken = strCombination + cNextCharacter; return (GetCombinationRecursive(strNewToken, strItem, nCombinationLength, ref lstRulesReturn));
} else
{
return string.Empty; }
} }
private string GetRemaining(string strChild, string strParent) {
for (int i = 0; i < strChild.Length; i++) {
int nIndex = strParent.IndexOf(strChild[i]); strParent = strParent.Remove(nIndex, 1); }
return strParent; }
private Dictionary<string, double>
GetFrequentItems(Dictionary<string, double> dic_Candidates, double dMinSupport)
{
Dictionary<string, double> dic_FrequentReturn = new Dictionary<string, double>();
for (int i = dic_Candidates.Count - 1; i >= 0; i--) {
string strItem = dic_Candidates.Keys.ElementAt(i); double dSupport = dic_Candidates[strItem];
if ((dSupport / (double)(m_nLastTransId - 1) >= dMinSupport)) { dic_FrequentReturn.Add(strItem, dSupport); if(!m_dicAllFrequentItems.ContainsKey(strItem)) m_dicAllFrequentItems.Add(strItem, dSupport); } } return dic_FrequentReturn; }
private Dictionary<string, double>
GenerateCandidates(Dictionary<string, double> dic_FrequentItems) {
Dictionary<string, double> dic_CandidatesReturn = new Dictionary<string, double>();
for (int i = 0; i < dic_FrequentItems.Count - 1; i++) {
string strFirstItem =
Alphabetize(dic_FrequentItems.Keys.ElementAt(i));
for (int j = i + 1; j < dic_FrequentItems.Count; j++) {
string strSecondItem =
Alphabetize(dic_FrequentItems.Keys.ElementAt(j));
string strGeneratedCandidate = GetCandidate(strFirstItem, strSecondItem);
if (strGeneratedCandidate != string.Empty) {
strGeneratedCandidate = Alphabetize(strGeneratedCandidate);
double dSupport = GetSupport(strGeneratedCandidate); dic_CandidatesReturn.Add(strGeneratedCandidate, dSupport); } } } return dic_CandidatesReturn; }
private string Alphabetize(string strToken) {
// Convert to char array, then sort and return char[] arrToken = strToken.ToCharArray(); Array.Sort(arrToken);
return new string(arrToken); }
private double GetSupport(string strGeneratedCandidate) {
double dSupportReturn = 0;
foreach (string strTransaction in m_dicTransactions.Values) { if (IsSubstring(strGeneratedCandidate, strTransaction)) { dSupportReturn++; } } return dSupportReturn; }
private bool IsSubstring(string strChild, string strParent) {
foreach (char c in strChild) { if (!strParent.Contains(c)) { return false; } }
return true; }
private string GetCandidate(string strFirstItem, string strSecondItem)
{
int nLength = strFirstItem.Length; if (nLength == 1)
{
return strFirstItem + strSecondItem; }
else {
string strFirstSubString = strFirstItem.Substring(0, nLength - 1); string strSecondSubString = strSecondItem.Substring(0,
nLength - 1);
if (strFirstSubString == strSecondSubString) {
return strFirstItem + strSecondItem[nLength - 1]; }
else
return string.Empty; }
}
private Dictionary<string, double> GetL1FrequentItems(double dMinSupport)
{
Dictionary<string, double> dic_FrequentItemsReturn = new Dictionary<string, double>();
foreach (ListViewItem lviItem in lv_Items.Items) {
double dSupport = GetSupport(lviItem.Text);
if ((dSupport / (double)(m_nLastTransId - 1) >= dMinSupport)) { dic_FrequentItemsReturn.Add(lviItem.Text, dSupport); if(!m_dicAllFrequentItems.ContainsKey(lviItem.Text)== true) m_dicAllFrequentItems.Add(lviItem.Text, dSupport); } } return dic_FrequentItemsReturn; }
private bool ItemIsRemovable(string strItem, ref List<int> lst_Transactions)
{
bool bItemRemovable = true;
foreach (int nTransaction in m_dicTransactions.Keys) { strTransaction = m_dicTransactions[nTransaction]; if (strTransaction.Contains(strItem)) { lst_Transactions.Add(nTransaction); bItemRemovable = false; } } return bItemRemovable; }
private void EnableControls(bool bEnable) { btn_AddItem.Enabled = bEnable; btn_DeleteItem.Enabled = bEnable; btn_AddTrans.Enabled = bEnable; btn_EditTrans.Visible = bEnable; btn_DeleteTrans.Enabled = bEnable; btn_ClearTransactions.Enabled = bEnable; btn_Solve.Enabled = bEnable; lv_Transactions.Enabled = bEnable; } } }
VI. GIỚI THIỆU CHƯƠNG TRÌNH DEMO THUẬT TOÁN K-MEANS1. Xây dựng chương trình 1. Xây dựng chương trình
Chương trình được viết bằng ngôn ngữ lập trình C++ với mục đích giúp người sử dụng:
- Kiểm tra/ kiểm chứng lại kết quả tính toán (Vì khi tính toán tay mất thời gian và dễ nhầm số)
- Khi số điểm cần gom cụm nhiều việc tính toán tay sẽ bất tiện, việc sử dụng chương trình sẽ giúp người dùng có thể gom các điểm vào cụm một cách nhanh chóng và chính xác.
2. Sử dụng chương trình:
Cách 1: Mở thư mục NGUYEN THI KIM PHUONG - CH1101031 -
Cách 2: Mở thư mục NGUYEN THI KIM PHUONG - CH1101031 -
APRIORI VA KMEANS KMEANS Nhấp phải tại tập tin Kmeans.cpp
Open with Chọn BC.exe.
Bấm tiếp Ctrl – F9 để chạy chương trình (nếu máy tính có cài đặt phần mềm BorlandC nếu không cài sẵn có thể copy thư mục BorlandC trong thư mục thư mục NGUYEN THI KIM PHUONG - CH1101031 - APRIORI VA KMEANS vào máy tính)
3. Giao diện chương trình:
Dùng thuật toán K-Means để gom nhóm với k=2
X1 (4,1); X2(5,1); X3(5,2); X4(1,4); X5(1,5); X6(2,4); X7(2,5)
Nhập số phần tử là 7. Nhập hệ số k là 2.
- Nhập tọa độ các điểm theo yêu cầu.
- Sau khi nhập dữ liệu, bấm phím Enter để kết thúc việc nhập và bấm tiếp một phím bất kỳ để chạy chương trình.
Kết quả lần lặp thứ 1:
Xuất kết quả
Kết quả:
Sau 2 lần lặp kế tiếp, ma trận phân hoạch không đổi, nên thuật toán dừng và xuất ra kết quả: Ta có cụm C1 có vecto trọng tâm V1(4.67,1.33) gồm các điểm x1, x2, x3 và cụm C2 có vecto trọng tâm V2(1.50, 4.50) gồm các điểm x4, x5, x6, x7 4. Code chương trình: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h>
void tinhv(float U[], float x[], float v[], int k, int n) {
int i, j, m; float tgm, tgt; for (i=0; i<k; i++) { tgm = 0; for (j=0; j<n; j++) tgm = tgm+U[i*n+j]; for (j=0; j<2; j++) {
tgt = 0; for (m=0; m<n; m++) tgt = tgt + U[i*n+m]*x[m*2+j]; v[i*2+j] = tgt/tgm; } } }
int ss(float U[], float U1[], int m) {
int i;
for (i=0; i<m; i++) if (U[i]!=U1[i]) return 0; return 1; } float sqr(float x) { return x*x; }
void inU(float U[], int k, int n) {
int i, j;
for (i=0; i<k; i++) { printf("\n"); for (j=0; j<n; j++) printf("%4.0f", U[i*n+j]); } }
void inv(float v[], int k) {
int i;
for (i=0; i<k; i++)
printf("\n v%d = (%.2f, %.2f)",i+1, v[i*2], v[i*2+1]); }
void main() {
float *U, *U1, *x, *v, kc, minkc; int i, j, k, n, count, cum, stop; clrscr();
printf("\n=========== CHUONG TRINH GOM CUM BANG THUAT GIAI K-MEANS ==========");
printf("\nNhap so phan tu (n):"); scanf("%d",&n);
do {
printf("Nhap so cum (k<n):"); scanf("%d",&k); } while (k>n); U = (float *) malloc(k*n*sizeof(float)); U1 = (float *) malloc(k*n*sizeof(float)); x = (float *) malloc(n*2*sizeof(float)); v = (float *) malloc(k*2*sizeof(float)); printf("\nNhap %d diem :\n", n); for (i=0; i<n; i++)
{
printf("Diem %d (x, y):",i+1); scanf("%f%f",&x[2*i], &x[2*i+1]); }
randomize(); for (i=0; i<n; i++)
for (j=0; j<k; j++) U[j*n+i]=0; for (i=0; i<n; i++)
if (i>=k) U[(k-1)*n+i] = 1; // U[random(k)*n+i] = 1; else U[i*n+i] = 1; count=1;
printf("\nMa tran phan hoach ban dau (ngau nhien):"); inU(U, k, n);
do {
tinhv(U, x, v, k, n);
printf("\n==========Lan lap %d==========", count); printf("\n Trong tam:");
inv(v, k);
for (i=0; i<k; i++)
for (j=0; j<n; j++) U1[i*n+j]=0; for (i=0; i<n; i++)
{
cum = 0;
minkc = sqrt(sqr(x[2*i]-v[0])+sqr(x[2*i+1]-v[1])); printf("\nKhoang cach tu x%d den cac trong tam\n",i+1);
for (j=0; j<k; j++) {
kc = sqrt(sqr(x[i*2]-v[j*2])+sqr(x[i*2+1]-v[j*2+1])); printf(" d(x%d, v%d)=%5.2f",i+1, j+1, kc);
if (kc<minkc) { minkc = kc; cum = j; } }
printf(" --> x%d thuoc c%d", i+1, cum+1); U1[cum*n+i] = 1;
}
count++;
stop = ss(U, U1, n*k); U = U1;
printf("\n Ma tran phan hoach:"); inU(U, k, n);
printf("\nAn phim bat ky ..."); getch();
} while (!stop); for (i=0; i<k; i++) {
printf("\nCum %d co trong tam la v%d(%5.2f, %5.2f) gom:", i+1, i+1, v[2*i], v[2*i+1]);
for (j=0; j<n; j++) if (U[i*n+j]==1) printf(" x%d", j+1); } getch(); }
KẾT LUẬN ------
Có thể nói trong thời đại hiện nay, chúng ta quả thực đang “ngập” trong dữ liệu, nhưng lại cảm thấy “thiếu” tri thức và thông tin hữu ích. Lượng dữ liệu khổng lồ này thực sự là một nguồn “tài nguyên” rất giá trị bởi thông tin là yếu tố then chốt trong hoạt động kinh doanh. Hơn thế nữa, nó còn giúp những người điều hành và quản lý có một cái nhìn sâu sắc, chính xác, khách quan vào tiến trình kinh doanh trước khi ra quyết định. Khai phá dữ liệu (KPDL) chính là khai thác những thông tin tiềm ẩn có tính dự đoán từ những CSDL lớn – là một hướng tiếp cận mới với khả năng giúp các công ty chú trọng vào những thông tin có nhiều ý nghĩa từ những tập hợp dữ liệu lớn (databases, data warehouses, data repositories) mang tính lịch sử. KPDL trong cơ sở dữ liệu đang là một xu hướng quan trọng của nền công nghệ thông tin. KPDL có khả năng ứng dụng vào rất nhiều lớp bài toán thực tế khác nhau: từ lĩnh vực quản lý, tài chính, cho đến kinh doanh, sản xuất, và theo xu thế mới hiện nay là khai thác thông tin dữ liệu từ mạng xã hội….
Từ thực tế việc lưu trữ các dữ liệu khổng lồ bao gồm các thông tin đa dạng đã nảy sinh nhu cầu phát triển một khuynh hướng kỹ thuật mới đó là kỹ thuật phát hiện tri thức và khai phá dữ liệu, và tất nhiên sẽ dẫn đến nhu cầu cần có nhiều thuật toán có giá trị phục vụ cho việc khai phá dữ liệu càng lúc càng nhiều hơn nữa.
Có thể nói khi ta có trong tay một CSDL cũng chính là ta có trong tay một kho tri thức. Nhưng vấn đề đặt ra là làm thế nào “lấy được tri thức có ích từ CSDL”, nhất là trong môi trường cạnh tranh, người ta ngày càng cần có nhiều kỹ thuật để khai thác thông tin với tốc độ nhanh để trợ giúp việc ra quyết định. Mục tiêu chính của KPDL là cần có những hướng tiếp cận, những kỹ thuật mới hơn nữa để khai thác được những thông tin hữu ích từ lượng dữ liệu khổng lồ. KPDL tuy là một lĩnh vực mới nhưng đã thu hút được rất nhiều sự quan tâm của các nhà nghiên cứu nhờ vào những ứng dụng thực tiễn của nó. Chúng ta có thể liệt kê ra đây một số ứng dụng điển hình:
• Phân tích dữ liệu và hỗ trợ ra quyết định (data analysis & decision support)
• Điều trị y học (medical treatment): mối liên hệ giữa triệu chứng, chẩn đoán và phương pháp điều trị (chế độ dinh dưỡng, thuốc men, phẩu thuật, …)
• Text mining & Web mining: phân lớp văn bản và các trang web, tóm tắt văn bản, phân loại mail, phân nhóm các group trên mạng xã hội .v.v.
• Tin-sinh (bio-informatics): tìm kiếm, đối sánh các hệ gene và thông tin di truyền, mối liên hệ giữa một số hệ gene và một số bệnh di truyền, .v.v.
• Tài chính và thị trường chứng khoán (finance & stock market): phân tích tình hình tài chính và dự báo giá của các loại cổ phiếu trong thị trường chứng khoán, .v.v.
• Bảo hiểm (insurance)
Chính từ những ứng dụng sinh luật kết hợp từ KPDL để phát hiện ra những quy luật ẩn chứa trong khối lượng dữ liệu khổng lồ sẽ mang lại cho các nhà quản lý hay các nhà đầu tư, kinh doanh nhiều cơ hội để chọn lựa loại sản phẩm cần đầu tư, có hình thức và quy mô giao dịch, các chiến lược phát triển kinh doanh…. Những cách thức gom cụm hiệu quả cũng giúp các nhà quản lý, các nhà kinh doanh phân nhóm các đối tượng khách hàng để có chiến lược