Hướng dẫn dùng sklean kmeans python

# Những lưu ý nhỏ --- ### Escape character trong Python Trong lúc mình down ảnh về và thực hành các thao tác xử lý ảnh cơ bản, không hiểu sao trong số những bức ảnh mình tải về lại có một số mà plt.imread() và cả cv2.imread() đều không đọc được, nó làm mình khá khá chịu khi phải down rất nhiều tấm ảnh về để test xem cái nào dùng được. Thật may là mình đã nhận ra lý do tại sao rồi : ```python image = plt.imread("H:\4-6.jpg") ``` Trong đường dẫn trên có dấu \ , và nó hiểu \4 là escape character, thế là nó không đọc được ảnh=)))) Để xử lý thì đơn giản là sửa lại thành như này, đây là chuỗi trần và nó sẽ tránh được việc dấu \ kia gây rắc rối : ```python image = plt.imread(r"H:\4-6.jpg") ``` Đấy thế là xong rồi, từ giờ đọc ảnh thoải mái thôi=D. --- ### Sử dụng hàm Kmeans trong thư viện sklearn Đầu tiên là khai báo thư viện ```python from sklearn.cluster import KMeans ``` lưu ý là pic_n phải là array2D ```python kmeans = KMeans(n_clusters=5, random_state=0).fit(pic_n) ``` cluster_centers_ cho biết centers của cluster đó, labels trả về cluster của mỗi pixel ```python pic2show = kmeans.cluster_centers_[kmeans.labels_] ``` giờ thì in hình ra thôi ```python cluster_pic = pic2show.reshape(pic.shape[0], pic.shape[1], pic.shape[2]) plt.imshow(cluster_pic) plt.show() ``` --- ### Tách test dùng thư viện sklearn ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris_X, iris_Y, test_size=50) ``` --- ### np.random thường dùng ##### 1.np.random.rand Trả về một mảng các số ngẫu nhiên mà mỗi phần tử là một số ngẫu nhiên có phân bố đều (uniform distribution) trong nửa đoạn [0, 1) ```python np.random.rand() np.random.rand(3, 2) ``` * Nếu bỏ trống tham số thì trả về một số vô hướng * Nếu có tham số, trả về vector random có chiều bằng tham số Nếu X là một biến ngẫu nhiên tuân theo phân phối chuẩn trong nửa đoạn [0, 1) thì Y = aX + b là một biến ngẫu nhiên tuân theo phân phối chuẩn trong nửa đoạn [b, a + b] nếu a dương hoặc [a + b, b] nếu a âm. ##### np.random.randn Chữ n ở cuối là viết tắt của normal. Có chức năng tương tự như hàm np.random.rand nhưng kết quả trả về có phân bố theo phân phối chuẩn, kì vọng bằng 0 và phương sai bằng 1. ```python np.random.randn() np.random.randn(3, 2) ``` Nếu N(u, o^2) để chỉ phân phối chuẩn có kì vọng là u và phương sai o^2. Một biến ngẫu nhiên X tuân theo phân phối chuẩn có kì vọng u phương sai o^2 được kí hiệu là X ~ N(u, o^2) Nếu X~N(u, o^2) * X + a ~ N(u + a, o^2) với a là một số thực bất kì * kX ~ N(ku, k^2 * o^2) với k là một số thực bất kì ##### np.random.randint Hàm tạo mảng ngẫu nhiên các số nguyên ```python randint(low, high=None, size=None, dtype='l') ``` Trả về số ngẫu nhiên với xác suất bằng nhau trong nửa đoạn [low, high), size bỏ trống sẽ trả về số vô hướng, ngược lại trả về mảng cùng kích thước. ##### np.random.permutation Cái này sử dụng rất nhiều trong machine learning ```python np.random.permutation(10) ``` Tạo ra 1 mảng random các số tự nhiên (tính từ 0) ##### np.random.choice ```python np.random.choice(a, size, replace, p) ``` Trong đó : * a : mảng 1-D hoặc số vô hướng, nếu là số vô hướng thì sẽ xem như truyền vào np.arange(a), tức là mảng từ 0 -> a-1 * size : kích thước của mảng trả về * replace : True thì được chọn trùng nhau, False là không được chọn trùng. * p : mảng 1-D là xác suất của mỗi phần tử, mặc định là giống nhau ##### np.random.shuffle ```python np.random.shuffle(a) ``` a là mảng 1-D, chú ý là hàm này KHÔNG trả về gì cả, nó sẽ thay đổi chính nội dung trong a ##### np.random.multivariate_normal() ```python np.random.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8) ``` Trong đó : * mean : mảng 1-D, giá trị trung bình của phân phối N chiều * cov : mat trận hiệp phương sai * size : size trả về, vd size=n thì trả về ma trận n hàng, mỗi hàng là một điểm dữ liệu có mean.shape[0] chiều --- ### np.append() ```python np.append(arr, values, axis=None) ``` Trả về copy của arr sau khi thêm values vào, nếu axis bỏ trống, tự động flatten values. --- ### Một vài chú ý về in đồ thị ```python plt.plot(x1, y1, 'bo', x2, y2, 'r^',... , markersize) ``` * (x1, y1), (x2, y2), ... lần lượt là các tọa độ ̣(x, y) của một điểm cần vẽ * markersize là kích thước của điểm hiển thị Về cái 'bo' hay 'r^' là hình dáng và màu sắc của điểm cần hiển thị, kí tự đầu là màu sắc 'r' = red, kí tự sau là hình dáng. Cụ thể thì đây Về hình dạng | character | description | | --------- | --------------------------------------------- | | - | nét liền | | -- | nét đứt | | -. | nét đứt có dấu chấm | | : | nét chấm | | . | điểm | | , | pixel | | o | hình tròn | | v | tam giác hướng xuống | | ^ | tam giác hướng lên | | < | tam giác hướng trái | | > | tam giác hướng phải | | 1 | | | 2 | | | 3 | | | 4 | mình cũng không biết gọi nó là cái gì nữa=))) | | s | hình vuông | | p | ngũ giác | | * | ngôi sao | | h | lục giác | | H | cũng là lục giác | | + | dấu cộng | | x | chữ x | | D | kim cương | | d | cũng là kim cương nhưng mỏng hơn | | _ | dấu gạch ngang | Về màu sắc | character | color | | --------- | ------------------------------------------------------------------------------ | | b | xanh | | g | xanh lá | | r | đỏ | | c | lục lam | | m | đỏ tươi (dịch là đỏ tươi mà ko hiểu sao vào visual code ra thì nó màu tím=)))) | | y | vàng (code ra thì lai lai xanh lá cây=)))) ) | | k | đen vâu | | w | trắng | ##### chỉnh phạm vi của trục x và trục y ```python plt.xlim([-1, 1]) plt.ylim([-1, 1]) ``` --- ### Vẽ đồ thị ```python x = np.linspace(-5, 5, 100) y = x**2 + 5 plt.plot(x, y) plt.show() ``` Trên là vẽ đồ thị của hàm y = x^2 + 5 trong đoạn [-5, 5] Cụ thể thì ``` numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0) ``` Trong đó: * start, stop là khoảng giá trị * num là số lượng mẫu, mặc định là 50 * endpoint tức là có lấy 2 đầu mút hay không, endpoint=True thì [a, b], False thì (a, b), mặc định là True * retstep là có trả về bước nhảy hay không, mặc đinh là False --- ### Vẽ đồ thị động ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation X = np.linspace(-4, 4, 500) Y = X**2 + 10*np.sin(X) fig, ax = plt.subplots() def animate(i): ax.clear() ax.set_title('số lần lặp : {}'.format(i)) plt.plot(X[:i], Y[:i], 'g-') plt.xlim([-10, 10]) plt.ylim([-10, 25]) ani = FuncAnimation(fig, animate, frames=500, interval=0, repeat=True) plt.show() ``` Trên là ví dụ vẽ đồ thị y = x^2 trên đoạn [-4, 4] --- ### Comment nhanh *Lưu ý là đang dùng vim Chuyển về normal mode, nhấn tổ hợp Shift + I là được --- ### Thư viện pickle nhớ import pickle trước (cái này để sau, đang viết cái khác rồi) --- ### Chuyển vector về dạng one-hot dùng thư viện sklearn ```python from sklearn.preprocessing import LabelBinarizer lb = LabelBinarizer() train_Y = lb.fit_transform(train_Y) print(train_Y[0]) ```