【機器學習】Mean Shift原理及代碼
Mean Shift介紹
Mean Shift (均值漂移)是基于密度的非參數(shù)聚類算法,其算法思想是假設不同簇類的數(shù)據(jù)集符合不同的概率密度分布,找到任一樣本點密度增大的最快方向(最快方向的含義就是Mean Shift) ,樣本密度高的區(qū)域對應于該分布的最大值,這些樣本點最終會在局部密度最大值收斂,且收斂到相同局部最大值的點被認為是同一簇類的成員。
Mean Shift的原理
均值漂移聚類的目的是發(fā)現(xiàn)一個平滑密度的樣本點。它是一種基于質心的算法,其工作原理是將質心的候選點更新為給定區(qū)域內的點的平均值。然后在后處理階段對這些候選點進行過濾,以消除近似重復點,形成最終的一組質心。給定一個候選質心xi和迭代次數(shù)t,按照以下的等式進行更新:
Mean Shift算法的流程可被理解為:
計算每個樣本的平均位移
對每個樣本點進行平移
重復(1)(2),直到樣本收斂
收斂到相同點的樣本可被認為是同一簇類的成員
## Mean Shift算法的優(yōu)缺點
不需要設置簇的個數(shù)也可以處理任意形狀的簇類,同時算法需要的參數(shù)較少,且結果較為穩(wěn)定不需要像K-means的樣本初始化。但同時Mean Shift對于較大的特征空間需要的計算量非常大,而且如果參數(shù)設置的不好則會較大的影響結果,如果bandwidth設置的太小收斂太慢,而如果bandwidth參數(shù)設置的過大,一部分簇則會丟失。
Mean Shift的代碼實現(xiàn)
在Sklearn中實現(xiàn)了MeanShift算法,其算法使用方法如下:
sklearn.cluster.MeanShift(*, bandwidth=None, seeds=None, bin_seeding=False, min_bin_freq=1, cluster_all=True, n_jobs=None, max_iter=300)
其中最主要的參數(shù)是bandwidth,這個參數(shù)是用于RBF kernel中的帶寬。參數(shù)seeds是用于初始化核的種子,如果不指定則會使用sklearn.cluster.estimate_bandwidth進行估計。
使用示例:
from sklearn.cluster import MeanShift
import numpy as np
X = np.array([[1, 1], [2, 1], [1, 0],
[4, 7], [3, 5], [3, 6]])
clustering = MeanShift(bandwidth=2).fit(X)
Mean Shift的應用
# 導入相關模塊和導入數(shù)據(jù)集
import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn.datasets import make_blobs
# 生成樣本數(shù)據(jù)
centers = [[1, 1], [-1, -1], [1, -1]]
X, _ = make_blobs(n_samples=10000, centers=centers, cluster_std=0.6)
es_bandwidth = estimate_bandwidth(X,quantile=0.2, n_samples= 500)
'''
estimate_bandwidth()用于生成mean-shift窗口的尺寸,
其參數(shù)的意義為:從X中隨機選取500個樣本,
計算每一對樣本的距離,然后選取這些距離的0.2分位數(shù)作為返回值
'''
MS = MeanShift(bandwidth=es_bandwidth)
MS.fit(X)
labels = MS.labels_
cluster_centers = MS.cluster_centers_
uni_labels = np.unique(labels)
n_clusters_ = len(uni_labels)
import matplotlib.pyplot as plt
from itertools import cycle
# 對算法聚類結果進行可視化
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
my_members = labels == k
cluster_center = cluster_centers[k]
plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
markeredgecolor='k', markersize=14)
plt.show()

Mean Shift的實際應用
Mean Shift是聚類中常見的算法,以下展示了該算法在實際中的部分應用:
1. 簡單聚類
mean shift用于聚類就有些類似于密度聚類,從單個樣本點出發(fā),找到其對應的概率密度局部極大點,并將其賦予對應的極大點,從而完成聚類的過程
2. 圖像分割
圖像分割的本質也是聚類,不過相對與簡單聚類,圖像分割又有其特殊性。mean shift通過對像素空間進行聚類,達到圖像分割的目的。

3. 圖像平滑
圖像平滑和圖像分割有異曲同工之妙,同樣是對每一個像素點尋找其對應的概率密度極大點,主要區(qū)別在于:
a. 迭代過程不用深入,通常迭代一次即可;
b. 找到概率密度極大點后,直接用其顏色特征覆蓋自身的顏色特征。

4. 輪廓提取
同樣,輪廓提取與圖像分割也是類似的,或者具體地說,輪廓提取可以基于圖像分割進行。首先使用mean shift 算法對圖像進行分割,然后取不同區(qū)域的邊緣即可得到簡單的輪廓

- EOF -
往期精彩回顧
適合初學者入門人工智能的路線及資料下載 (圖文+視頻)機器學習入門系列下載 機器學習及深度學習筆記等資料打印 《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 機器學習交流qq群955171419,加入微信群請掃碼
