均值漂移(Mean Shift)是一种层次聚类算法。与监督机器学习算法相比,聚类试图对数据进行分组,而无需首先对标记数据进行训练。聚类用于各种应用,例如搜索引擎,学术排名和医学。与K-Means相反,使用Mean Shift时,您不需要事先知道类(聚类)的数量。Mean Shift的缺点是它的计算成本很高--O(n²)。
它是如何运作的
- 定义一个窗口(bandwidth of the kernel)并将窗口放在数据点上
![dd2bfbe94b9bfcf8b549fcd11e2903c4.png](https://i-blog.csdnimg.cn/blog_migrate/0baca5f5337e2bec2914c45ea2da8896.jpeg)
2.计算窗口中所有点的平均值
![3dd02ee362a40f33dee80f6f08780def.png](https://i-blog.csdnimg.cn/blog_migrate/28629880e5ce17f716e5d18f6d29efd1.jpeg)
3.将窗口的中心移动到平均值的位置
![5ecc72877e7f2bdffcdba51323950579.png](https://i-blog.csdnimg.cn/blog_migrate/df3f3f8bd3b1fd7d803a5d2f4b5d13b8.jpeg)
4.重复步骤2和3,直到收敛为止
![f3041ba2b6616342dd718fcd5912ed8a.png](https://i-blog.csdnimg.cn/blog_migrate/cce981015602589005735e3b851ea154.jpeg)
python中的示例
让我们看一下如何使用python中的Mean Shift算法标记数据。
import numpy as npimport pandas as pdfrom sklearn.cluster import MeanShiftfrom sklearn.datasets.samples_generator import make_blobsfrom matplotlib import pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D
![6d52af62a44cd18c6e1d502915f378e6.png](https://i-blog.csdnimg.cn/blog_migrate/babbd9e19328617935fbe258ab6676ef.jpeg)
我们使用该make_blobs方法生成自己的机器学习数据。
clusters = [[1,1,1],[5,5,5],[3,10,10]]X, _ = make_blobs(n_samples = 150, centers = clusters, cluster_std = 0.60)
![c1760a7e5e416f8df167673400147269.png](https://i-blog.csdnimg.cn/blog_migrate/488cd324184d238128908db357444d3c.jpeg)
训练机器学习模型后,我们存储聚类中心的坐标。
ms = MeanShift()ms.fit(X)cluster_centers = ms.cluster_centers_
![f52c15a124e4867a02a77ddfe6179f66.png](https://i-blog.csdnimg.cn/blog_migrate/aa191d5d7ed89c41ded3ca27ba36db0f.jpeg)
最后,我们在3D图中绘制数据点和质心。
fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(X[:,0], X[:,1], X[:,2], marker='o')ax.scatter(cluster_centers[:,0], cluster_centers[:,1], cluster_centers[:,2], marker='x', color='red', s=300, linewidth=5, zorder=10)plt.show()
![1f46a966d64a63b9a8ac29b191ab6e88.png](https://i-blog.csdnimg.cn/blog_migrate/15dab8347aeb6e935aa93a9f1c2d63da.jpeg)
![db46ad51095b3032f9cf4f2b2afb71b8.png](https://i-blog.csdnimg.cn/blog_migrate/6990bcb55f6436d7ddc0a5c11eddb5f7.jpeg)