''' 聚類:分類(class)與聚類(cluster)不同,分類是有監督學習模型,聚類屬於無監督學習模型。 聚類講究使用一些算法把樣本划分為n個群落。一般情況下,這種算法都需要計算歐氏距離。(用兩個樣本對應特征值之差的平方和之平方根, 即歐氏距離,來表示這兩個樣本的相似性) 1.K均值算法: 第一步:隨機選擇k個樣本作為k個聚類的中心,計算每個樣本到各個聚類中心的歐氏距離, 將該樣本分配到與之距離最近的聚類中心所在的類別中。 第二步:根據第一步所得到的聚類划分,分別計算每個聚類的幾何中心,將幾何中心作為新的聚類中心, 重復第一步,直到計算所得幾何中心與聚類中心重合或接近重合為止。 注意: 聚類數k必須事先已知。借助某些評估指標,優選最好的聚類數。 聚類中心的初始選擇會影響到最終聚類划分的結果。初始中心盡量選擇距離較遠的樣本。 K均值算法相關API: import sklearn.cluster as sc # n_clusters: 聚類數 model = sc.KMeans(n_clusters=4) # 不斷調整聚類中心,直到最終聚類中心穩定則聚類完成 model.fit(x) # 獲取訓練結果的聚類中心 centers = model.cluster_centers_ 案例:加載multiple3.txt,基於K均值算法完成樣本的聚類。 步驟: 1.讀取文件,加載數據,把樣本繪制在窗口中 2.基於K均值完成聚類業務,為每個樣本設置顏色 3.繪制聚類背景邊界線----pcolormesh ''' import numpy as np import matplotlib.pyplot as mp import sklearn.cluster as sc # 讀取數據,繪制圖像 x = np.loadtxt('./ml_data/multiple3.txt', unpack=False, dtype='f8', delimiter=',') print(x.shape) # 基於Kmeans完成聚類 model = sc.KMeans(n_clusters=4) model.fit(x) # 完成聚類 pred_y = model.predict(x) # 預測點在哪個聚類中 print(pred_y) # 輸出每個樣本的聚類標簽 # 獲取聚類中心 centers = model.cluster_centers_ print(centers) # 繪制分類邊界線 l, r = x[:, 0].min() - 1, x[:, 0].max() + 1 b, t = x[:, 1].min() - 1, x[:, 1].max() + 1 n = 500 grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n)) bg_x = np.column_stack((grid_x.ravel(), grid_y.ravel())) bg_y = model.predict(bg_x) grid_z = bg_y.reshape(grid_x.shape) # 畫圖顯示樣本數據 mp.figure('Kmeans', facecolor='lightgray') mp.title('Kmeans', fontsize=16) mp.xlabel('X', fontsize=14) mp.ylabel('Y', fontsize=14) mp.tick_params(labelsize=10) mp.pcolormesh(grid_x, grid_y, grid_z, cmap='gray') mp.scatter(x[:, 0], x[:, 1], s=80, c=pred_y, cmap='brg', label='Samples') mp.scatter(centers[:, 0], centers[:, 1], s=300, color='red', marker='+', label='cluster center') mp.legend() mp.show() 輸出結果: (200, 2) [0 0 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 2 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 3 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 0 3 1 0 2 3 1 0 2 3 2 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1 0 2 3 1] [[1.831 1.9998 ] [7.07326531 5.61061224] [3.1428 5.2616 ] [5.91196078 2.04980392]]
''' Kmeans使用場景----圖像量化:KMeans聚類算法可以應用於圖像量化領域。通過KMeans算法可以把一張圖像所包含的顏色值進行聚類划分, 求每一類別的平均值后再重新生成新的圖像。可以達到圖像降維的目的。這個過程稱為圖像量化。 圖像量化可以更好的保留圖像的輪廓,降低機器識別圖像輪廓的難度。 n_clusters=2類似於二值化 將百合花圖片進行圖像量化: 步驟: 1.讀取圖片的亮度矩陣 2.基於KMeans算法完成聚類,獲取4個聚類中心的值 3.修改圖片,將每個像素亮度值都改為相應類別的均值(即聚類中心值) 4.繪制圖像 ''' import numpy as np import matplotlib.pyplot as mp import sklearn.cluster as sc import scipy.ndimage as sn import scipy.misc as sm import warnings warnings.filterwarnings('ignore') img = sm.imread('./ml_data/lily.jpg', True) print(img.shape) # 基於KMeans完成聚類 model = sc.KMeans(n_clusters=2) x = img.reshape(-1, 1) # n行1列 print(x.shape) model.fit(x) # 同model.predict(x) 返回每個樣本的類別標簽 y = model.labels_ print(y.shape) centers = model.cluster_centers_ print(centers.shape) img2 = centers[y].reshape(img.shape) print(img2.shape) # 繪圖 mp.subplot(121) mp.imshow(img, cmap='gray') mp.axis('off') # mp.subplot(122) mp.imshow(img2, cmap='gray') mp.axis('off') # 關閉坐標軸 mp.show() 輸出結果: (512, 512) (262144, 1) (262144,) (2, 1) (512, 512)