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 kinh doanh đúng đắn và có hướng phát triển trong tương lai….
Không thể liệt kê hết được những ứng dụng thực tiển của KPDL, nhưng có một điều chắc chắn rằng “Người khai phá dữ liệu tốt nhất, nhạy bén rút ra
các luật tốt nhất, từ đó có chiến lược kinh doanh hiệu quả, nắm bắt vận dụng được các luật kết hợp trong xu thế tiêu dùng chung hay định hướng đi đúng đắn sẽ dẫn đến thành công!”. Với tất cả những ưu thế trên, KPDL đã chứng tỏ
được tính hữu dụng của nó trong môi trường kinh doanh đầy tính cạnh tranh. Hiện nay, KPDL đã và đang trở thành một trong những hướng nghiên cứu chính của lĩnh vực khoa học máy tính và công nghệ tri thức.
Và đây cũng chính là ý nghĩa lớn nhất mà môn học “Khai phá dữ liệu và nhà kho dữ liệu” đã mang lại cho mỗi chúng ta.
TÀI LIỆU THAM KHẢO ------
1. Slide bài giảng Chuyên đề Khai phá dữ liệu và Nhà kho dữ liệu – PGS -TS Đỗ Phúc - Đại học Quốc Gia Thành Phố Hồ Chí Minh
2. Giáo trình Khai Thác Dữ Liệu, PGS -TS Đỗ Phúc, - Đại Học Quốc Gia thành phố Hồ Chí Minh – Trường Đại Học Công Nghệ Thông Tin – Nhà xuất bản Đại Học Quốc Gia -2006
3. An Efficient Algorihm For Mining Association Rules In Large
Databases, A. Savaere, E Omiecinski and S.Navathe (1995), In 21 VLDB
Con&.
4. Efficient Algorithms For Discovering Association Rules, In AAAI Wkshp, Knowledge Discoverry in Databases, July. H.Mannila, H. Toivonen and I.Verkamo (1994),