Sử dụng python phân cụm k-means
Vào một buổi chiều ngẫu hứng, các thành viên trong CLB AI gạ gẫm nhau rất tài Bi-a. Để rồi không ai chấp nhận “trình” mình thua ai, vì thế thì bạn đã đặt vấn đề xuất dữ liệu thu thập và xây dựng một mô hình K-Means để giải quyết. Vậy mô hình “K-means” đó là gì ? Show
Với các bài trước các bạn đã được tìm hiểu 2 thuật toán là Liner Regression và Logistic Regression. Ở bài viết này, chúng ta sẽ cùng tiếp cận và tìm hiểu một thuật toán đầu tiên trong bài toán phân cụm cụm (Phân cụm). Đó là K-means Clustering Tổng quan nội dung bài viết
Nếu bạn không muốn khoảng thời gian để hiểu mặt toán học, bạn có thể bỏ qua phần III. Phần IV và VI của mình chủ yếu là build code, lướt qua nếu bạn không có hứng thú. Time thì bắt đầu nào I. K-means Clustering là gì ?1. Thế nào là phân cụm?Phân cụm (hay cụm cụm) là nhiệm vụ phân chia một tập hợp các đối tượng (hay thành viên) thành các nhóm (hay cụm từ) khác nhau dựa trên đặc điểm (hay thuộc tính) của đối tượng. Và rằng các thành viên của một nhóm sẽ có nhiều điểm tương đồng hơn so với các thành viên trong nhóm khác ( Nguồn ảnh. dữ liệu. com)Ví dụ. Mẹ bạn có một thùng hoa quả lớn (nho, dưa , dâu, cam,…) và yêu cầu bạn xếp vàp 2 sọt. dựa vào đặc điểm của kết quả hoa như màu sắc, hình dáng, vị ngọt,… Ở đây bạn có thể dựa vào đặc điểm nhiều hay ít hạt để phân chia. Rất dễ dàng bạn sẽ làm được ngay. 2. K-nghĩa là phân cụmThực tiễn cho thấy, các vấn đề về phân cụm phát sinh trong nhiều ứng dụng khác nhau. khai thác dữ liệu, khám phá kiến thức; Là một trong những thuật toán cơ bản và phổ biến của Machine Learning – K-means Clustering là một thuật toán Unsupervised (Học không giám sát) đơn giản. Mục tiêu của bài toán là phân tách chính xác các đối tượng trong tệp dữ liệu thành các nhóm dựa trên thuộc tính của đối tượng II. Ý tưởng và bài toán dữ liệu1. Ý tưởngVới mỗi đối tượng, chúng ta sẽ vector hóa biểu tượng đặc trưng của đối tượng dưới dạng một điểm dữ liệu. Và ta biết rằng, những điểm dữ liệu tương đồng về bản chất thì sẽ ở gần nhau hơn. Khi đó, cụm phân cụm bài toán của ta sẽ là bài toán đi tìm những điểm dữ liệu nằm gần nhau ( Nguồn ảnh. chuyên viên máy tính. tổ chức)Mỗi đối tượng đều có một hoặc nhiều thuộc tính riêng. K-means chính là dựa vào một số thuộc tính cụ thể mà đi gom cụm lại những đối tượng có tính chất tương đồng nhau 2. Đầu vào và đầu ra của bài toán2. 1. Đầu vàoĐầu vào thuật toán bao gồm. 2. 2. đầu raĐầu ra của thuật toán bao gồm. 2. 3. Bài toán minh hoạTo easy easy in the step of the parsing next. Từ câu chuyện Bi-a ở đầu, ta mô hình hóa thành bài toán minh họa sau để xây dựng và tìm hiểu nên thuật toán K-means Bộ dữ liệu bao gồm 2 trường đặc trưng là tổng số bi bị đánh vào lỗi và số lần đánh trúng liên tiếp của 24 người sau nhiều “trận chiến”. Và bây giờ bạn đang muốn chia các cơ thủ trên các nhóm “chuyên nghiệp”, “tay mơ”, “tước tầm thường” (Đây là dữ liệu demo của 7 người)Trong thuật ngữ Billiards. Pot là hành động đánh trúng vào lỗi; . Thêm một chút kiến thức về Vocabulary không đúng Xét bài toán minh hoạ. Cũng như các thuật toán trước, liệu rằng khía cạnh toán học của K-means được tiếp cận ra sao. Có phức tạp hay dễ dàng hơn, hãy cùng nhau phân tích ở mục này nhé 1. Khoảng cách EuclidTa biết với 2 vector \( A(x_1;y_1) \) và \( B(x_2;y_2) \) trong không gian 2 chiều \( Oxy \) thì khoảng cách giữ a chúng là\( \ . ( Nguồn ảnh. máy họccoban. com ) 2. Hàm mất mát và phương pháp tối ưu2. 1. mất mát hàmGiả sử ta có điểm dữ liệu \(x_i\) cần phân cụm vào \(m_k\). To dễ dàng khai triển, trong bài viết này mình sử dụng tối tiểu bình bình Euclid \( {\parallel m_k – x_i \parallel}^2 \). 2. 2. Mất mát chức năng tối ưu\( J(y,m) \) là hàm khó tìm nghiệm tối ưu toàn cục do ta có điều kiện biến là số nguyên. Để giải quyết chức năng mất mát này, mình sẽ sử dụng đến kỹ thuật đan xen, nghĩa là
Ta cứ làm xen kẽ như vậy đến khi hàm mất mát hội tụ với giá trị nhỏ nhất Và một câu hỏi mới được đặt ra, liệu rằng hàm số có hội tu được sau bước nhảy hay không ? Đương nhiên rồi, hãy thử nhìn vào biểu thức \( (∗) \)nhé, hàm số ta bị chặn dưới 0 và là hàm không tăng sau mỗi bước sẽ hội tụ sau hữu hạn bước nhảy. Giờ thì làm rõ các kỹ thuật tối ưu nào 1. Cố định \( m \) , tìm \( y \) Nên có thể kết luận “từng điểm dữ liệu thuộc vào tâm cụm gần nó nhất. ” 2. Cố định \( y \), tìm \( m \). Hàm \(m_i \) là hàm liên tục và có hàm đạo nên ta sẽ tối ưu hóa bằng cách cho hàm đạo bằng không Từ biểu thức trên ta có thể kết luận, tâm cụm \(m_i\) chính là trung bình cộng của các điểm trong cụm Dễ hiểu hơn thì công việc xử lý toán học này là tìm ra những thằng gần nhau dựa vào khoảng cách của nó. Còn cụm tâm sẽ được đặt vào giữa cụm dữ liệu IV. Xây dựng thuật toán trên Python1. Tóm tắt thuật toán và lưu đồTa đã phân tích xong mặt toán học của K-means, mình sẽ tóm tắt lại thuật toán và xây dựng bản lưu trong ngôn ngữ lập trình 1. 1 Tóm tắt thuật toán
1. 2. Lưu đồ2. Xây dựng bài toán minh họa trên Numpy và so sánh với scikit-learning2. 1. Xây dựng trên NumpyBan đầu dữ liệu biểu tượng Từ đồ thị phân tích dữ liệu trên, các bạn thử dự đoán và khoanh tròn cụm 3 để so sánh với Máy học nhé Create start function K cluster ban đầu # X là ma trận dữ liệu, n_cluster = K là số cụm def kmeans_init_centers(X, n_cluster): return X[np.random.choice(X.shape[0], n_cluster, replace=False)] Tạo hàm phân chia dữ liệu vào các cụm từ gần nó nhất def kmeans_predict_labels(X, centers): D = cdist(X, centers) #cdist là hàm tính khoảng cách return np.argmin(D, axis = 1) #argmin là trả về giá trị nhỏ nhất Tạo hàm cập nhật lại cụm từ tâm def kmeans_update_centers(X, labels, n_cluster): centers = np.zeros((n_cluster, X.shape[1])) for k in range(n_cluster): Xk = X[labels == k, :] centers[k,:] = np.mean(Xk, axis = 0) #mean là trả về giá trị trung bình cộng return centers Khảo sát hội tụ (xem thử tâm cụm lúc này bằng tâm cụm trước đó hay chưa) def kmeans_has_converged(centers, new_centers): return (set([tuple(a) for a in centers]) == set([tuple(a) for a in new_centers])) Giờ thì là hàm build K-means nhé # Hàm xây dựng thuật toán K-means def kmeans(init_centes, init_labels, X, n_cluster): centers = init_centes labels = init_labels times = 0 while True: labels = kmeans_predict_labels(X, centers) kmeans_visualize(X, centers, labels, n_cluster, 'Phân nhãn cho dữ liệu lần ' + str(times + 1)) new_centers = kmeans_update_centers(X, labels, n_cluster) if kmeans_has_converged(centers, new_centers): break centers = new_centers kmeans_visualize(X, centers, labels, n_cluster, 'Update center lần ' + str(times + 1)) times += 1 # Biến times của mình để xem việc update center xảy ra mấy lần return (centers, labels, times) And here is results 2. 2. Sử dụng thư viện scikit-learningTrain K-mean bằng thư viện kmeans = KMeans(n_clusters = 3, n_jobs = -1, random_state = 123).fit(X) Tạo nhãn cho từng dữ liệu kmeans.labels_ Xong rồi đó, chỉ với 2 dòng mã Python hỗ trợ các thư viện mạnh mẽAnd here is results Nhận xét. Các thuật toán cho cùng một kết quả mong đợi khi xây dựng trên Numpy và sử dụng thư viện Sckit-learn Bạn có thể thử kiểm tra lại kết quả với mã tại đây nhé V. Thảo luận về bài toán K-mean1. ưu điểm
2. nhược điểm
1. descriptionMục tiêu của công việc nén hình ảnh là giảm kích thước bộ nhớ xuống càng nhỏ càng tốt trong khi vẫn duy trì sự tương đồng với hình ảnh gốc Mỗi hình ảnh đều được đặc trưng bởi một pixel ma trận, với số lượng là hữu hạn. Khi đó ta có thể giảm số lượng màu của ảnh đi theo giá trị K nào đó, sao cho dung lượng ảnh giảm nhưng độ tương đồng vẫn giống ảnh gốc K-mean sẽ giải quyết được như yêu cầu này 2. Xây dựng mô hìnhCứ nhập thư viện trước tiênNhập thư viện nào #Hỗ trợ xXử lý ảnh from PIL import Image from io import BytesIO import webcolors #Hỗ trợ phân tích dữ liệu import math import numpy as np import pandas as pd #Hỗ trợ biểu diễn dữ liệu import matplotlib.pyplot as plt from importlib import reload from mpl_toolkits import mplot3d import seaborn as sns #Train Model from sklearn.cluster import KMeans Đọc và chuyển đổi ảnh vector ________số 8Get the image size and number of color # Hàm trả về kích thước ảnh def image_ByteSize(img): img_file = BytesIO() image = Image.fromarray(np.uint8(img)) image.save(img_file, 'png') return int(img_file.tell()/1024) img_size = image_ByteSize(img) img_n_colors = len(set(img.getdata())) print('Dung lượng ảnh:',img_size,'KB') print('Số lượng màu trong ảnh:',img_n_colors) Đào tạo công việc phân cụm bằng Kmeans def kmeans_predict_labels(X, centers): D = cdist(X, centers) #cdist là hàm tính khoảng cách return np.argmin(D, axis = 1) #argmin là trả về giá trị nhỏ nhất0 Hàm vẽ ảnh sau khi nén def kmeans_predict_labels(X, centers): D = cdist(X, centers) #cdist là hàm tính khoảng cách return np.argmin(D, axis = 1) #argmin là trả về giá trị nhỏ nhất1 Mình sẽ vẽ 9 ảnh với K=2 đến K=10 def kmeans_predict_labels(X, centers): D = cdist(X, centers) #cdist là hàm tính khoảng cách return np.argmin(D, axis = 1) #argmin là trả về giá trị nhỏ nhất2 Nhận xét. Sau khi nén, ảnh sau khi nén đã giảm kích thước, vẫn giữ nguyên độ tương quan với ảnh gốc. Lời kếtCảm ơn các bạn đọc đã cố gắng cùng mình tìm hiểu về thuật toán K-means ở bài viết này, hi vọng các bạn sẽ có thêm kiến thức mới về một trong những bài toán cơ bản của Marchine Learning. Mong rằng bạn có thể để lại góp ý cho bài viết, đó là động lực giúp mình và CLB cải tiến hơn cho những bài viết sau Series về Machine Learning của CLB AI còn nhiều bài toán hay phía sau, cảm ơn và hẹn gặp lại các bạn |