通俗易懂讲透均值漂移(Mean Shift)聚类算法

张开发
2026/4/17 13:02:26 15 分钟阅读

分享文章

通俗易懂讲透均值漂移(Mean Shift)聚类算法
通俗易懂讲透均值漂移Mean Shift聚类算法不用指定簇数、自动找高密度区域这是Mean Shift最香的特点本文用大白话生活案例公式详解可直接运行代码本科生、研究生都能轻松看懂。一、均值漂移是什么一句话讲明白均值漂移Mean Shift是基于密度的无监督聚类算法。它的核心逻辑让每个数据点往“周围点最多、最拥挤”的地方移动直到不再动最后聚在一起的就是一类。你可以把它理解为数据点 水面上的小船每只船都往人最多的湖心漂最后所有船自动聚成几堆 → 这就是聚类结果二、超通俗生活案例给糖果自动分组桌上有6颗糖果坐标如下(1,2)、(2,2)、(3,2)、(8,8)、(9,8)、(9,9)我们用Mean Shift自动分组步骤1设置窗口半径 bandwith相当于“看多远”这里设h3。步骤2每个点找周围邻居算平均位置左边3个点邻居互相重叠平均位置是(2,2)右边3个点邻居互相重叠平均位置约(8.67,8.33)步骤3不断往平均位置漂移所有点慢慢向这两个中心靠拢。步骤4收敛停止最终自动分成2类完全不用提前告诉算法分几组三、Mean Shift 标准算法流程必背选带宽h确定每个点观察的范围大小对每个点在窗口内算加权均值密度中心漂移把点移到这个均值位置迭代重复计算→移动直到点几乎不动合并中心靠得很近的中心算同一个簇四、核心公式报告/作业直接用1. 核密度估计算密度f(x)1nhd∑i1nK(∥x−xi∥h) f(x)\frac{1}{n h^{d}} \sum_{i1}^{n} K\left(\frac{\left\| x-x_{i}\right\| }{h}\right)f(x)nhd1​i1∑n​K(h∥x−xi​∥​)h带宽搜索半径K核函数常用高斯核含义x点周围有多“拥挤”2. 加权均值漂移目标点μ(x)∑xi⋅K(∥x−xi∥h)∑K(∥x−xi∥h) \mu(x)\frac{\sum x_{i} \cdot K\left(\frac{\left\|x-x_{i}\right\|}{h}\right)}{\sum K\left(\frac{\left\|x-x_{i}\right\|}{h}\right)}μ(x)∑K(h∥x−xi​∥​)∑xi​⋅K(h∥x−xi​∥​)​3. 均值漂移向量移动方向m(x)μ(x)−x m(x) \mu(x) - xm(x)μ(x)−x4. 点更新规则xnewxoldm(x) x_{new} x_{old} m(x)xnew​xold​m(x)五、关键参数带宽 bandwidth带宽h是Mean Shift唯一重要参数h太大簇变少可能把不同类合并h太小簇变多过度分割实战技巧用estimate_bandwidth()自动估算六、完整实战代码可直接复制运行用Mean Shift做二维数据聚类密度图可视化# 安装依赖# pip install numpy matplotlib scikit-learn seabornimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.clusterimportMeanShift,estimate_bandwidthfromsklearn.datasetsimportmake_blobs# 1. 生成测试数据centers[[2,3],[8,8],[1,10],[9,1]]cluster_std[1.0,0.8,1.5,0.5]X,_make_blobs(n_samples3000,centerscenters,cluster_stdcluster_std,random_state42)# 2. 自动计算最佳带宽bandwidthestimate_bandwidth(X,quantile0.2,n_samples500)print(f自动估算带宽{bandwidth:.2f})# 3. 均值漂移聚类msMeanShift(bandwidthbandwidth,bin_seedingTrue)ms.fit(X)labelsms.labels_ cluster_centersms.cluster_centers_ n_clusterslen(np.unique(labels))print(f自动聚类数量{n_clusters})# 4. 绘制聚类结果plt.figure(figsize(14,7))colorssns.color_palette(bright,n_colorsn_clusters)fork,colinzip(np.unique(labels),colors):masklabelsk plt.scatter(X[mask,0],X[mask,1],c[col],s30,alpha0.7)plt.scatter(cluster_centers[:,0],cluster_centers[:,1],cblack,s300,markerX,labelCluster Center)plt.title(fMean Shift 聚类结果簇数{n_clusters},fontsize16)plt.legend()plt.grid(True)plt.show()# 5. 绘制密度分布图plt.figure(figsize(14,7))sns.kdeplot(xX[:,0],yX[:,1],fillTrue,cmapviridis,alpha0.8)plt.scatter(cluster_centers[:,0],cluster_centers[:,1],cred,s300,markerX,labelCenter)plt.title(数据密度分布与聚类中心,fontsize16)plt.legend()plt.grid(True)plt.show()代码亮点自动估算带宽不用手动调参自动输出簇数双图展示聚类结果密度分布适配作业、报告、博客七、Mean Shift 优缺点面试/报告必写✅ 优点不用指定K算法自动找簇数支持任意形状环形、弯曲、不规则簇都能分基于密度对噪声有一定鲁棒性原理直观漂移→收敛容易理解❌ 缺点速度慢复杂度O(n²)大数据不友好对带宽h极度敏感高维数据效果差可能收敛到局部最优八、适用场景什么时候用它 首选Mean Shift不知道要分几类数据形状不规则、密度不均匀图像分割、目标跟踪、视频目标检测小规模数据、需要自动化分组 不推荐用百万级大数据 → 用Mini-Batch K-Means高维稀疏数据 → 用谱聚类追求极致速度 → 用K-Means九、一句话总结均值漂移Mean Shift是不用设簇数、自动找高密度区的聚类算法靠“往人多的地方漂”实现分组特别适合不规则分布与图像类任务。

更多文章