You are on page 1of 34

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO MÔN

KHO DỮ LIỆU VÀ KHAI PHÁ DỮ LIỆU

Nhóm học phần: 04

Nhóm bài tập lớn: 03

Đề tài: Xây dựng và đánh giá một số phương pháp


phân cụm phổ biến

Giảng viên : Nguyễn Quỳnh Chi

Thành viên:

LỜI CẢM ƠN
Trước tiên với tình cảm sâu sắc và chân thành nhất, cho phép chúng em xin gửi
lòng biết ơn đến quý thầy cô tại Học viện Công nghệ Bưu chính Viễn thông đã
tạo điều kiện hỗ trợ, giúp đỡ chúng em suốt quá trình học tập và nghiên cứu vừa
qua.

Đặc biệt, trong học kỳ này, học viện đã tổ chức cho chúng em được tiếp cận với
các môn học rất hữu ích đối với sinh viên. Chúng em xin chân thành cảm ơn cô
Nguyễn Quỳnh Chi đã tận tâm hướng dẫn chúng em trong môn học Kho dữ liệu
và Khai phá dữ liệu. Cô đã luôn bên cạnh, tạo điều kiện trong suốt quá trình
nghiên cứu, động viên và giúp đỡ để chúng em hoàn thành tốt báo cáo này.

Do kiến thức còn nhiều hạn chế và khả năng tiếp thu thực tế còn nhiều bỡ ngỡ
chưa hoàn hảo nên bài báo cáo sẽ còn nhiều thiếu sót, kính mong sự góp ý và
giúp đỡ từ cô.

Cuối cùng chúng em xin kính chúc quý thầy cô dồi dào sức khỏe, niềm tin để
tiếp tục thực hiện sứ mệnh cao đẹp của mình là truyền đạt kiến thức cho thế hệ
mai sau.

Chúng em xin chân thành cảm ơn.


Mục lục

I. Giới thiệu 4
1. Phân cụm dữ liệu 4
1.1. Định nghĩa 4
1.2. Thế nào là phân cụm tốt? 5
1.3. Bài toán phân cụm 5
1.4. Các ứng dụng của phân cụm 6
1.5. Các yêu cầu đối với phân cụm dữ liệu 6
2. Bộ dữ liệu sử dụng 6
3. Mô tả bộ dữ liệu 6
II. Tiền xử lý 7
III. Triển khai thuật toán: 7
1. Thuật toán K-Means 7
1.1. Giới thiệu thuật toán 7
1.2. Triển khai thuật toán K-Means: 8
2.3. So sánh với kết quả khi sử dụng thư viện 13
2. Thuật toán DBSCAN 16
2.1. Giới thiệu thuật toán 16
2.2. Triển khai thuật toán DBSCAN 19
2.3. So sánh với kết quả khi sử dụng thư viện 24
3. Thuật toán BRICH 24
3.1. Giới thiệu thuật toán: 24
3.2. Triển khai thuật toán 26
3.3. So sánh kết quả với khi sử dụng thư viện 29
IV. Đánh giá các thuật toán 30
So sánh các thuật toán: 30
Phân công công công việc cho các thành viên trong nhóm

Lăng Đức Hải Tìm hiểu + triển khai thuật toán


K-Means
Phạm Như Quỳnh Tìm hiểu + triển khai thuật toán
DBSCAN
Vũ Đức Huy Tìm hiểu + triển khai thuật toán
DBSCAN
Lê Ngọc Hưng Tìm hiểu + triển khai thuật toán
BIRCH
Nguyễn Đình Long Tìm hiểu + triển khai thuật toán
BIRCH
I. Giới thiệu
1. Phân cụm dữ liệu
1.1. Một số khái niệm
- Phân cụm dữ liệu - PCDL (Data Clustering) là một trong những hướng
nghiên cứu trọng tâm của lĩnh vực khai phá dữ liệu (Data Mining) khám
phá tri thức (KDD). Mục đích của phân cụm là nhóm các đối tượng vào
các cụm sao cho các đối tượng trong cùng một cụm có tính tương đồng
cao và độ bất tương đồng giữa các cụm lớn, từ đó cung cấp thông tin, tri
thức hữu ích cho việc ra quyết định.
- Phân cụm dữ liệu hay phân cụm, gom cụm, cũng có thể gọi là phân tích
cụm, phân tích phân đoạn, phân tích phân loại; “là một kỹ thuật trong
Data mining nhằm tìm kiếm, phát hiện, nhóm một tập các đối tượng thực
thể hay trừu tượng thành lớp các đối tượng tương tự trong tập dữ liệu lớn
để từ đó cung cấp thông tin, tri thức cho việc ra quyết định.”.
- Một cụm là một tập hợp các đối tượng dữ liệu mà các phần tử của nó
“tương tự” (Similar) nhau cùng trong một cụm và “phi tương tự”
(Dissimilar) với các đối tượng trong các cụm khác. Một cụm các đối
tượng dữ liệu có thể xem như là một nhóm trong nhiều ứng dụng.
- Số các cụm dữ liệu được phân ở đây có thể được xác định trước theo kinh
nghiệm hoặc có thể được tự động xác định khi thực hiện phương pháp
phân cụm.
Chúng ta có thể minh hoạ vấn đề phân cụm như Hình sau đây:

Mô phỏng vấn đề phân cụm dữ liệu


- Trong hình trên, sau khi phân cụm chúng ta thu được bốn cụm trong đó
các phần tử "gần nhau" hay là "tương tự" thì được xếp vào một cụm,
trong khi đó các phần tử "xa nhau" hay là "phi tương tự" thì chúng thuộc
về các cụm khác nhau.
- Trong học máy, phân cụm dữ liệu được xem là vấn đề học không có giám
sát, vì nó phải đi giải quyết vấn đề tìm một cấu trúc trong tập hợp các dữ
liệu chưa biết biết trước các thông tin về lớp hay các thông tin về tập
huấn luyện. Trong nhiều trường hợp, khi phân lớp (Classification) được
xem là việc học có giám sát thì phân cụm dữ liệu là một bước trong phân
lớp dữ liệu, trong đó PCDL sẽ khởi tạo các lớp cho phân lớp bằng cách
xác định các nhãn cho các nhóm dữ liệu.
- Một vấn đề thường gặp trong PCDL đó là hầu hết các dữ liệu cần cho
phân cụm đều có chứa dữ liệu "nhiễu" (noise) do quá trình thu thập thiếu
chính xác hoặc thiếu đầy đủ, vì vậy cần phải xây dựng chiến lược cho
bước tiền xử lý dữ liệu nhằm khắc phục hoặc loại bỏ "nhiễu" trước khi
bước vào giai đoạn phân tích phân cụm dữ liệu. "Nhiễu" ở đây có thể là
các đối tượng dữ liệu không không chính xác, hoặc là các đối tượng dữ
liệu khuyết thông tin về một số thuộc tính. Một trong các kỹ thuật xử lý
nhiễu phổ biến là việc thay thế giá trị của các thuộc tính của đối tượng
"nhiễu" bằng giá trị thuộc tính tương ứng của đối tượng dữ liệu gần nhất.
- Phân cụm dữ liệu là một vấn đề khó, vì rằng người ta phải đi giải quyết
các vấn đề con cơ bản như sau:
+ Xây dựng hàm tính độ tương tự
+ Xây dựng các tiêu chuẩn phân cụm.
+ Xây dựng mô hình cho cấu trúc cụm dữ liệu
+ Xây dựng thuật toán phân cụm và xác lập các điều kiện khởi tạo
+ Xây dựng các thủ tục biểu diễn và đánh giá kết quả phân cụm.

- Phân cụm dữ liệu là bài toán thuộc vào lĩnh vực học máy không giám sát
và đang được ứng dụng rộng rãi để khai thác thông tin hữu ích từ dữ liệu.
Phân cụm dữ liệu là quá trình phân chia một tập dữ liệu ban đầu thành
các cụm sao cho các đối tượng trong cùng một cụm “tương tự” nhau. Vì
vậy phải xác định được một phép đo “khoảng cách” hay phép đo tương tự
giữa các cặp đối tượng để phân chia chúng vào các cụm khác nhau. Dựa
vào hàm tính độ tương tự này cho phép xác định được hai đối tượng có
tương tự hay không. Theo quy ước, giá trị của hàm tính độ đo tương tự
càng lớn thì sự tương đồng giữa các đối tượng càng lớn và ngược lại.
Hàm tính độ phi tương tự tỉ lệ nghịch với hàm tính độ tương tự.

1.2. Thế nào là phân cụm tốt?


- Một phương pháp tốt sẽ tạo ra các cụm có chất lượng cao theo nghĩa có
sự tương tự cao trong một cụm, tương tự thấp giữa các cụm.
- Chất lượng của kết quả gom cụm phụ thuộc vào: độ đo tương tự sử dụng
và việc cài đặt độ đo tương tự.

1.3. Bài toán phân cụm


- Bài toán phân cụm dữ liệu thường được hiểu là một bài toán học không
giám sát và được phát biểu như sau: Cho tập X = {x1 ,..., xn } gồm n đối
tượng dữ liệu trong
𝑝
không gian p-chiều, 𝑥𝑖 ϵ 𝑅 . Ta cần chia X thành k cụm đôi một không
giao nhau sao cho các đối tượng trong cùng một cụm thì tương tự nhau và
các đối tượng trong các cụm khác nhau thì khác nhau hơn theo một cách
nhìn nào đó.
- Số lượng k cụm có thể được cho trước hoặc xác định nhờ phương pháp
phân cụm. Để thực hiện phân cụm ta cần xác định được mức độ tương tự
giữa các đối tượng, tiêu chuẩn để phân cụm, trên cơ sở đó xây dựng mô
hình và các thuật toán phân cụm theo nhiều cách tiếp cận. Mỗi cách tiếp
cận cho ta kết quả phân cụm với ý nghĩa sử dụng khác nhau.

1.4. Các ứng dụng của phân cụm


- Phân cụm DL là một trong những công cụ chính được ứng dụng trong
nhiều lĩnh vực. Một số ứng dụng điển hình trong các lĩnh vực sau:
+ Trong thương mại, PCDL có thể giúp các thương nhân khám phá ra
các nhóm khách hàng quan trọng có các đặc trưng tương đồng nhau
và đặc tả họ từ các mẫu mua bán trong CSDL khách hàng.
+ Trong sinh học, PCDL được sử dụng để xác định các loại sinh vật,
phân loại các Gen với chức năng tương đồng và thu được các cấu
trúc trong các mẫu.
+ Phân tích dữ liệu không gian: Do sự đồ sộ của dữ liệu không gian
như dữ liệu thu được từ các hình ảnh chụp từ vệ tinh, các thiết bị y
học hoặc hệ thống thông tin địa lý (GIS),… người dùng rất khó để
kiểm tra các dữ liệu không gian một cách chi tiết. PCDL có thể trợ
giúp người dùng tự động phân tích và xử lý các dữ liệu không gian
như nhận dạng và chiết xuất các đặc tính hoặc các mẫu dữ liệu
quan tâm có thể tồn tại trong CSDL không gian.
+ Lập quy hoạch đô thị: Nhận dạng các nhóm nhà theo kiểu và vị trí
địa lý,… nhằm cung cấp thông tin cho quy hoạch đô thị.
+ Nghiên cứu trái đất: Phân cụm để theo dõi các tâm động đất nhằm
cung cấp thông tin cho nhận dạng các vùng nguy hiểm.
+ Web Mining: PCDL có thể khám phá các nhóm tài liệu quan trọng,
có nhiều ý nghĩa trong môi trường Web. Các lớp tài liệu này trợ
giúp cho việc khám phá tri thức từ dữ liệu, …

1.5. Các yêu cầu đối với phân cụm dữ liệu


- Một thuật toán phân cụm tốt phải đáp ứng được các yêu cầu sau:
+ Scalability: Có khả năng mở rộng
+ Khả năng làm việc với các loại thuộc tính khác nhau
+ Khám phá ra các cụm có hình dạng bất kì
+ Yêu cầu tối thiểu về tri thức lĩnh vực nhằm xác định các tham
biến đầu vào
+ Khả năng làm việc với dữ liệu có chứa nhiễu (outliers).
+ Không nhạy cảm với thứ tự các bản ghi nhập vào.
+ Khả năng làm việc với dữ liệu nhiều chiều.
+ Có thể diễn dịch và khả dụng.

2. Bộ dữ liệu sử dụng
- Sử dụng bộ dữ liệu shopping – data bao gồm 200 quan sát về điểm chi
tiêu của khách hàng. Bộ dữ liệu bao gồm các trường thông tin đầu vào
như giới tính, độ tuổi, thu nhập và điểm chi tiêu. Một quan sát được đặc
trưng bởi trường CustomerID đại diện cho mã khách hàng.
- Link download: Mall Customer Segmentation Data | Kaggle
- Số bản ghi: 200
- Số thuộc tính: 5
+ CustomerID: mã ID duy nhất của khách hàng
+ Genre: giới tính
+ Age: độ tuổi
+ Annual Income: thu nhập hàng năm
+ Spending Score: điểm do trung tâm mua sắm chỉ định dựa trên
hành vi của khách hàng
=> Trong bài báo cáo này, ta sử dụng 2 thuộc tính Annual Income
và Spending Score để phân cụm các điểm cho bài toán do đây là 2 yếu tố
chính ảnh hưởng đến chi tiêu của khách hàng và việc quan sát tọa độ các
điểm trong không gian 2 chiều là trực quan hơn

II. Tiền xử lý
- Có rất nhiều phương pháp để chuẩn hóa dữ liệu. Đối với bài toán phân
cụm, ta cần chú ý đến 2 phương pháp là Normalize và Phát hiện, loại bỏ
điểm ngoại lai (nhiễu). Tuy nhiên ở bài toán này, dữ liệu mang tính demo
nên sẽ chỉ sử dụng phương pháp Normalize để chuẩn hóa dải giá trị các
thuộc tính về đoạn [0;1] để khi tính độ tương đồng bằng cách áp dụng các
hàm tính khoảng cách sẽ thu được độ chính xác cao hơn; biết được thuật
toán nào hoạt động tốt trên các điểm ngoại lai.
- Các bước thực hiện Normalize bao gồm:
+ Tính trung bình giá trị thuộc tính:

+ Tính độ lệch trung bình:

+ Chuẩn hóa lại từng giá trị thuộc tính cho từng bản ghi:

III. Triển khai thuật toán:


1. Thuật toán K-Means
1.1. Giới thiệu thuật toán
- K-means là thuật toán phân cụm dạng phân khu (Partitional clustering),
nghĩa là đi xây dựng các cụm trước sau đó đánh giá lại chúng theo một
vài tiêu chí.
- Mỗi một cụm sẽ được đặc trưng bởi một centroid- tâm cụm hay điểm
trung tâm, được tính bởi tọa độ trung bình của các điểm trong cụm.
- Mỗi một điểm sẽ được chỉ định vào cụm có khoảng cách từ tâm tới nó
ngắn nhất.
- Đầu vào của thuật toán cần truyền vào k cụm muốn phân, tuy nhiên ta có
thể xác định số cụm tối ưu bằng thuật toán Elbow
- Giả mã:
Khởi tạo k tâm cụm với các giá trị ngẫu nhiên
Lặp qua tập điểm tới khi tọa độ tâm cụm
không đổi hoặc trong một số lần lặp nhất
định:
Tìm cụm gần nhất với điểm đang xét
Gán tâm cụm cho điểm đó
Cập nhật giá trị tâm của cụm vừa được
thêm điểm
* Một số vấn đề khi xây dựng phân cụm với K-means:
- Việc khởi tạo tọa độ ban đầu của các tâm cụm ảnh hưởng đến thời gian
chạy của thuật toán: khi khởi tạo chúng có giá trị gần với các tâm cụm
mong muốn sẽ giúp các cụm hội tụ nhanh. Do đó, ta thường khởi tạo tọa
độ các cụm ban đầu một cách ngẫu nhiên nằm trong khoảng giá trị của
các thuộc tính.
- Tính toán độ tương đồng có thể sử dụng các công thức khoảng cách như
Euclid, Cosin,...
- Thông thường thuật toán sẽ hội tụ sau một vài vòng lặp. Tuy nhiên khi có
nhiều điểm ngoại lai hoặc phân bố không phù hợp sẽ làm cho thuật toán
hội tụ rấ lâu hoặc không bao giờ hội tụ => Nên kết thúc thuật toán khi đạt
tới vòng lặp tối đa.
- Độ phức tạp là O(n*k*l*d) với:
n - số điểm dữ liệu k - số tâm cụm
l - số vòng lặp tối đa d - số thuộc tính của dữ liệu

1.2. Triển khai thuật toán K-Means:

* Đầu tiên, xây dựng các hàm con để phục vụ tính toán.
- Hàm đọc dữ liệu từ file .csv, sử dụng thư viện pandas
- Hàm tính toán giá trị min, max của từng thuộc tính bằng cách duyệt qua
tất cả các điểm

- Hàm khởi tạo giá trị k tâm cụm có giá trị ngẫu nhiên nằm trong giải giá
trị của các thuộc tính
- Hàm tính khoảng cách Euclide để tính toán khoảng cách giữa 2 điểm

- Hàm phân 1 điểm dữ liệu mới vào 1 cụm


- Hàm cập nhật tọa độ tâm cụm khi thêm 1 điểm dữ liệu

* Xây dựng thuật toán theo giả mã


- Đầu tiên, tìm giải giá trị của các thuộc tính (dòng 127). Sau đó, khởi tạo
giá trị các điểm means ban đầu từ các giải giá trị vừa tính được (dòng
128, 129).
- Khởi tạo 2 biến để lưu trữ những thay đổi trong quá trình phân cụm (dòng
130, 131):
+ biến clusterSizes: mảng chứa kích thước của các cụm.
+ biến belongsTo: chứa số thứ tự cụm của các điểm đang thuộc
về, giúp đánh giá xem cụm mới của điểm có giống cụm cũ đã được lưu
trữ trước đó không.
- Duyệt trong số vòng lặp tối đa để kết thúc thuật toán, mặc định là
100000. Sử dụng biến boolean NoChane để xét có sự thay đổi tâm cụm
của các điểm không. Nếu không sẽ kêt thúc thuật toán. Trong mỗi vòng
lặp, duyệt qua từng điểm dữ liệu và thực hiện tính toán như sau:
+ Lấy ra tọa độ điểm đang xét và phân nó vào 1 cụm đang có (dòng
135, 136)
+ Tăng biến đếm kích thước clusterSizes của cụm vừa được thêm.
Sau đó cập nhật lại tọa độ tâm cụm này (dòng 137, 138)
+ Nếu tâm cụm mới khác với tâm cụm cũ, gán giá trị biến
NoChane = False
- Kết thúc thuật toán, ta thu được tọa độ tâm cuối cùng của các cụm

- Từ kết quả tâm cụm thu được, ta hoàn toàn tính được các điểm thuộc các
cụm đó bằng cách duyệt qua các điểm dữ liệu và phân từng điểm vào cụm
có khoảng cách đến tâm ngắn nhất
2.3. So sánh với kết quả khi sử dụng thư viện
Sử dụng mô hình KMeans trong thư viện sklearn chạy với đầu vào
dữ liệu, số cụm đầu vào giống với khi xây dựng thuật toán bằng tay. Kết
quả thu được sẽ được so sánh trực quan và bằng độ đo SSE (Sum of
Square Error): SSE càng nhỏ, độ phân cụm càng tốt

Kết quả so sánh như sau:

Thuật toán tự xây dựng Sử dụng thư viện


k=2 SSE = 14.09 SSE = 13.99
k=3 SSE = 9.17 SSE = 9.06
k=4 SSE = 9.22 SSE = 9.08

k=5 SSE = 3.72 SSE = 3.58

Các kết quả của 2 bên khá tương đồng nhau. Tuy nhiên, khi sử
dụng thư viện, thuật toán “k-means++” (là thuật toán giúp khởi tạo
centroid thông minh hơn và cải thiện chất lượng của phân cụm) đã được
áp dụng nên chắc chắn độ chính xác cao hơn, SSE nhỏ hơn so với khi sử
dụng thuật toán tự xây dựng mà kết quả 2 bên chênh lệch không lớn
=> Thuật toán tự xây dựng đã đạt được kết quả tốt

2. Thuật toán DBSCAN


2.1. Giới thiệu thuật toán
a. Phương pháp phân cụm dựa trên mật độ:
Khi biểu diễn các điểm dữ liệu trong không gian chúng ta sẽ thấy
rằng thông thường các vùng không gian có mật độ cao sẽ xen kẽ bởi các
vùng không gian có mật độ thấp
🡺 Nếu như phải dựa vào mật độ để phân chia thì khả năng rất cao
những tâm cụm sẽ tập trung vào những vùng không gian có mật
độ cao trong khi biên sẽ rơi vào những vùng không gian có mật
độ thấp
🡺 Trong lớp các mô hình phân cụm của học không giám sát tồn tại
một kĩ thuật phân cụm dựa trên mật độ (Density-Based
Clustering), kĩ thuật này này đề cập đến các phương pháp học
không giám sát nhằm xác định các cụm phân biệt trong phân
phối của dữ liệu, dựa trên ý tưởng rằng một cụm trong không
gian dữ liệu là một vùng có mật độ điểm cao được ngăn cách
với các cụm khác bằng các vùng liền kề có mật độ điểm thấp
🡺 DBSCAN là một thuật toán cơ sở để phân nhóm dựa trên mật
độ. Nó có thể phát hiện ra các cụm có hình dạng và kích thước
khác nhau từ một lượng lớn dữ liệu chứa nhiễu.

b. Các định nghĩa trong DBSCAN:


- Định nghĩa 1: Vùng lân cận epsilon (Eps – Neighborhood) của một điểm
dữ liệu P được định nghĩa là tợp hợp tất cả các điểm dữ liệu nằm trong
phạm vi bán kính epsilon (kí hiệu ϵ) xung quanh điểm P. Kí hiệu tập hợp
những điểm này là:

Trong đó D là tập hợp tất cả các điểm dữ liệu của tập huấn luyện.

- Định nghĩa 2: Khả năng tiếp cận trực tiếp mật độ (directly
density-reachable) đề cập tới việc một điểm có thể tiếp cận trực tiếp tới
một điểm dữ liệu khác. Cụ thể là một điểm Q được coi là có thể tiếp cận
trực tiếp bởi điểm P tương ứng với tham số epsilon và minPts nếu như nó
thoả mãn hai điều kiện:

1. Q nằm trong vùng lân cận epsilon của P: Q ϵ Nesp (P)


2. Số lượng các điểm dữ liệu nằm trong vùng lân cận epsilon tối
thiểu là minPts: |Nesp (Q)| ≥ minPts

🡪 một điểm dữ liệu có thể tiếp cận được trực tiếp tới một điểm
khác không chỉ dựa vào khoảng cách giữa chúng mà còn phụ thuộc
vào mật độ các điểm dữ liệu trong vùng lân cận epsilon phải tối
thiểu bằng minPts. Khi đó vùng lân cận được coi là có mật độ cao
và sẽ được phân vào các cụm.
🡪 Trái lại thì vùng lân cận sẽ có mật độ thấp. Trong trường hợp
mật độ thấp thì điểm dữ liệu ở trung tâm được coi là không kết nối
trực tiếp tới những điểm khác trong vùng lân cận và những điểm
này có thể rơi vào biên của cụm hoặc là một điểm dữ
liệu nhiễu không thuộc về cụm nào
- Định nghĩa 3: Khả năng tiếp cận mật độ (density-reachable) liên quan
đến cách hình thành một chuỗi liên kết điểm trong cụm. Cụ thể là trong
một tập hợp chuỗi điểm {Pi}i=1-> n ⊂D mà nếu như bất kì một điểm Pi nào
cũng đều có thể tiếp cận trực tiếp mật độ (định nghĩa 2) bởi Pi-1 theo tham
số epsilon và minPts thì khi đó ta nói điểm P=Pn có khả năng kết nối mật
độ tới điểm Q=P1

🡺 Từ định nghĩa 3 ta suy ra hai điểm Pi và Pj bất kì thuộc


chuỗi {Pi}i=1->n thoả mãn i<j thì Pj đều có khả năng kết nối mật
độ tới Pi. Hai điểm bất kì có khả năng kết nối mật độ với nhau thì sẽ
thuộc cùng một cụm.

c. Phân loại dạng điểm trong DBSCAN


- Căn cứ vào vị trí của các điểm dữ liệu so với cụm chúng ta có thể chia
chúng thành ba loại: Đối với các điểm nằm sâu bên trong cụm chúng ta
xem chúng là điểm lõi. Các điểm biên nằm ở phần ngoài cùng của cụm
và điểm nhiễu không thuộc bất kỳ một cụm nào
- minPts=n là số lượng tối thiểu để một điểm lõi rơi vào vùng có mật độ
cao nếu xung quanh chúng có số lượng điểm tối thiểu là n.
- Trong thuật toán DBSCAN sử dụng hai tham số chính đó là:
● minPts: Là một ngưỡng số điểm dữ liệu tối thiểu được nhóm lại với
nhau nhằm xác định một vùng lân cận epsilon có mật độ cao. Số
lượng minPts không bao gồm điểm ở tâm.
● epsilon ( kí hiệu ϵ ): Một giá trị khoảng cách được sử dụng để xác
định vùng lân cận epsilon của bất kỳ điểm dữ liệu nào.
🡺 Hai tham số trên sẽ được sử dụng để xác định vùng lân cận epsilon và
khả năng tiếp cận giữa các điểm dữ liệu lẫn nhau. Từ đó giúp kết nối
chuỗi dữ liệu vào chung một cụm
- Hai tham số trên giúp xác định ba loại điểm:
● điểm lõi (core): Đây là một điểm có ít nhất minPts điểm trong vùng
lân cận epsilon của chính nó.
● điểm biên (border): Đây là một điểm có ít nhất một điểm lõi nằm
ở vùng lân cận epsilon nhưng mật độ không đủ minPts điểm.
● điểm nhiễu (noise): Đây là điểm không phải là điểm lõi hay điểm
biên.

- Đối với một cặp điểm (P,Q) bất kỳ sẽ có ba khả năng:


● Cả P và Q đều có khả năng kết nối mật độ được với nhau. Khi
đó P, Q đều thuộc về chung một cụm.
● P có khả năng kết nối mật độ được với Q nhưng Q không kết nối
mật độ được với P. Khi đó P sẽ là điểm lõi của cụm còn Q là
một điểm biên.
● P và Q đều không kết nối mật độ được với nhau. Trường hợp
này P và Q sẽ rơi vào những cụm khác nhau hoặc một trong hai
điểm là điểm nhiễu.

d. Các bước trong thuật toán DBSCAN:


Các bước của thuật toán DBSCAN khá đơn giản. Thuật toán sẽ
thực hiện lan truyền để mở rộng dần phạm vi của cụm cho tới khi chạm
tới những điểm biên thì thuật toán sẽ chuyển sang một cụm mới và lặp lại
tiếp quá trình trên
Quy trình thuật toán:

− Bước 1: Thuật toán lựa chọn một điểm dữ liệu bất kỳ. Sau đó tiến hành
xác định các điểm lõi và điểm biên thông qua vùng lân cận epsilon bằng
cách lan truyền theo liên kết chuỗi các điểm thuộc cùng một cụm.
− Bước 2: Cụm hoàn toàn được xác định khi không thể mở rộng được
thêm. Khi đó lặp lại đệ quy toàn bộ quá trình với điểm khởi tạo trong số
các điểm dữ liệu còn lại để xác định một cụm mới.

e. Xác định tham số:


Hai tham số cần lựa chọn trong DBSCAN đó chính là minPts và epsilon
- minPts: Theo quy tắc chung, minPts tối thiểu có thể được tính theo số
chiều D trong tập dữ liệu đó là minPts ≥ D+1. Một giá trị minPts =
1 không có ý nghĩa, vì khi đó mọi điểm bản thân nó đều là một cụm.
Với minPts ≤ 2, kết quả sẽ giống như phân cụm phân cấp (hierarchical
clustering) với single linkage với biểu đồ dendrogram được cắt ở độ
cao y= epsilon. Do đó, minPts phải được chọn ít nhất là 3. Tuy nhiên, các
giá trị lớn hơn thường tốt hơn cho các tập dữ liệu có nhiễu và kết quả
phân cụm thường hợp lý hơn. Theo quy tắc chung thì thường
chọn minPts=2×dim. Trong trường hợp dữ liệu có nhiễu hoặc có nhiều
quan sát lặp lại thì cần lựa chọn giá trị minPts lớn hơn nữa tương ứng với
những bộ dữ liệu lớn.
- epsilon: Giá trị ϵ có thể được chọn bằng cách vẽ một biểu đồ k-distance.
Đây là biểu đồ thể hiện giá trị khoảng cách trong thuật toán k-Means
clustering đến k=minPts−1 điểm láng giềng gần nhất. Ứng với mỗi
điểm chúng ta chỉ lựa chọn ra khoảng cách lớn nhất trong k khoảng cách.
Những khoảng cách này trên đồ thị được sắp xếp theo thứ tự giảm dần.
Các giá trị tốt của ϵ là vị trí mà biểu đồ này cho thấy xuất hiện một
điểm khuỷu tay (elbow point): Nếu ϵ được chọn quá nhỏ, một phần lớn dữ
liệu sẽ không được phân cụm và được xem là nhiễu; trong khi đối với giá
trị ϵ quá cao, các cụm sẽ hợp nhất và phần lớn các điểm sẽ nằm trong
cùng một cụm. Nói chung, các giá trị nhỏ của ϵ được ưu tiên hơn và theo
quy tắc chung, chỉ một phần nhỏ các điểm nên nằm trong vùng lân cận
epsilon
- Hàm khoảng cách: Việc lựa chọn hàm khoảng cách có mối liên hệ chặt
chẽ với lựa chọn ϵ và tạo ra ảnh hưởng lớn tới kết quả. Điểm quan trọng
trước tiên đó là chúng ta cần xác định một thước đo hợp lý về độ khác
biệt (disimilarity) cho tập dữ liệu trước khi có thể chọn tham số ϵ.
Khoảng cách được sử dụng phổ biến nhất là euclidean distance.

2.2. Triển khai thuật toán DBSCAN


a. Xây dựng các hàm tính toán:
Tính khoảng cách Euclidean:

b. Xây dựng thuật toán:


- Xác định các điểm nằm trong vùng lân cận của một điểm:
Với mỗi điểm P, ta sẽ tìm tất cả các điểm nằm trong vùng có bán
kính bằng epsilon ‘eps’ trong bộ dữ liệu ‘D’.
Trong hàm dưới đây, ta sẽ tính toán khoảng cách giữa điểm P và tất
cả các điểm còn lại trong tập dữ liệu ‘D’, kết quả trả về sẽ là một tập hợp
các điểm thỏa mãn điều kiện khoảng cách giữa P và điểm đó nhỏ hơn
epsilon.
- Mở rộng cụm:
Mở rộng một cụm mới với nhãn là ‘C’ từ điểm ban đầu ‘P’.
Hàm dưới sẽ duyệt qua tất cả các điểm trong dataset để tìm những
điểm thuộc về cụm mới này. Hàm kết thúc, việc phân cụm có nhãn ‘C’ đã
được hoàn thành(không thể tìm được thêm điểm thỏa mãn điều kiện để
thuộc cụm ‘C’).
Parameters:
● D: Bộ dữ liệu (list các vectors)
● labels: List lưu trữ dữ liệu nhãn cho các điểm trong
dataset
● P: Vị trí điểm khởi đầu P
● NeighborPts: List các điểm nằm trong vùng lân cận của ‘P’
● C: Nhãn cho cụm mới
● eps: Epsilon
● MinPts : Số điểm điểm lân cận tối thiểu
- Hàm xây dựng thuật toán:
- Thuật toán chính sẽ sử dụng 3 tham số đầu vào là bộ dữ liệu
‘D’(một list các vector), epsilon ‘eps’ và số điểm tối thiểu
‘minPts’. Hàm sẽ trả về một list các nhãn, mỗi thành phần của list
sẽ ứng với 1 điểm trong dataset. Nếu nhãn của điểm là -1 thì điểm
đó được coi là nhiễu. Sau đó các cụm sẽ được đánh số bắt đầu từ 1.
- ‘labels’ : list các phần tử lưu giá trị nhãn dùng cho việc phân cụm
cho từng điểm trong bộ dữ liệu. Có 2 giá trị đặc biệt (-1 biểu thị
cho điểm nhiễu, 0 biểu thị cho điểm chưa được xét)
- ‘labels’ được khởi tạo với tất cả các phần tử đều bằng 0.
- ‘C’ là ID của cụm đang được xét

2.3. So sánh với kết quả khi sử dụng thư viện


- Sử dụng mô hình DBSCAN trong thư viện sklearn chạy với đầu vào dữ
liệu, epsilon và số Minpoints đầu vào giống với khi xây dựng thuật toán
bằng tay. Kết quả thu được sẽ được so sánh trực quan và bằng độ đo
DBCV (Density Based Clustering validation, giá trị này trong đoạn [-1,
1], Trọng số trung bình của các chỉ số hợp lệ trong tất cả các cụm):
DBCV càng lớn, độ phân cụm càng tốt
- Kết quả khi chạy thuật toán xây dựng bằng tay và kết quả khi xây dựng
thư viện là giống nhau, và đạt kết quả tốt nhất ở tham số epsilon = 0.11 và
Minpoints = 10.
- Bảng tổng kết được minh họa như sau

Bộ tham số Kết quả khi xây Kết quả khi sử dụng


dựng bằng tay thư viện
epsilon = 0.1100
minpts = 10

dbcv = - 0.31 dbcv = - 0.31

epsilon = 0.1127
minpts = 10

dbcv = - 0.43 dbcv = - 0.43


epsilon = 0.1155
minpts = 10

dbcv = - 0.40 dbcv = - 0.40


epsilon = 0.1182
minpts = 10

dbcv = - 0.37 dbcv = - 0.37

epsilon = 0.1209
minpts = 10

dbcv = -0.40 dbcv = - 0.40


- Như vậy, về cơ bản, khi xây dựng thuật toán chạy bằng tay, nhận được kết
quả giống so với khi chạy thư viện, hàm phân loại đạt kết quả khá tốt dựa
vào đánh giá DBCV.
- So sánh kết quả tốt nhất của DBSCAN với KMEANS:

DBSCAN: e = 0.1100, minpts = 10 KMEANS: k = 5

3. Thuật toán BRICH


3.1. Giới thiệu thuật toán:
Một thuật toán phân cụm cho tập dữ liệu lớn được gọi là BIRCH
(Balanced Iterative Reducing and Clustering using Hierarchies)
[12]-[17]-[21]. Ý tưởng của thuật toán là không cần lưu toàn bộ các đối
tượng dữ liệu của các cụm trong bộ nhớ mà chỉ lưu các đại lượng thống
kê. Thuật toán đưa ra hai khái niệm mới để theo dõi các cụm hình thành:
phân cụm đặc trưng là tóm tắt thông tin về một cụm và cây phân cụm đặc
trưng (cây CF) là cây cân bằng được sử dụng lưu trữ cụm đặc trưng (được
sử dụng để mô tả cụm tóm tắt).
Cho n đối tượng dữ liệu d-chiều hoặc các điểm trong một cụm,
chúng ta định nghĩa trọng tâm x0, bán kính R, và đường kính D của cụm
như sau:
Một cụm đặc trưng (CF) là một vector ba chiều tổng kết thông tin
về các cụm đối tượng. Với n là số các điểm trong phân hoạch cụm con,
LS là tổng số các giá trị thuộc tính và SS là tổng bình phương của các
điểm đó, CF của cụm được định nghĩa là:
CF = <n, LS, SS>

Hình dưới đây là một ví dụ về cây CF. Một cây CF chứa các nút
trong và nút lá. Nút trong lưu trữ tổng các đặc trưng cụm của các nút con
của nó.

- Một cây CF được đặc trưng bởi hai tham số:


+ Yếu tố nhánh (Branching Factor - B): Nhằm xác định số tối đa các
nút con của một nút trong của cây.
+ Ngưỡng (Threshold - T): Khoảng cách tối đa giữa bất kỳ một cặp
đối tượng trong nút lá của cây, khoảng cách này còn gọi là đường
kính của các cụm con được lưu tại các nút lá.
- Hai tham số này có ảnh hưởng đến kích thước của cây CF. Thuật toán
BIRCH thực hiện qua các giai đoạn sau:
+ Giai đoạn 1: BIRCH duyệt tất cả các đối tượng trong CSDL và xây
dựng cây CF khởi tạo. Trong giai đoạn này, các đối tượng lần lượt
được chèn vào nút lá gần nhất của cây CF (nút lá của cây đóng vai
trò là cụm con), sau khi chèn xong thì tất cả các nút trong cây CF
được cập nhật thông tin. Nếu đường kính của cụm con sau khi chèn
là lớn hơn ngưỡng T, thì nút lá được tách. Quá trình lặp lại cho đến
khi tất cả các đối tượng đều được chèn vào trong cây. Ta thấy rằng,
mỗi đối tượng trong cây chỉ được đọc một lần, để lưu toàn bộ cây
CF trong bộ nhớ thì cần phải điều chỉnh kích thước của cây CF
thông qua điều chỉnh ngưỡng T.
+ Giai đoạn 2: BIRCH lựa chọn một thuật toán PCDL (chẳng hạn
như thuật toán phân cụm phân hoạch) để thực hiện PCDL cho các
nút lá của cây.
- Thuật toán BIRCH thực hiện qua các bước cơ bản như hình sau:
Với cấu trúc cây CF được sử dụng, BIRCH có tốc độ thực hiện
PCDL nhanh và có thể áp dụng đối với tập dữ liệu lớn, đặc biệt, BIRCH
hiệu quả khi áp dụng với tập dữ liệu tăng trưởng theo thời gian. BIRCH
chỉ duyệt toàn bộ dữ liệu một lần với một lần quét thêm tùy chọn, nghĩa
là độ phức tạp của nó là O(n), với n là số đối tượng dữ liệu.
Nhược điểm của thuật toán là chất lượng của các cụm được khám
phá không tốt. Nếu BIRCH sử dụng khoảng cách Euclide, nó thực hiện
tốt chỉ với dữ liệu số. Mặt khác, tham số vào T có ảnh hưởng rất lớn tới
kích thước và tính tự nhiên của cụm. Việc ép các đối tượng dữ liệu làm
cho các đối tượng của một cụm có thể là đối tượng kết thúc của cụm
khác, trong khi các đối tượng gần nhau có thể bị hút bởi các cụm khác
nếu chúng được biểu diễn cho thuật toán theo một thứ tự khác. BIRCH
không thích hợp với dữ liệu đa chiều.

3.2. Triển khai thuật toán


a. Định nghĩa các thông số cơ bản của một nút:
- Định nghĩa class vector để lưu trữ 3 thông số cho một CF và các hàm tính
toán:
class Vector(dict):
n = 1
def __init__(self,*args,**kwargs):
self._squared = None
self.ls = self
super(Vector,self).__init__(*args,**kwargs)

def distance(self,other):
distance = 0
num = 0
matching = []
for key,val in self.items():
num += 1
if key in other:
matching.append(key)
distance += (val - other[key]) ** 2
else:
distance += val ** 2

for key,val in other.items():


if key not in self:
num += 1
distance += val ** 2

return sqrt(distance)

- Update các thông số cơ bản của 1 CF:


def update_cf(self,data):
self.n += data.n
self.ls += data.ls
self.squared += data.squared

- Xác định hai CF có khoảng cách xa nhất


@classmethod
def closest(cls,node,list,force=False):
"Returns the closest match of node to list"
min_dist = 0
min_item = None

for item in list:

dist = item.distance(node)
#if not force:
# print "d:",dist,len(node),len(list)

if not min_item:
min_item = item
min_dist = dist
elif dist < min_dist:
min_dist = dist
min_item = item

return min_item

b. Xây dựng cây CF(CFTree):


- Tại một nút:
+ Thêm các điểm vào cây CF và kiểm tra các điều kiện:
def trickle(self,vector):
# "Gets a vector and hands it down to the closest
child, checks for split afterwards"

# refresh CF vector
self.update_cf(vector)

closest = self.closest(vector,self.children)

if closest:
closest.trickle(vector)
else:
l = Leaf()
l.trickle(vector)
self.add_node(l)

+ Phân chia lại một nút:


def split_node(self):
global splitcount
splitcount += 1

c1,c2 = self.farthest_pair(self.children)

# save the old list


self.reset_cf()
old_children = self.children
self.children = []

old_children.remove(c1)
old_children.remove(c2)

# two new leafs


if self.is_root:
node1 = Node()
else:
node1 = self
node2 = Node()

# add the farthest children to the new nodes


node1.add_node(c1,True)
node2.add_node(c2,True)

while old_children:
c = old_children.pop()
if node1.distance(c) > node2.distance(c):
node2.add_node(c,True)
else:
node1.add_node(c,True)

# try to push down nodes if it only has one


child...
if len(node1.children) == 1:
node1 = node1.children[0]
if len(node2.children) == 1:
node2 = node2.children[0]

# create a new leaf and append it to our parent


if self.is_root:
self.add_node(node1,True)
self.add_node(node2,True)
# try to re-merge node 1 or 2
else:
self.parent.add_node(node2)

3.3. So sánh kết quả với khi sử dụng thư viện


a. Chạy thuật toán sử dụng thư viện sklearn của python:
Chạy thuật toán sử dụng 2 thuộc tính sau cùng của bộ dữ liệu:
birch = Birch(
branching_factor=50,
n_clusters=5,
threshold=0.3,
copy=True,
compute_labels=True
)
filtered_data = np.array([[item[2], item[3]] for
item in data])
filtered_data =
np.array(filtered_data).astype(np.float64)
birch.fit(filtered_data)
predictions = np.array(birch.predict(filtered_data))

Kết quả thu được:

Kết quả thu được khi chạy thuật toán thủ công(bên phải) và sử dụng thư viện(bên
trái)

b. So sánh kết quả:


- Khi chạy thuật toán xây dựng thủ công với cùng thuộc tính sử dụng và
các giá trị B, T cho kết quả chưa được như mong đợi( chưa giống với kết
quả khi chạy trên thư viện scikit-learn của python ) -> Thuật toán chưa
được hoàn thiện và tối ưu hóa. Cần phải chỉnh sửa thêm trong tương lai

IV. Đánh giá các thuật toán

* So sánh các thuật toán: dựa trên cơ sở lý thuyết và thực nghiệm

You might also like