Cài đặt thử nghiệm và đánh giá kết quả

Một phần của tài liệu Nghiên cứu, tìm hiểu một số thuật toán cơ bản về phân nhóm dữ liệu trên cơ sở dữ liệu không gian (Trang 74 - 96)

Nhƣ ta đã biết, có rất nhiều thuật toán phân nhóm và mỗi thuật toán đều có những ƣu điểm và nhƣợc điểm. Tuy nhiên tuỳ vào từng ứng dụng với các dạng dữ liệu đầu vào và mục đích khai thác dữ liệu của ngƣời sử dụng mà ta có các chọn lựa áp dụng các thuật toán khác nhau để đạt đƣợc hiệu quả tốt nhất.

Chƣơng này sẽ tiến hành cài đặt một số các thuật toán phân nhóm cho cơ sở dữ liệu không gian nhƣ DBSCAN, DBCLASD. Ngoài ra chƣơng trình còn cài đặt thuật toán K-MEANS là thuật toán đại diện cho hầu hết các thuật toán phân nhóm tốt trong trƣờng hợp dữ liệu thông thƣờng. Và chạy thử các thuật toán này với các dạng dữ liệu đầu vào tự tạo ở dạng là một tập các điểm phân bố trong không gian 2 chiều từ đó có những đánh giá so sánh về tính hiệu quả và khả năng thực hiện của các thuật toán với các dạng dữ liệu khác nhau.

4.4.1. Xây dựng chương trình cài đặt thuật toán phân nhóm

Chƣơng trình đánh giá các thuật toán thực hiện qua 3 khối chính (hình 4.11) gồm khối tạo lập dữ liệu đầu vào, khối thực hiện thuật toán và khối hiển thị kết quả. Khối tạo lập dữ liệu cho phép ngƣời sử dụng tự tạo các mẫu dữ liệu đặc trƣng hoặc đọc dữ liệu đầu vào từ các file ảnh dạng Bitmap. Khối xử lý thuật toán sẽ tiến hành nhận dữ liệu từ khối tạo lập dữ liệu và tiến hành xử lý thực hiện quá trình chia lớp dữ liệu. Khối hiển thị kết quả sẽ hiển thị các lớp dữ liệu sau khi xử lý và có thể lƣu lại dƣới dạng các file bitmap.

Hình 4.11: Sơ đồ thực hiện chƣơng trình

Khối tạo lập dữ liệu Khối thực hiện

thuật toán

Khối hiển thị kết quả

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

4.4.2. Tạo lập dữ liệu

Bộ tạo lập dữ liệu có tác dụng chuẩn bị dữ liệu là đầu vào cho các thuật toán. Bộ phận này cho phép đọc dữ liệu từ các file bitmap hoặc soạn thảo các ảnh bitmap dữ liệu. Quá trình này thực hiện dựa vào lớp đƣợc xây dựng là CBmp

Lớp này cho phép đọc một ảnh bitmap, lấy ra các thông tin về ảnh nhƣ kích thƣớc, bảng màu, hiển thị ảnh bitmap và lƣu trữ ảnh bitmap. Cấu trúc của lớp thao tác với ảnh bitmap CBmp đƣợc xây dựng nhƣ sau:

class CBmp : public CObject {

protected:

LPBYTE m_pBits;//mảng lƣu dữ liệu của ảnh

LPBITMAPINFO m_pBMI;//cấu trúc lƣu thông tin ảnh BOOL CreatePalette();//hàm nạp bảng màu hệ thống WORD PaletteSize() const;

void Free();

CBmp& operator = (CBmp& bmp); public:

CPalette* m_pPalette; CBmp();

virtual ~CBmp();

DWORD Width() const;//hàm lấy chiều rộng của ảnh DWORD Height() const;//hàm lấy chiều cao của ảnh WORD NumColors() const;//hàm lấy số màu

BOOL IsValid() const { return (m_pBMI != NULL); }

BOOL Paint(HDC,LPRECT,LPRECT) const;//hàm hiển thị ảnh DWORD Save(CFile& file) const;//hàm ghi ảnh

DWORD Read(CFile& file);//hàm đọc ảnh void Invalidate() { Free(); }

LPBYTE GetBitmap();

BOOL CreateDib8bit(DWORD width, DWORD height, LPBYTE pBits); };

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ Trong đó 2 hàm quan trọng nhất trong lớp trên đó là hàm Read(Cfile& file) và hàm Save(Cfile& file).

4.4.3. Cài đặt thuật toán phân nhóm

Cấu trúc dữ liệu biểu diễn trong các thuật toán thƣờng là mảng động 1 chiều. Do số lƣợng các đối tƣợng trong mảng dữ liệu thƣờng rất lớn và quá trình xử lý thƣờng phải đọc toàn bộ mảng dữ liệu vào bộ nhớ nên cần sử dụng kỹ thuật cấp phát động để tiết kiệm bộ nhớ và tăng thời gian thực hiện.

a. Xác định khoảng cách giữa các đối tƣợng

Khoảng cách giữa các đối tƣợng trong dữ liệu là một trong những yếu tố quyết định đến hiệu quả và chất lƣợng của các thuật toán chia lớp. Tuỳ vào loại dữ liệu cụ thể và mục đích phân nhóm mà ta đƣa ra các độ đo khoảng cách khác nhau. (adsbygoogle = window.adsbygoogle || []).push({});

Trong chƣơng trình đánh giá các thuật toán với dữ liệu đầu vào ở dạng ảnh không gian 2 chiều, mỗi điểm đối tƣợng trong không gian đƣợc biểu diễn bằng tọa độ Đề các (x,y) ta sẽ sử dụng độ đo khoảng cách Euclide để tính khoảng cách giữa 2 đối tƣợng trong không gian. Cụ thể để tính độ đo khoảng cách giữa 2 điểm đối tƣợng có toạ độ (x1, y1) và (x2, y2) ta sử dụng công thức: 2 2 1 2 2 1 ) ( ) (x x y y D

b. Thuật toán K-means

Ý tƣởng chủ đạo của thuật toán là xác định các điểm đại diện của mỗi lớp sau đó ấn định các điểm đối tƣợng vào các lớp dựa vào khoảng cách của điểm đó đến điểm đại diện của lớp.

Thuật toán đƣợc thực hiện theo các bƣớc sau

Bƣớc 1: Khởi tạo các thông số: số lớp k cần chia, tập các đối tƣợng.

Bƣớc 2: Chọn ngẫu nhiên k đối tƣợng làm điểm đại diện của lớp, thƣờng chọn k đối tƣợng đầu tiên.

Bƣớc 3: Xét từng điểm dữ liệu: tính khoảng cách từ điểm này đến các điểm đại diện của lớp, ấn định điểm dữ liệu vào lớp có khoảng cách đến điểm đại diện là nhỏ nhất.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

Bƣớc 4: Cập nhật lại điểm đại diện của mỗi lớp xác định bằng trung bình cộng tọa độ các điểm thuộc lớp. Cụ thể tọa độ của điểm đại diện đƣợc tính bằng:

Trong đó (xi,yi) là các điểm thuộc lớp t, i=1..n

Nếu có sự thay đổi tọa độ của các điểm đại diện của lớp quay lại bƣớc 3.

Bƣớc 5: Hiển thị kết quả. Kết thúc.

Dữ liệu và các hàm xử lý của thuật toán K-means đƣợc viết trong lớp CKMean nhƣ sau:

class CKMean {

public:

LPBYTE GetResult();

int GetClass(CPoint p, int top, int left); void Add(CPoint p, int top, int left); void Process();

void Init();

CKMean(int k, int w, int h, LPBYTE plistPoint); virtual ~CKMean();

protected:

int UpdateCenter();

void DistributeSample(int p); int Distance(int p1, int p2); LPBYTE listCluster; int *listCenter; int numCluster; int height; int width; LPBYTE listPoint; };

Dữ liệu thuộc lớp CKMeans bao gồm

n x x n i i t 1 n y y n i i t 1

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ Kích thƣớc vùng dữ liệu ảnh đƣợc biểu diễn bởi 2 biến width, height lƣu trữ chiều rộng và chiều cao của mảng dữ liệu.

Biến lƣu trữ tập các điểm dữ liệu là mảng một chiều listPoint. Các phần tử trong mảng nhận 2 giá trị: 1 xác định có điểm dữ liệu và 0 không có điểm dữ liệu. Một điểm trong không gian có tọa độ (x,y) đƣợc chuyển sang vị trí tƣơng ứng của nó trong mảng theo công thức: i = x+y*width

Biến listCluster là mảng một chiều sử dụng để lƣu giá trị lớp của các điểm tƣơng ứng trong mảng dữ liệu listPoint. Mỗi phần tử của mảng listCluster có giá trị là Id của lớp của điểm dữ liệu tƣơng ứng.

Các hàm chính sử dụng trong thuật toán:

- Hàm Init: Khởi tạo thuật toán bao gồm các giá trị đầu vào là kích thƣớc chiều rộng và cao của mảng dữ liệu, mảng dữ liệu các điểm và số lớp cần chia.

- Hàm Distance: Thực hiện tính khoảng cách giữa 2 điểm đối tƣợng tại vị trí p1, p2 trong mảng dữ liệu một chiều listPoint. (adsbygoogle = window.adsbygoogle || []).push({});

- Hàm DistributeSample: Với mỗi điểm đối tƣợng đang xét ta cần tính khoảng cách từ điểm này đến các điểm đại diện của lớp. Ta sẽ ấn định điểm đang xét thuộc vào lớp có khoảng cách đến điểm đại diện của lớp là nhỏ nhất.

- Hàm UpdateCenter: Sau khi phân chia các điểm dữ liệu vào từng lớp tƣơng ứng ta cần tính lại giá trị điểm đại diện của mỗi lớp. Hàm sẽ trả về giá trị 0 nếu không có lớp nào bị thay đổi và giá trị 1 nếu có bất kỳ một điểm đại diện lớp bị thay đổi.

- Hàm Process: Là hàm chính của thuật toán sẽ tổng hợp toàn bộ các bƣớc của thuật toán đến khi đƣa ra đƣợc kết quả cuối cùng. Kết quả chia lớp các điểm sẽ đƣợc lƣu trong biến listCluster.

Sau khi đã xây dựng đƣợc lớp cho thuật toán K-means để thực hiện thuật toán ta chỉ cần tiến hành theo 3 bƣớc:

Khai báo biến thuộc lớp CKMeans.

Gọi hàm Init để khởi tạo các giá trị đầu vào.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

c.Cài đặt thuật toán DBSCAN

Thuật toán DBSCAN thực hiện dựa trên ý tƣởng là xác định mật độ lân cận của mỗi điểm đối tƣợng dữ liệu vƣợt qua một ngƣỡng nào đó. Dựa vào ý tƣởng này ta tiến hành phân nhóm bằng cách lần lƣợt tìm các điểm thỏa mãn điều kiện điểm nhân, sau đó sẽ tìm các điểm phụ thuộc vào điểm nhân này.

Thuật toán đƣợc thực hiện theo các bƣớc sau

Bƣớc 1: Khởi tạo các dữ liệu vào: xác định tham số Eps và MinPts, tập đối tƣợng dữ liệu.

Bƣớc 2: Xét từng điểm đối tƣợng, tìm các điểm lân cận trong bán kính Eps.

Bƣớc 3: Nếu số các điểm lân cận lớn hơn MinPts, gán đối tƣợng này là điểm nhân sang bƣớc 4, ngƣợc lại gán điểm này là điểm nhiễu và quay lại bƣớc 2.

Bƣớc 4: Với điểm nhân tìm đƣợc, xác định tập các điểm lân cận (seed) trong bán kính Eps.

Bƣớc 5: Lấy các điểm p trong tập lân cận (seed). Gán điểm p thuộc lớp đang xét. Nếu điểm p thỏa mãn điều kiện điểm nhân, tìm các lân cận của p và thêm vào tập lân cận seed.

Bƣớc 6: Nếu còn điểm trong tập lân cận quay lại bƣớc 5, ngƣợc lại sang bƣớc 7.

Bƣớc 7: Nếu còn điểm đối tƣợng chƣa xét, quay lại bƣớc 2, ngƣợc lại sang bƣớc 8.

Bƣớc 8: Kết thúc thuật toán. Lƣu trữ kết quả.

Với mỗi điểm nhân tìm đƣợc ta sẽ xây dựng đƣợc một lớp. Các bƣớc 4, 5, 6 thực hiện quá trình tìm tất cả các điểm thuộc vào cùng lớp với điểm nhân xác định. Sau mỗi vòng lặp ta sẽ xây dựng đƣợc một lớp mới.

Để thực hiện thuật toán ta cần chia ra các hàm thực hiện từng công việc nhỏ, các hàm và dữ liệu của thuật toán cài đặt đƣợc gói trong 1 lớp CDBSCAN

class CDbscan {

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ LPBYTE GetResult();

void Process();

CDbscan(int d, int m, int w, int h, LPBYTE pListPoint); virtual ~CDbscan();

private:

int minPts;

HANDLE hlistCluster; int esp;

LPBYTE listPoint; //du lieu cac diem int width,height;

LPBYTE listCluster; //du lieu cac diem chia lop protected:

void Add(int i, int j); (adsbygoogle = window.adsbygoogle || []).push({});

void ExpandCluster(int i, int j, int clusterId); BOOL Core(int i, int j);

BOOL DensityReachable(int i, int j, int k, int h); };

Các dữ liệu sử dụng trong cài đặt bao gồm:

- Hai biến widthheight xác định độ rộng và cao của mảng dữ liệu 2 chiều của dữ liệu đầu vào.

- Biến listPoint là mảng lƣu trữ các đối tƣợng cần phân nhóm.

- Biến listCluster lƣu trữ lớp của mỗi điểm dữ liệu tƣơng ứng trong mảng listPoint.

- Biến eps xác định bán kính tìm các điểm lân cận của một đối tƣợng. - Biến minPts xác định số điểm lân cận tối thiểu của một điểm.

Các hàm sử dụng trong thuật toán:

- Hàm DensityReachable(.): Đầu vào là tọa độ 2 điểm (i,j) và (k,h), hàm sẽ kiểm tra điểm (k,h) có đến đƣợc điểm (i,j) và sẽ trả về giá trị đúng hoặc sai.

- Hàm Core(i,j): Kiểm tra điểm (i,j) có phải là điểm nhân.

- Hàm ExpandCluster(.): Xuất phát từ 1 điểm nhân, thực hiện loang để tìm tất cả các điểm nhân thuộc cùng một lớp.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ - Hàm Add(i,j): Thêm các điểm không phải điểm nhân vào lớp.

- Hàm Process(): Hàm chính của thuật toán thực hiện toàn bộ các bƣớc của thuật toán. Kết thúc hàm này ta đƣợc lớp của mỗi điểm lƣu trong mảng listCluster.

d. Cài đặt thuật toán DBCLASD

Thuật toán DBCLASD đƣợc thực hiện chủ yếu dựa vào sự phân bố đồng đều của các điểm trong cùng một lớp. Quá trình phân nhóm là quá trình tăng dần nghĩa là số các phần tử thuộc lớp sẽ tăng dần. Ý tƣởng chủ đạo của thuật toán là dựa vào đặc trƣng phân bố xác suất về khoảng cách của các điểm lân cận gần nhất trong mỗi lớp. Nội dung cụ thể của thuật toán đã đƣợc trình bày chi tiết trong phần trƣớc. Trong phần này ta chỉ quan tâm đến quá trình thực hiện của thuật toán nhằm tìm ra các lớp với tập dữ liệu đầu vào.

Thuật toán bao gồm các bƣớc sau:

Bƣớc 1: Khởi tạo các danh sách dùng trong thuật toán.

Bƣớc 2: Xét từng p điểm thuộc dữ liệu. Nếu điểm p chƣa đƣợc chia lớp: - Tạo lớp mới C và ấn định p vào lớp này.

- Mở rộng lớp C bởi 29 điểm lân cận.

Bƣớc 3: Với mỗi điểm p1 thuộc lớp C:

Thực hiện tìm các điểm lân cận p1 trong bán kính m. Bán kính m đƣợc tính dựa vào sự phân bố các điểm đã thuộc lớp. Các điểm lân cận p trong bán kính m đƣợc đƣa vào danh sách candidate để kiểm tra.

Bƣớc 4: Lấy điểm c trong danh sách candidate thêm vào lớp C. Change = False. Nếu lớp C vẫn thỏa mãn sự phân bố xác suất mong đợi:

- Thêm điểm c vào lớp C.

- Tìm các điểm lân cận c trong bán kính m. - Change = True.

- Ngƣợc lại lớp C không thỏa mãn: - Loại điểm c khỏi lớp C.

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/

Bƣớc 5: Nếu còn điểm trong danh sách candidate quay lại bƣớc 3 ngƣợc lại sang bƣớc 6.

Bƣớc 6: Cập nhật danh sách candidate bằng danh sách uncandidate để kiểm tra lại các điểm. Nếu change =True quay lại bƣớc 3 ngƣợc lại sang bƣớc 7.

Bƣớc 7: Nếu còn điểm chƣa đƣợc phân lớp quay lại bƣớc 2 ngƣợc lại sang bƣớc 8.

Bƣớc 8: Kết thúc thuật toán. Lƣu trữ kết quả. (adsbygoogle = window.adsbygoogle || []).push({});

Thuật toán đƣợc phân chia thành các bƣớc để từ đó có thể dễ dàng cài đặt viết các hàm và thủ tục xử lý từng công việc. Trong đó các bƣớc 4, 5, 6 thực hiện quá trình kiểm tra các điểm trong danh sách các candidate để từ đó mở rộng lớp. Quá trình kiểm tra này đƣợc thực hiện lặp đi lặp lại đến khi không còn điểm trong danh sách candidate hoặc sau lần kiểm tra cuối cùng không có một điểm nào đƣợc thêm vào lớp (ta sử dụng biến change để xác định điều này). Sau mỗi vòng lặp từ bƣớc 2 đến bƣớc 7 ta sẽ xây dựng đƣợc một lớp.

Cài đặt thuật toán

Từ việc phân tích các bƣớc của thuật toán ta có thể xây dựng đƣợc một lớp gồm các hàm và dữ liệu phục vụ cho quá trình chia lớp. Các dữ liệu và hàm của thuật toán DBCLASD đƣợc gói trong 1 lớp CDbclasd nhƣ sau:

class CDbclasd {

private:

LPBYTE listPoint; //du lieu cac diem int width,height;

LPBYTE listCluster; //du lieu cac diem chia lop int currCluster; int *listCdd; int *listUnCdd; int expDist; int luu; int *listCrCl;

Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn/ public:

LPBYTE GetResult();

CDbclasd(int w, int h, LPBYTE pListPoint); virtual ~CDbclasd();

void Init();

void ExpandCluster(int clusterId);

void RetrieveNeighborhood(int clusterId, int point); void UpdateCandidates(int *listPoint);

void Process();

int *GetCluster(int clusterId);

double Function(float x, int N, int R); int Radius(int N, int A);

int XTest(int clusterId); int NNDist(int point); protected:

};

Các dữ liệu sử dụng trong cài đặt thuật toán bao gồm:

- Biến widthheight để lƣu trữ giá trị độ rộng và độ cao của mảng dữ liệu. - Mảng dữ liệu listPoint lƣu trữ các điểm đối tƣợng dƣới dạng mảng 1 chiều. - Mảng listCluster lƣu trữ lớp của các điểm tƣơng ứng trong mảng listPoint. Khi điểm chƣa đƣợc chia lớp giá trị của điểm trong mảng listCluster là 0, điểm đã đƣợc xét đến nhƣng chƣa đƣợc chia lớp giá trị của phần tử trong mảng là -1.

- Hai biến mảng một chiều candidateuncandidate lƣu trữ các điểm đang trong quá trình xét và cần đƣợc kiểm tra để ấn định vào lớp.

Các hàm sử dụng trong thuật toán

- Hàm Init(.): Khởi tạo thuật toán nhận các giá trị đầu vào nhƣ kích thƣớc và nội dung của mảng dữ liệu cần chia lớp.

Một phần của tài liệu Nghiên cứu, tìm hiểu một số thuật toán cơ bản về phân nhóm dữ liệu trên cơ sở dữ liệu không gian (Trang 74 - 96)