HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
KHOA CƠNG NGHỆ THÔNG TIN 1
-------------------------------------------
BÁO CÁO BÀI TẬP LỚN
KHO DỮ LIỆU VÀ KHAI PHÁ DỮ LIỆU
ĐỀ TÀI: CÀI ĐẶT THUẬT TOÁN VÀ GIẢI PHÁP CHỌN SỐ CỤM CHO
KMEANS CLUSTERING
Giảng viên
: Nguyễn Quỳnh Chi
Nhóm tín chỉ :
Nhóm bài tập :
Họ và tên thành viên
Mã sinh viên
Cơng việc
Code thuật tốn kmeans bằng
python thuần, phân tích kết quả.
Code thuật tốn kmeans với thư
viện sklearn, phân tích kết quả.
Làm slide, giải pháp vấn đề chọn
số cụm
Tìm dataset, kiểm nghiệm với tool
weka
Phân tích bộ dữ liệu
Viết báo cáo, tìm tài liệu
LỜI CẢM ƠN
Lời đầu tiên chúng em xin cảm ơn Học viện đã đưa môn học Kho dữ liệu
và khai phá dữ liệu vào chương trình giảng dạy để chúng em có cơ hội tiếp cận
1
và hiểu thêm về các kiến thức chuyên ngành Hệ thống thông tin. Chúng em
cũng xin gửi lời cảm ơn sâu sắc đến giảng viên môn học Cô Nguyễn Quỳnh
Chi, cô đã truyền đạt những kiến thức quý giá cho chúng em qua những tiết học
online, những tiết học trên lớp cùng với những video bài giảng của cô.
Dù rất cố gắng nhưng do kiến thức của chúng em đôi chỗ còn chưa chắc
chắn nên bài tập lớn của em khơng thể khơng tránh khỏi những thiếu sót. Mong
cơ xem xét và đóng góp ý kiến giúp cho bài tập lớn của chúng em được hoàn
thiện hơn.
Chúng em xin chân thành cảm ơn!
Nhóm sinh viên làm bài tập lớn
Nhóm
2
MỤC LỤC
LỜI CẢM ƠN
2
DANH MỤC HÌNH ẢNH
4
I. LÝ DO CHỌN ĐỀ TÀI
5
II. CƠ SỞ LÝ THUYẾT THUẬT TOÁN K-MEAN
5
1. Phân cụm dữ liệu
5
2. Giới thiệu thuật toán K-means
5
3. Ý tưởng thuật tốn
6
4. Thuật tốn
7
5. Tối ưu hóa Kmeans
8
6. Khởi tạo ngẫu nhiên
8
III. THỰC NGHIỆM
9
1. Giới thiệu về Weka
9
2. Giới thiệu về thư viện Scikit-learn
9
3. Giới thiệu về dataset
9
3.1. Tên dataset: Instagram visits clustering.
9
3.2. Tên dataset: Credit Card Customer Data
11
4. Code thuật toán python
13
5. Kiểm nghiệm bằng Weka
20
6. Kiểm nghiệm bằng thư viện scikit-learn
24
7. Tổng hợp kết quả kiểm nghiệm
27
7.1. Data set: Instagram visits clustering
27
7.2. Data set: Credit Card Customer Data
28
7.3. Data set: Mall customers
29
IV. GIẢI PHÁP CHO VẤN ĐỀ CHỌN SỐ CỤM
31
1. Phương pháp Elbow
31
2. Phương pháp Silhouette Index
32
3. Chọn số lượng cụm cho dataset Instagram visits clustering
34
4. Sử dụng Elbow và Silhouette Index cho bộ dữ liệu khác
37
3
V. KẾT LUẬN
41
VI. TÀI LIỆU THAM KHẢO
42
DANH MỤC HÌNH ẢNH
Hình 1: Flowchart thuật tốn K-means clustering.......................6
Hình 2: File .csv chứa dataset Instagram visits clustering........10
Hình 3: File .csv chứa dataset CC Customer Spending Profiles 11
Hình 4: File .csv chứa dataset Mall Customers.........................12
Hình 5: Giao diện Weka Explorer..............................................20
Hình 6: Dữ liệu được tải lên Weka.............................................20
Hình 7: Cài đặt thuật tốn phân cụm trong Weka....................21
Hình 8: Các thơng số sau khi được chạy ra...............................21
Hình 9: Cách xem hình minh họa..............................................22
Hình 10: Ảnh phân cụm sau khi sử dụng K-means....................22
Hình 11: Kết quả phân cụm của code python và cơng cụ Weka
..................................................................................................23
Hình 12: Kết quả phân cụm sử dụng thư viện scikit-learn........25
Hình 13: Minh họa tính cohesion và separation của dữ liệu.....31
Hình 14: Silhouette...................................................................34
Hình 15: Đồ thị chọn số lượng cụm k của phương pháp Elbow.36
Hình 16: Đồ thị chọn số lượng cụm k của phương pháp
Silhouette..................................................................................37
4
5
I. LÝ DO CHỌN ĐỀ TÀI
Trong thời buổi công nghệ ngày càng phát triển như hiện
nay, việc áp dụng khoa học cơng nghệ thơng tin vào q trình
xử lý và phân tích dữ liệu là vơ cùng cần thiết. Data mining
chính là một trong số đó.
Ứng dụng của Data mining vào trong cuộc sống rất nhiều như khoa học,
truyền thông kỹ thuật số, kinh doanh cho đến games, thể thao… Chính vì vậy
nó là một lĩnh vực được rất nhiều người quan tâm. Và một trong những thuật
toán cơ bản nhất của data mining mà bất cứ ai học cũng đều tìm hiểu qua, đó là
K-means clustering.
Với những kiến thức đã được học kết hợp tìm hiểu qua các tài liệu khác,
chúng em quyết định chọn làm đề tài tìm hiểu về Thuật tốn K-means
clustering. Bài tập lớn này trình bày các nội dung:
Cơ sở lý thuyết của thuật tốn K-means clustering.
Code thuật tốn bằng ngơn ngữ python sau đó kiểm tra lại bằng thư
viện scikit-learn và cơng cụ Weka.
Trình bày giải pháp cho vấn đề chọn số cụm cho thuật toán K-means
II. CƠ SỞ LÝ THUYẾT THUẬT TOÁN K-MEAN
1. Phân cụm dữ liệu
Phân cụm là kỹ thuật rất quan trọng trong khai phá dữ liệu, nó thuộc lớp các
phương pháp Unsupervised Learning trong Machine Learning. Có rất nhiều
định nghĩa khác nhau về kỹ thuật này, nhưng về bản chất ta có thể hiểu phân
cụm là các quy trình tìm cách nhóm các đối tượng đã cho vào các cụm
(clusters), sao cho các đối tượng trong cùng 1 cụm tương tự (similar) nhau và
các đối tượng khác cụm thì khơng tương tự (dissimilar) nhau.
Mục đích của phân cụm là tìm ra bản chất bên trong các nhóm của dữ liệu.
Các thuật toán phân cụm (Clustering Algorithms) đều sinh ra các cụm (clusters).
Tuy nhiên, khơng có tiêu chí nào là được xem là tốt nhất để đánh hiệu của của
phân tích phân cụm, điều này phụ thuộc vào mục đích của phân cụm.
2. Giới thiệu thuật tốn K-means
Thuật toán K-means clustering là thuật toán cơ bản nhất trong
Unsupervised learning.
Trong thuật tốn K-means clustering, chúng ta khơng biết nhãn (label)
của từng điểm dữ liệu. Mục đích là làm thế nào để phân dữ liệu thành các
6
cụm (cluster) khác nhau sao cho dữ liệu trong cùng một cụm có tính chất
giống nhau.
Ý tưởng đơn giản nhất về cluster (cụm) là tập hợp các điểm ở gần nhau
trong một khơng gian nào đó (khơng gian này có thể có rất nhiều chiều
trong trường hợp thơng tin về một điểm dữ liệu là rất lớn).
3. Ý tưởng thuật toán
Bước 1: Khởi tạo K điểm dữ liệu trong bộ dữ liệu và tạm thời coi nó là
tâm của các cụm dữ liệu của chúng ta.
Bước 2: Với mỗi điểm dữ liệu trong bộ dữ liệu, tâm cụm của nó sẽ được
xác định là 1 trong K tâm cụm gần nó nhất.
Bước 3: Sau khi tất cả các điểm dữ liệu đã có tâm, tính tốn lại vị trí của
tâm cụm để đảm bảo tâm của cụm nằm ở chính giữa cụm.
Bước 4: Bước 2 và bước 3 sẽ được lặp đi lặp lại cho tới khi vị trí của tâm
cụm khơng thay đổi hoặc tâm của tất cả các điểm dữ liệu không thay đổi.
Hình 1: Flowchart thuật tốn K-means clustering
4. Thuật tốn
Đề bài: Cho trước m bộ dữ liệu . Nhiệm vụ của ta là phân chia các điểm
dữ liệu thành K cụm dựa trên vị trí tương đối của chúng so với nhau.
7
Input: K (số lượng các cụm), Training set
Output: Các center và label vector cho từng điểm dữ liệu .
Bước 1: Khởi tạo ngẫu nhiên K trong số m điểm dữ liệu làm trung tâm
cụm , ,..., .
Bước 2: Lặp cho đến khi các điểm phân đúng cụm:
+ Vòng for 1: Gán mỗi điểm dữ liệu về cụm có trung tâm cụm gần nhất.
for i = 1 to m
=
: chỉ số (từ 1 đến K) của center cụm gần nhất với
trả về chỉ mục (k) của giá trị tối thiểu trong tập các khoảng cách từ điểm
x(i) đến các center ��. Khoảng cách đó min thì ta phân x(i) vào cụm đó.
Với:
+ Vịng for 2: thực hiện bước di chuyển center. Sau khi phân các điểm x
vào cụm. Ta di chuyển center đến vị trí mới sao cho khoảng cách từ
center đến tất cả các điểm x trong cụm là ngắn nhất (trung bình tọa độ các
điểm dữ liệu trong cụm thứ k).
for k=1 to K
=
Với là n các điểm được phân vào cụm thứ k với center .
Hàm mất mát của thuật tốn K-Means Clustering đặc trưng cho độ chính
xác của nó sẽ càng lớn khi khoảng cách từ mỗi điểm dữ liệu tới trung tâm cụm
càng lớn.
5. Tối ưu hóa Kmeans
Ta có các tham số trong thuật tốn:
= chỉ số của cụm (1,2,3,...K) của điểm được phân vào.
= center của cụm thứ k
= center của cụm mà điểm được phân vào.
Đặt vấn đề: Khi ta phân một điểm dữ liệu vào một cụm k nào đó thì
chúng ta sẽ có sai số là ().
8
Vậy với m điểm trong tập training set thì sẽ có một hàm xác định
được sai số của tồn bộ q trình tính tốn. Chúng ta gọi đó là hàm
chi phí cost function-hàm trung bình lỗi, được định nghĩa như
sau:
J (,...,,,...,) =
Mục tiêu tối ưu hóa của chúng ta là làm sao cho hàm chi phí trên kia là
nhỏ nhất, tức là độ sai số khi phân m điểm vào K cụm là nhỏ nhất. Hàm mất
mát của thuật tốn K-Means Clustering đặc trưng cho độ chính xác của nó sẽ
càng lớn khi khoảng cách từ mỗi điểm dữ liệu tới trung tâm cụm càng lớn.
Tối ưu:
Tại vòng for đầu tiên, bước phân cụm. Mục tiêu là:
Minimize J (,...,,,...,) với ,...,(cố định ,...,)
Tại vòng for thứ 2, bước di chuyển center. Mục tiêu là:
Minimize J (,...,,,...,) với ,...,
Với K-means, hàm chi phí (cost function) khơng thể tăng, nó phải ln
ln giảm.
6. Khởi tạo ngẫu nhiên
Bằng cách nào đó, hãy cố gắng khởi tạo k tâm cụm này phân bố đồng
đều trên không gian của bộ dữ liệu. Điều đó có thể làm khi bạn có thể
xác định được khơng gian và tính chất của dữ liệu. Nhưng ít nhất, các
tâm cụm mà bạn khởi tạo cũng đừng quá gần nhau, cũng đừng trùng
nhau.
Nếu có một center với 0 điểm được gán cho nó, ta có thể khởi tạo lại
ngẫu nhiên center đó với một điểm mới hoặc có thể đơn giản loại bỏ
nhóm cụm đó.
III. THỰC NGHIỆM
1. Giới thiệu về Weka
Weka (viết tắt của Waikato Environment for Knowledge Analysis) là một
bộ phần mềm học máy được Đại học Waikato, New Zealand phát triển
bằng Java. Weka là phần mềm tự do phát hành theo Giấy phép GNU.
Các tính năng chính:
o Một tập các cơng cụ tiền xử lý dữ liệu, các giải thuật học máy, khai
phá dữ liệu và các phương pháp thí nghiệm đánh giá.
o Giao diện đồ họa(gồm cả tính năng hiển thị hóa dữ liệu).
9
o Môi trường cho phép so sánh các giải thuật học máy và khai phá
dữ liệu.
Weka là một bộ công cụ rất mạnh mẽ và dễ dùng trong khai phá dữ liệu,
có minh họa dữ liệu rất trực quan đối nên rất phù hợp với K-means.
2. Giới thiệu về thư viện Scikit-learn
Scikit-learn (Sklearn) là thư viện mạnh mẽ nhất dành cho các thuật toán
học máy được viết trên ngôn ngữ Python. Thư viện cung cấp một tập các
công cụ xử lý các bài toán machine learning và statistical modeling gồm:
classification, regression, clustering, và dimensionality reduction.
Thư viện được cấp phép bản quyền chuẩn FreeBSD và chạy được trên
nhiều nền tảng Linux. Scikit-learn được sử dụng như một tài liệu để học
tập.
Scikit-learn hỗ trợ mạnh mẽ trong việc xây dựng các sản phẩm. Nghĩa là
thư viện này tập trung sâu trong việc xây dựng các yếu tố: dễ sử dụng, dễ
code, dễ tham khảo, dễ làm việc, hiệu quả cao.
3. Giới thiệu về dataset
Về dataset, để kiểm tra kết quả cho chính xác, sử dụng 3 bộ dataset khác
nhau là Instagram visits clustering, Credit Card Customer Data, Mall
Customers có số lượng điểm, phân bổ các điểm khác nhau. Lần lượt sử dụng
code python thuần tự cài đặt, phân cụm.
3.1. Tên dataset: Instagram visits clustering.
Nguồn: /> Đặc tả: bộ dữ liệu về các lượt truy cập Instagram của người dùng và tổng
chi phí mà họ đã mua các sản phẩm.
Lưu dưới dạng file .csv
10
Hình 2: File .csv chứa dataset Instagram visits clustering
Số lượng bản ghi: 2600
Các thuộc tính: UserID, Instagram visit score, Spending_rank.
UserID: là một mã ID định danh, giá trị từ 0-2600, đại diện cho mỗi
người dùng riêng biệt, không trùng lặp với với bất kỳ người dùng nào.
Tất cả dữ liệu hoạt động tương tác của một người dùng trên phần mềm
ứng dụng.
Instagram visit score (Số lượt truy cập Instagram): là chỉ số thể hiện
lượng người truy cập vào Instagram, giá trị từ 5-118, để xác định được số
người dùng truy nhập vào phần mềm trong thời gian nào đó.
Spending(chi phí) : là tổng chi phí từ số lần truy cập vào Instagram, giá
trị từ 0.94-107, người dùng đã chi ra bao nhiêu để mua các sản phẩm.
Với thuật toán K-means Clustering ta sẽ sử dụng hai thuộc tính để tiến
hành phân cụm đó là Instagram visit score và Spending. Nhằm mục đích
phân cụm người dùng theo số lượt truy cập và chi phí tiêu dùng của họ. Từ
11
những cụm khách hàng đã được phân, ta có thể giới thiệu các khuyến mại,
các sản phẩm…phù hợp cho từng nhóm khách hàng. Do mục đích phân cụm
khơng quan tâm tới định danh của khách hàng nên ở đây ta bỏ thuộc tính
UserID.
3.2. Tên dataset: Credit Card Customer Data
Nguồn: /> Đặc tả: bộ dữ liệu đặc tả về hồ sơ chi tiêu của khách hàng dựa trên mơ
hình chi tiêu cũng như tương tác của khách hàng với ngân hàng.
Lưu dưới dạng file .csv
Hình 3: File .csv chứa dataset Credit Card Customer Data
Số lượng bản ghi: 661
Các thuộc tính: SI_no (Số seri của khách hàng), Customer Key (mã khách
hàng), Avg_Credit_Limit (Hạn mức tín dụng trung bình),
Total_Credit_Cards (Tổng số thẻ tín dụng), Total_visit_bank (Tổng số
lượt truy cập ngân hàng), Total_visit_online (Tổng số lượt truy cập trực
tuyến), Total_calls_made (Tổng số cuộc gọi đã thực hiện).
Các thuộc tính sử dụng để phân cụm:
12
o Total_Credit_Cards (Tổng số thẻ tín dụng): là tổng số thẻ tín dụng
hiện có của khách hàng.
o Avg_Credit_Limit (Hạn mức tín dụng trung bình): là hạn mức tín
dụng trung bình của khách hàng.
Với thuật toán K-means Clustering ta sẽ sử dụng hai thuộc tính để tiến
hành phân cụm đó là Total_Credit_Cards và Avg_Credit_Limit. Nhằm mục
đích phân cụm mức độ sử dụng thẻ tín dụng của khách hàng theo số thẻ tín
dụng của họ và hạn mức tín dụng trung bình của thẻ. Từ đó có thể phân chia
nhóm khách hàng để giới thiệu dịch vụ tín dụng phù hợp với mỗi đối tượng
khách hàng.
3.3 Tên dataset: Mall customers
Nguồn: /> Đặc tả: bộ dữ liệu đặc tả sự phân khúc khách hàng tại một trung tâm
mua sắm.
Lưu dưới dạng file .csv
Hình 4: File .csv chứa dataset Mall Customers
Số lượng bản ghi: 200
13
Các thuộc tính: Customer_ID (Mã khách hàng) , Gender(Giới tính),
Annual Income(k$) (Thu nhập thường niên), Spending Score(1-100)
(Điểm chi tiêu)
Các thuộc tính sử dụng để phân cụm:
o Annual Income(k$) (Thu nhập thường niên): là thu nhập hàng năm
của khách hàng, đơn vị: nghìn đơ la.
o Spending Score(1-100) (Điểm chi tiêu): là số điểm đánh giá cho sự
chi tiêu của khách hàng, thang điểm 1-100.
Với thuật toán K-means Clustering ta sẽ sử dụng hai thuộc tính để tiến
hành phân cụm đó là Annual Income(k$) và Spending Score. Nhằm mục
đích phân cụm khách hàng mua sắm theo thu nhập hằng năm và điểm số chi
tiêu của họ. Từ những cụm khách hàng đã được phân, ta có thể giới thiệu các
khuyến mại, các sản phẩm…sao cho hợp lý đối với từng nhóm.
4. Code thuật tốn python
Đầu tiên, import một số thư viện cần thiết để code bằng python:
ST
T
Thư viện
Tác dụng
1
pandas
Đọc dữ liệu từ file csv
2
numpy
Tính tốn với mảng
3
random
Khởi tạo ngẫu nhiên
4
matplotlib.pyplot
Vẽ đồ thị
14
Đọc dữ liệu từ file csv, dữ liệu sẽ hiển thị dưới dạng DataFrame:
Chọn 2 thuộc tính của dataset là Annual Income và Spending Score để
phân cụm và vẽ đồ thị minh họa dữ liệu:
Chọn số lượng cụm bằng 5 và khởi tạo 5 centroids ngẫu nhiên cho các
cụm:
15
Phân các điểm vào tâm cụm gần nó nhất, đầu tiên là tính khoảng cách
Euclid của mỗi điểm đến các tâm cụm.
16
Ta được Data Frame X mới với khoảng cách tới các Centroid của các
điểm như sau:
Có các khoảng cách rồi, việc tiếp theo ta so sánh các khoảng cách của
điểm x tới centroids và phân nó vào cụm có khoảng cách Euclid với tâm
cụm đó là nhỏ nhất.
17
Ta được DataFrame X với cột phân cụm Cluster cho các điểm x như
sau:
Sau khi phân các điểm x vào các cụm, tính tốn Centroid mới cho các
cụm:
18
Sau đó là tính tổng chênh lệch giữa Centroids trước và Centroid New.
Nếu có sự chênh lệch thì cập nhật Centroids mới và quay lại phân cụm
cho x còn nếu khơng có sự chênh chệch thì dừng bằng cách khởi tạo biến
diff=1 và cho phần code bên trên vào câu lệnh while ().
Do Centroid_new đầu tiên với Centroid được khởi tạo ngẫu nhiên ban
đầu khơng có cùng cấu trúc DataFrame nên việc trừ tính chênh chệch bị
lỗi (ra kiểu NaN). Hơn nữa, việc khởi tạo ngẫu khiên k điểm Centroid ban
đầu rất khó để trùng với kết quả Centroid cuối cùng, nên chắc chắn có sự
chênh lệch, ta có thể bỏ qua khơng tính chênh lệch lần đầu tiên. Vậy nên
ta khởi tạo một biến j=0, thêm một điều kiện để loại bỏ việc tính chênh
lệch lần đầu tiên của Centroid New với Centroid. Tổng hợp lại được
phần code cho việc phân cụm, tính tốn, cập nhật Centroid như sau:
19
Vòng while chỉ dừng khi sự chênh lệch = 0 và các cụm lúc này đã được
phân xong.
Cuối cùng, gán các cụm theo màu và vẽ lại đồ thị minh họa dữ liệu với
các cụm đã được phân và kết quả centroids cuối cùng:
20
21
5. Kiểm nghiệm bằng Weka
Đầu tiên vào Weka, chọn Weka Explorer và tải file .csv chứa dữ liệu:
Hình 5: Giao diện Weka Explorer
22
Sau đó remove thuộc tính khơng cần thiết là User ID đi:
Hình 6: Dữ liệu được tải lên Weka
Tiếp theo vào Cluster, click vào Choose và chọn thuật toán phân cụm
Kmeans và chọn các thơng số cho thuật tốn:
Hình 7: Cài đặt thuật toán phân cụm trong Weka
23
Sau khi chọn xong ấn Ok và click vào Start để chạy:
Hình 8: Các thơng số sau khi được chạy ra
Chọn Visualize để xem hình minh họa kết quả phân cụm:
Hình 9: Cách xem hình minh họa
24