You are on page 1of 12

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA ĐIỆN ĐIỆN TỬ

BÀI TẬP LỚN XỬ LÝ ẢNH

Chủ Đề

PHÂN CỤM KMEANS

GV: Võ Tuấn Kiệt


Nhóm SV thực hiện: Nguyễn Hữu Lãm-2013594
Nguyễn Minh Nghĩa-2013594

Tp.Hồ Chí Minh, Tháng 11/2023


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Mục lục
1 Lý thuyết 2

2 Phân tích toán học 3


2.1 Một số ký hiệu toán học . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Hàm mất mát và bài toán tối ưu . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Thuật toán tối ưu hàm mất mát . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Tóm tắt thuật toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 Thuật toán Elbow 6


3.1 Ý tưởng thuật toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2 Mô tả thuật toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

4 Mô hình và kết quả 7

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 1/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

1 Lý thuyết
K-mean clustering là một phương pháp để tìm các cụm và hạt nhân - trung tâm của cụm
trong một tập hợp dữ liệu không được gắn nhãn. Người ta chọn số lượng hạt nhân cụm mong
muốn phân chẳng hạn như k cụm. Thuật toán K-mean di chuyển lặp đi lặp lại các hạt nhân để
giảm thiểu tổng số trong phương sai cụm. Với một tập hợp các hạt nhân ban đầu, thuật toán
Kmeans lặp lại hai bước:
• Đối với mỗi hạt nhân, tính toán khoảng cách giữa các training ponit với nó và nếu gần nó
hơn -> sẽ gán là cụm của hạt nhân đấy.
• Sau khi phân được cụm như ở bước trên, thì tiếp theo các training point của các cụm tính
toán vector trung bình để được vị trí của hạt nhân mới và lặp lại bước trên đến khi không thể
thay đổi được vị trí hạt nhân nữa.
Phân cụm có nhiều hữu ích đặc biệt và cực kỳ phổ biến trong ngành khoa học dữ liệu. Trong
đó như :
Phân tích cụm được sử dụng rộng rãi trong nghiên cứu thị trường, nhận dạng mẫu, phân
tích dữ liệu và xử lý ảnh. Phân tích cụm cũng có thể giúp các nhà khoa học dữ liệu khám phá
ra các nhóm khác hàng của họ. Và họ có thể mô tả đặc điểm nhóm khách hàng của mình dựa
trên lịch sử mua hàng.
Trong lĩnh vực sinh học, nó có thể được sử dụng để xác định phân loại thực vật và động vật,
phân loại các gen có chức năng tương tự và hiểu sâu hơn về các cấu trúc vốn có của quần thể.
Vậy để giải các bài toán về phân cụm cần có công cụ/phương pháp, K-means là một trong
những thuật toán được sử dụng phổ biến nhất. Trong hướng dẫn này mình sẽ bắt đầu với cơ sở
lý thuyết của thuật toán K-means, sau đó sẽ ứng dụng vào 1 ví dụ đơn giản với Python và thư
viện Sklearn.
Ví dụ: Một công ty muốn tạo ra những chính sách ưu đãi cho những nhóm khách hàng khác
nhau dựa trên sự tương tác giữa mỗi khách hàng với công ty đó (số năm là khách hàng; số tiền
khách hàng đã chi trả cho công ty; độ tuổi; giới tính; thành phố; nghề nghiệp; . . . ). Giả sử công
ty đó có rất nhiều dữ liệu của rất nhiều khách hàng nhưng chưa có cách nào chia toàn bộ khách
hàng đó thành một số nhóm/cụm khác nhau. Nếu một người biết Machine Learning được đặt
câu hỏi này, phương pháp đầu tiên anh (chị) ta nghĩ đến sẽ là K-means Clustering. Vì nó là một
trong những thuật toán đầu tiên mà anh ấy tìm được trong các cuốn sách, khóa học về Machine
Learning. Và tôi cũng chắc rằng anh ấy đã đọc blog Machine Learning cơ bản. Sau khi đã phân
ra được từng nhóm, nhân viên công ty đó có thể lựa chọn ra một vài khách hàng trong mỗi nhóm
để quyết định xem mỗi nhóm tương ứng với nhóm khách hàng nào. Phần việc cuối cùng này cần
sự can thiệp của con người, nhưng lượng công việc đã được rút gọn đi rất nhiều.
Ý 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). Hình bên dưới là một ví dụ về 3 cụm dữ liệu (từ giờ tôi sẽ viết gọn là cluster).

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 2/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Giả sử mỗi cluster có một điểm đại diện (center) màu vàng. Và những điểm xung quanh mỗi
center thuộc vào cùng nhóm với center đó. Một cách đơn giản nhất, xét một điểm bất kỳ, ta xét
xem điểm đó gần với center nào nhất thì nó thuộc về cùng nhóm với center đó. Tới đây, chúng
ta có một bài toán thú vị: Trên một vùng biển hình vuông lớn có ba đảo hình vuông, tam giác,
và tròn màu vàng như hình trên. Một điểm trên biển được gọi là thuộc lãnh hải của một đảo
nếu nó nằm gần đảo này hơn so với hai đảo kia . Hãy xác định ranh giới lãnh hải của các đảo.
Hình dưới đây là một hình minh họa cho việc phân chia lãnh hải nếu có 5 đảo khác nhau
được biểu diễn bằng các hình tròn màu đen:

Chúng ta thấy rằng đường phân định giữa các lãnh hải là các đường thẳng (chính xác hơn
thì chúng là các đường trung trực của các cặp điểm gần nhau). Vì vậy, lãnh hải của một đảo sẽ
là một hình đa giác.
Cách phân chia này trong toán học được gọi là Voronoi Diagram.
Trong không gian ba chiều, lấy ví dụ là các hành tinh, thì (tạm gọi là) lãnh không của mỗi
hành tinh sẽ là một đa diện. Trong không gian nhiều chiều hơn, chúng ta sẽ có những thứ (mà
tôi gọi là) siêu đa diện (hyperpolygon).

2 Phân tích toán học


Mục đích cuối cùng của thuật toán phân cụm K – means là từ dữ liệu đầu vào và số lượng
cụm cần tìm, có thể xác định được tâm mỗi cụm và phân các dữ liệu vào từng cụm tương ứng.

2.1 Một số ký hiệu toán học


Quy ước:
Các số vô hướng được biểu diễn bởi các chữ cái không in hoa, có thể ở dạng in hoa hoặc
không in hoa, ví dụ: x1, N, y, k.
Các vector được biểu diễn bằng các chữ cái không in hoa, in đậm, ví dụ: m, x1.

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 3/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Giả sử có N điểm dữ liệu là X = [x1 , x2 , . . . , xN ] ∈ RdN và K là số cụm cần phân chia (K


< N). Chúng ta cần tìm các tâm của các cụm m1 , m2 , . . . , mK ∈ Rd1 và nhãn của mỗi điểm dữ
liệu.
Với mỗi điểm dữ liệu xi đặt yi = [yi1, yi2, . . . , yik] là label vector của nó, trong đó nếu xi
được phân vào cụm k thì yik = 1 và yij = 0, j k. Điều này có nghĩa là có đúng một phần tử của
vector yi là bằng 1 (ứng với cụm xi), các phần tử còn lại bằng 0. Ví dụ: nếu một điểm dữ liệu
có label vector là [1, 0, 0, . . . , 0] thì thuộc vào cụm 1, tương tự nếu là [0, 0, 1, 0, . . . , 0] thì nó
thuộc cụm 3.
Ràng buộc của yi có thể viết dưới dạng toán học như sau:
n
X
y ∈ 0, 1, yik = 1
i=1

2.2 Hàm mất mát và bài toán tối ưu


Nếu ta coi tâm mk của mỗi cụm và ước lượng tất cả các điểm được phân vào cụm bởi mk,
thì mỗi điểm dữ liệu xi được phân vào cụm k sẽ bị sai số là (xi - mk). Để sai số có trị tuyệt đối
nhỏ nhất thì hàm mất mát L(w) phải đạt giá trị nhỏ nhất:

L(w) = ||xi − yk ||2 2

Với
||xi − mk ||2 2
tổng bình phương của mỗi giá trị
(xi − mk )
Thêm vào đó, vì xi được phân vào cụm k nên yik = 1, yij = 0, jk. Khi đó, biểu thức trên được
viết lại là:
K
X
yik ||xi + mk ||2 2 = yij ||xi − mj ||
j=1

Sai số của toàn bộ dữ liệu sẽ là:


K
X
L(Y, M ) = yij ||xi − mj ||
j=1

Trong đó, Y = [[y1 , y2 , . . . , yN ], M = [m1 , m2 , . . . , mK ] lần lượt là các ma trận được tạo bởi
label vector của mỗi điểm dữ liệu và tâm của mỗi cụm. L(Y, M) là hàm mất mát của bài toán
phân cụm K – means với ràng buộc như ở phương trình (1). Tóm lại ta cần tối ưu bài toán sau:
N X
X K
Y, M = argminY,M yij ||xi − mj ||
i=1 j=1

K
X
Thỏa điều kiện: yij ∈(0, 1) mọi ij yik = 1 với mọi i
k=1

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 4/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

2.3 Thuật toán tối ưu hàm mất mát


Bài toán (I) thuộc loại mix – integer programming (điều kiện biến là số nguyên), đây là một
bài toán khó tìm điểm tối ưu vì nó có thêm điều kiện ràng buộc. Nhưng ở một số trường hợp ta
vẫn có thể tìm được phương pháp để tìm được phương pháp để tìm nghiệm gần đúng hoặc điểm
cực tiểu. Một cách đơn giản để giải bài toán trên là xen kẻ giải Y và M khi biến còn lại được cố
định. Đây là một thuật toán lặp, cũng là kỹ thuật phổ biến khi giải toán tối ưu. Chúng ta cần
lần lượt giải quyết hai bài toán sau đây: cố định M, tìm Y và cố định Y, tìm M.
Bài toán 1: Cố định M, tìm Y
Giả sử đã tìm được cụm cho từng điểm, tìm tâm mới cho mỗi cụm để hàm mất mát đạt giá
trị nhỏ nhất.
Khi chúng ta xác định được label vector cho từng điểm dữ liệu, bài toán tìm tâm cho mỗi
cụm được rút gọn thành:
N X
X K
Y, M = argminY,M yij ||xi − mj ||
i=1 j=1

K
X
Thỏa điều kiện: yij ∈(0, 1) mọi ij yik = 1 với mọi i
k=1
Vì chỉ có một phần tử của label vector yi = 1 nên bài toán có thể được viết dạng dưới dạng
đơn giản hơn:

j = argmin||xi − mj ||2 2

Vì ||xi − mj ||2 2 chính là bình phương khoảng cách từ điểm xi đến tâm mj , ta có thể kết luận
rằng mỗi điểm xi thuộc vào cụm có tâm gần nó nhất. Từ đó ta có thể dễ dàng suy ra label vector
của từng điểm dữ liệu.
Bài toán 2: Cố định Y, tìm M Giả sử đã tìm được cụ cho từng điểm, tìm tâm mới cho mỗi
cụm để hàm mất mát đạt giá trị nhỏ nhất. Nếu chúng ta đã xác định được label vector cho từng
điểm dữ liệu, bài toán tìm center cho mỗi cụm được rút gọn thành:

Để ý rằng hàm mục tiêu là một hàm liên tục và có đạo hàm xác định tại mọi điểm mj . Vì
vậy, ta có thể tìm nghiệm bằng phương pháp giải phương trình đạo hàm bằng không. Đặt l(mj
) là hàm mục tiêu bên trong dấu argmin của (10.7), ta cần giải phương trình sau đây:

Để ý rằng mẫu số chính là tổng số điểm dữ liệu trong cụm j, tử số là tổng các điểm dữ liệu
trong cụm j. Nói cách khác, mj là trung bình cộng (mean) của các điểm trong cụm j

2.4 Tóm tắt thuật toán


Thuật toán phân cụm K – means được tóm tắt như sau:

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 5/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Đầu vào: Dữ liệu X và số lượng cụm cần tìm K.


Đầu ra: Các tâm M và label vector cho từng điểm dữ liệu Y.
1 .Chọn K điểm bất kỳ làm các center ban đầu.
2 .Phân mỗi điểm dữ liệu vào cluster có center gần nó nhất
3 .Nếu việc gán dữ liệu vào từng cluster ở bước 2 không thay đổi so với vòng lặp trước nó thì
ta dừng thuật toán.
4 .Cập nhật center cho từng cluster bằng cách lấy trung bình cộng của tất các các điểm dữ
liệu đã được gán vào cluster đó sau bước 2.
5 Quay lại bước 2.

3 Thuật toán Elbow


3.1 Ý tưởng thuật toán
Ý tưởng cơ bản các phương pháp phân cụm, chẳng hạn như phân cụm K-means là xác định
các cụm sao cho tổng biến thiên bình phương khoảng cách trong cụm là nhỏ nhất, tham số này
là WSS (Within-cluster Sum of Square)
WSS được định nghĩa bằng công thức:

Nói cách khác, WSS là tổng bình phương của khoảng cách giữa mỗi đối tượng dữ liệu và tâm
gần nhất. q(i) là giá trị đặc trưng của trọng tâm liên quan đến đối tượng thứ i. Nếu đối tượng
tương đối gần với trọng tâm tương ứng của chúng, WSS tương đối nhỏ. Thuật toán Elbow chỉ
ra số cụm k sao cho WSSk và WSSk+1 sai kém không đáng kể

3.2 Mô tả thuật toán


Elbow method đucợ minh họa dưới đồ thị là đường cong với trục hoành là số k các cluster,trục
tung sẽ là tiêu chí đánh giá distortion. Distortionđucợ tính là trung bình cộng bình phương khoảng
cách giữa tâm cụm đến các điểm còn lại(thường là Euclidean distance).Khi các điểm dữ liệu hay
các object ,các quan sát càng gần nhau thì sẽ có đặc điểm gần giống nhau,được phân trong một
cụm,thì cụm đó chứng tỏ chất lượng và ngược lại.
SẼ có k cluster cần tính giá trị Distortion thường k sẽ chạy từ 1 đến 10 hay 20.Với mỗi k sẽ
có 1 Distortion.Minh hóa các cặp K và Distortion lên đồ thị.Số k tối ưu chính là điểm mà ở đó
Distortion bắt đầu giảm đều,nhìn trên đồ thị nó là điểm "turning point",nói vui điểm nằm ở cùi
chỏ sẽ là điểm k cần tìm.

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 6/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Để xác định số lượng cụm tối ưu ở hình trên, chúng ta phải chọn giá trị của k tại “khuỷu
tay” tức là điểm mà sau đó biến dạng / quán tính bắt đầu giảm theo kiểu tuyến tính.Quan sát
thấy số cụm tối ưu cho dữ liệu là 3.

4 Mô hình và kết quả


Khai báo thư viện và đường dẫn đến thu mục chứa hình ảnh oto

import cv2
from sklearn.cluster import KMeans
import os
import numpy as np
import pickle
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

c_data_path = "data/cars"

Tạo một hàm getfeature để trích xuất một đặc điểm (cường độ) từ một hình ảnh. Nó thể
hiện độ sáng hoặc cường độ tổng thể của hình ảnh bằng cách tổng hợp các giá trị pixel và chuẩn
hóa kết quả. Loại tính năng này có thể được sử dụng trong các nhiệm vụ phân tích hình ảnh
hoặc học máy khác nhau, trong đó cần có sự thể hiện nhỏ gọn nội dung hình ảnh.

def get_feature(img):
intensity = img.sum(axis=1)
intensity = intensity.sum(axis=0) / (255 * img.shape[0] * img.shape[1])
return intensity
return

Hàm loaddata để load tất cả các ảnh vào biến X và tất cả nhãn tên file vào biến L

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 7/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

def load_data(data_path=c_data_path):

try:
with open('data.pickle', 'rb') as handle:
X = pickle.load(handle)
with open('label.pickle', 'rb') as handle:
L = pickle.load(handle)
return X,L
except:
X = []
L = []
for file in os.listdir(data_path):
print(file)
c_x = get_feature(cv2.imread(os.path.join(data_path, file)))
X.append(c_x)
L.append(file)

X = np.array(X)
L = np.array(L)
with open('data.pickle', 'wb') as handle:
pickle.dump(X, handle, protocol=pickle.HIGHEST_PROTOCOL)
with open('label.pickle', 'wb') as handle:
pickle.dump(L, handle, protocol=pickle.HIGHEST_PROTOCOL)
return X,L

# Print the shape of the imag


X,L = load_data()
print(X.shape)

Mảng distortions dùng để tính các giá trị distorsion tương ứng với k từ 1 đến 10 sau đố vẽ
đồ thị elbow

distortions = []
K = range(1,10)
for k in K:
kmeanModel = KMeans(n_clusters=k)
kmeanModel.fit(X)
distortions.append(kmeanModel.inertia_)
plt.figure(figsize=(16,8))
plt.plot(K, distortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Distortion')
plt.title('The Elbow Method showing the optimal k')
plt.show()

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 8/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Phân cụm với k=4(chọn trong đồ thị elbow trên) và fit vào X

kmeans = KMeans(n_clusters=4).fit(X)
for i in range(len(kmeans.labels_)):
print(kmeans.labels_[i]," - ", L[i])
print(kmeans.cluster_centers_)

Duyệt từng cụm một sau đó in các cụm vữa phân được lên.

n_row = 6
n_col=6
for i in range(4):
_, axs = plt.subplots(n_row, n_col, figsize=(7, 7))
axs = axs.flatten()
for img, ax in zip(L[ kmeans.labels_ == i][:36], axs):
ax.imshow(mpimg.imread(os.path.join(c_data_path,img)))
plt.tight_layout()
plt.show()

Cụm 1 gồm các xe màu xám

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 9/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Cụm 2 gồm các xe tối hơn cụm 1

Cụm 3 gồm các xe sáng hẳn

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 10/11


Trường Đại học Bách Khoa Tp.Hồ Chí Minh
Khoa Điện Điện Tử

Cụm cuối cùng gồm các xa đen ịt

Xử lý ảnh, HK1, Năm học 2023-2024 Trang 11/11

You might also like