sklearn之聚類K均值算法


'''
    聚類:分類(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)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM