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

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 76 - 96)

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.

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: (adsbygoogle = window.adsbygoogle || []).push({});

- 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.

- 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; (adsbygoogle = window.adsbygoogle || []).push({});

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

void Add(int i, int j);

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. (adsbygoogle = window.adsbygoogle || []).push({});

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ả.

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.

- Hàm RetrieveNeighborhood(.): Với giá trị đầu vào là lớp đang xét và điểm cần tìm các đối tƣợng lân cận nó. Dựa vào giá trị lớp đang xét ta sẽ tính đƣợc bán kính truy vấn vùng m theo công thức:

trong đó A là số điểm trong vùng của lớp C, N là số điểm hiện có thuộc lớp C.

N

N A

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/ Khi đó ta sẽ tìm các điểm lân cận quanh điểm p với bán kính tìm kiếm là m, hàm này sẽ trả về một mảng các điểm tìm đƣợc. (adsbygoogle = window.adsbygoogle || []).push({});

- Hàm UpdateCandidate(.): Sau khi tìm đƣợc các điểm lân cận quanh điểm đang xét, ta cần kiểm tra xem các điểm này có thể đƣa vào lớp C của điểm đang xét hay không. Hàm này sẽ đƣa các điểm sau khi truy vấn vùng vào danh sách candidate để tiến hành kiểm tra.

- Hàm GetCluster(.): Trả về tập các điểm đã đƣợc ấn định vào lớp đƣợc xác định bởi tham số đầu vào là Id của lớp.

- Hàm NNDist(.): Đƣa ra khoảng cách gần nhất của một điểm thuộc một lớp xác định.

- Hàm ExpandCluster(.): Đây là một trong những hàm quan trọng nhất của thuật toán. Hàm này sẽ lần lƣợt xét các điểm trong danh sách các candidate, lấy các điểm ra khỏi danh sách và thử thêm vào lớp hiện tại. Nếu sự phân bố khoảng cách lân cận của các điểm trong lớp vẫn thỏa mãn phân bố mong đợi, thì điểm đang xét sẽ đƣợc thêm vào lớp. Quá trình thực hiện cho đến khi không còn thêm đƣợc điểm nào vào trong lớp hoặc danh sách candidate rỗng.

- Hàm Process(): Hàm này thực hiện quá trình chính của thuật toán. Dựa vào các hàm đã xây dựng trong lớp để tổng hợp nên toàn bộ quá trình chia lớp dữ liệu. Hàm này sẽ lần lƣợt xét các điểm trong toàn bộ dữ liệu, nếu điểm đó chƣa đƣợc phân lớp, nó sẽ đƣợc khởi tạo một lớp mới và bắt đầu xây dựng nên một lớp mới. Quá trình xét các điểm lặp đi lặp lại cho đến khi toàn bộ các điểm trong dữ liệu đã đƣợc xét đến và sau mỗi vòng lặp một lớp mới sẽ đƣợc tạo ra.

4.4.4. Lưu trữ và hiển thị kết quả

Khi thực hiện xong quá trình phân nhóm, ta cần hiển thị kết quả thu đƣợc hoặc lƣu trữ lại kết quả này. Để thực hiện công việc này ta cần xây dựng một số chức năng cho phép hiển thị kết quả dƣới dạng ảnh và lƣu trữ chúng dƣới dạng các file ảnh.

Sau khi thực hiện xong thuật toán, thông tin về chia lớp của các điểm dữ liệu thƣờng đƣợc lƣu trữ trong một mảng trong đó mỗi phần tử của mảng chứa giá trị Id của lớp mà điểm đó thuộc vào. Để hiển thị đƣợc ảnh kết quả của quá trình chia 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/ ta cần chuyển đổi dữ liệu này sang dạng dữ liệu ảnh. Quá trình này đƣợc thực hiện trong hàm ConvertData.

Hàm ConvertData sẽ biến đổi điểm là phần tử thứ i của mảng listCluster chứa giá trị Id của lớp sang giá trị màu hiển thị. Khi đó các điểm có giá trị ID giống

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 76 - 96)