📜  毫升 |均值漂移聚类

📅  最后修改于: 2022-05-13 01:55:33.915000             🧑  作者: Mango

毫升 |均值漂移聚类

与无监督学习相比, Meanshift属于聚类算法的类别,无监督学习通过将点移向模式迭代地将数据点分配给集群(模式是该区域中数据点的最高密度,在 Meanshift 的上下文中) .因此,它也被称为寻模算法。 Mean-shift算法在图像处理和计算机视觉领域都有应用。

与流行的 K-Means 聚类算法不同,mean-shift 不需要提前指定聚类的数量。聚类的数量由算法相对于数据确定。

注意: Mean Shift 的缺点是计算量大 O(n²)。

核密度估计——

应用均值偏移聚类算法的第一步是以数学方式表示您的数据,这意味着将您的数据表示为点,如下面的集合。

Mean-shift 基于核密度估计的概念,简称 KDE。想象一下,上述数据是从概率分布中采样的。 KDE 是一种估计基础分布的方法,也称为一组数据的概率密度函数。

它通过在数据集中的每个点上放置一个内核来工作。内核是通常用于卷积的加权函数的一个花哨的数学词。有许多不同类型的内核,但最流行的一种是高斯内核。将所有单独的内核相加会生成一个概率表面示例密度函数。根据使用的内核带宽参数,最终的密度函数会有所不同。

下面是我们使用内核带宽为 2 的高斯内核的上述点的 KDE 表面。

曲面图:

等高线图:

以下是Python实现:

import numpy as np
import pandas as pd
from sklearn.cluster import MeanShift
from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
   
# We will be using the make_blobs method
# in order to generate our own data.
  
clusters = [[2, 2, 2], [7, 7, 7], [5, 13, 13]]
  
X, _ = make_blobs(n_samples = 150, centers = clusters,
                                   cluster_std = 0.60)
   
# After training the model, We store the
# coordinates for the cluster centers
ms = MeanShift()
ms.fit(X)
cluster_centers = ms.cluster_centers_
   
# Finally We plot the data points
# and centroids in a 3D graph.
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()

在此处尝试代码

输出:

为了说明,假设我们有一个 d 维空间中点的数据集 {ui},从一些更大的总体中采样,并且我们选择了一个具有带宽参数 h 的内核 K。这些数据和核函数一起返回完整人口密度函数的以下核密度估计量。

这里的核函数需要满足以下两个条件:


满足这些条件的两个流行的内核函数由-

下面我们使用高斯核在一维中绘制一个示例,以估计一些人口沿 x 轴的密度。我们可以看到,每个样本点都为我们的估计增加了一个小高斯,以它为中心,上面的方程可能看起来有点吓人,但这里的图形应该清楚地说明这个概念非常简单。

迭代模式搜索 –

1. Initialize random seed and window W.
2. Calculate the center of gravity (mean) of W.    
3. Shift the search window to the mean.    
4. Repeat Step 2 until convergence.

一般算法大纲 –

for p in copied_points:
    while not at_kde_peak:
        p = shift(p, original_points)

Shift函数如下所示 -

def shift(p, original_points):
    shift_x = float(0)
    shift_y = float(0)
    scale_factor = float(0)
  
    for p_temp in original_points:
        # numerator
        dist = euclidean_dist(p, p_temp)
        weight = kernel(dist, kernel_bandwidth)
        shift_x += p_temp[0] * weight
        shift_y += p_temp[1] * weight
        # denominator
        scale_factor += weight
  
    shift_x = shift_x / scale_factor
    shift_y = shift_y / scale_factor
    return [shift_x, shift_y]

优点:

  • 查找可变数量的模式
  • 对异常值鲁棒
  • 通用的、独立于应用程序的工具
  • 无模型,在数据集群上不假设任何先前的形状,如球形、椭圆形等
  • 只有一个参数(窗口大小 h),其中 h 具有物理意义(与 k-means 不同)

缺点:

  • 输出取决于窗口大小
  • 窗口大小(带宽)selecHon 不是微不足道的
  • 计算上(相对)昂贵(大约 2 秒/图像)
  • 不能很好地与特征空间的维度一起缩放。