均值漂移非常類似于 KMeans 算法,除了一個很重要的因素踱侣,你不需要指定分組的數(shù)量粪小。均質漂亮算法自己尋找簇。出于這個原因抡句,它比起 KMeans探膊,更加是一種“非監(jiān)督”的機器學習的算法。
均值漂移的方式就是遍歷每個特征集(圖上的數(shù)據(jù)點)待榔,并且執(zhí)行登山的操作逞壁。登山就像它的名字,思想是持續(xù)底層,或者向上走腌闯,直到到達了頂部绳瘟。我們不確定只有一個局部最大值。我們可能擁有一個姿骏,也可能擁有是個糖声。這里我們的“山”就是給定半徑內的特征集或數(shù)據(jù)點數(shù)量。半徑也叫作貸款工腋,整個窗口就是你的核。窗口中的數(shù)據(jù)越多畅卓,就越好擅腰。一旦我們不再執(zhí)行另一個步驟,來降低半徑內的特征集或者數(shù)據(jù)點的數(shù)量時翁潘,我們就選取該區(qū)域內所有數(shù)據(jù)的均值趁冈,然后就有了簇的中心。我們從每個數(shù)據(jù)點開始這樣做拜马。許多數(shù)據(jù)點都會產(chǎn)生相同的簇中心渗勘,這應該是預料中的,但是其他數(shù)據(jù)點也可能有完全不同的簇中心俩莽。
但是旺坠,你應該開始認識到這個操作的主要弊端:規(guī)模。規(guī)陌绯看似是一個永久的問題取刃。所以我們從每個數(shù)據(jù)點開始運行這個優(yōu)化算法,這很糟糕出刷,我們可以使用一些方法來加速這個過程璧疗,但是無論怎么樣,這個算法仍然開銷很大馁龟。
雖然這個方法是層次聚類方法崩侠,你的核可以是扁平的,或者高斯核坷檩。要記住這個核就是你的窗口却音,在尋找均值時,我們可以讓每個特征集擁有相同權重(扁平核)矢炼,或者通過核中心的接近性來分配權重(高斯核)僧家。
均值漂移用于什么呢?核之前提到的聚類相比裸删,均值漂移在圖像分析的跟蹤和平滑中很熱門“斯埃現(xiàn)在,我們打算僅僅專注于我們的特征集聚類。
現(xiàn)在為止肌稻,我們涉及了使用 Sklearn 和 Matplotlib 可視化的基礎清蚀,以及分類器的屬性。所以我直接貼出了代碼:
import numpy as np
from sklearn.cluster import MeanShift
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import style
style.use("ggplot")
centers = [[1,1,1],[5,5,5],[3,10,10]]
X, _ = make_blobs(n_samples = 100, centers = centers, cluster_std = 1.5)
ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
print(cluster_centers)
n_clusters_ = len(np.unique(labels))
print("Number of estimated clusters:", n_clusters_)
colors = 10*['r','g','b','c','k','y','m']
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(len(X)):
ax.scatter(X[i][0], X[i][1], X[i][2], c=colors[labels[i]], marker='o')
ax.scatter(cluster_centers[:,0],cluster_centers[:,1],cluster_centers[:,2],
marker="x",color='k', s=150, linewidths = 5, zorder=10)
plt.show()
控制臺輸出:
[[ 1.26113946 1.24675516 1.04657994]
[ 4.87468691 4.88157787 5.15456168]
[ 2.77026724 10.3096062 10.40855045]]
Number of estimated clusters: 3