基于密度的聚类(Density-based clustering)-- 核密度估计(kernel density estimation)

In density-based clustering, clusters are defined as areas of higher density than the remainder of the data set. Objects in sparse areas - that are required to separate clusters-are usually considered to be noise and border points. --wiki

在基于密度的聚类中,聚类定义为密度高于数据集其余部分的区域。稀疏区域中的对象(用于分隔cluster簇)通常被认为是噪声和边界点。

DBSCAN(Density-based spatial clustering of applications with noise带噪声的基于密度的空间聚类应用)与许多更新的方法相比,它具有定义明确的集群模型,称为”密度可达性“,类似于基于链接的聚类,它基于在特定距离阈值内的链接点。然而,它只连接满足密度标准的点,在原始变体中定义为该半径内其他对象的最小数量。聚类(cluster)由所有密度链接的对象加这些对象范围内所有的对象组成。DBSCAN的另一个有趣的特性是它的复杂度很低,它需要在数据库上进行线性数量的范围查询-并且每次运行都会发现基本相同的结果(它对于核心点和噪声点是确定性的,而对于边界点则不是),因此无需多次运行它,OPTICS(ordering points to identify the clustering structure用于标识聚类结构的排序点)是DBSCAN的一般化(generalization),它消除了为范围参数图片选择适当值的需要,并且产生与链接聚类相关的分层结果。

DBSCAN 和OPTICS的主要缺点是它们期望某种密度下降来检测聚类的边界。例如,在具有重叠高斯分布的数据集上,这些算法产生的聚类边界通常看来是任意的,因为聚类密度连续下降。在由高斯混合构成的数据集上,这些算法几乎总是比 诸如EM聚类这样的 能够对此类数据进行精确建模的方法 表现更好。

均值偏移(mean-shift)是一种聚类方法,其中,根据核密度估计,将每个对象移动到其活动中最密集的区域。最终,这些对象会聚到局部的密度最大值。类似于k-means聚类,这些“密度吸引子”可以用作数据集的代表,但均值-漂移可以检测类似于DBSCAN的任意形状的聚类。但是由于费时费力的迭代过程和密度估计,这导致聚类尾部过于碎片化。

在上一节中,我们介绍了高斯混合模型(Gaussian Mixture Model),它是由聚类estimator和密度estimator混合而成。回想一下密度估计器(density estimator),如果要一个算法从D维数组中产生一个D维概率分布估计,高斯混合模型算法通过将密度表示为高斯分布的加权求和来实现它。从某种意义上说,核密度估计(kernel density estimation)是一种将高斯混合思想发挥到其逻辑极限的算法:它使用由每个点的一个高斯分量组成的混合,从而产生基本上非参数的密度估计量。

密度估计是一种旨在对生成数据集的概率分布进行建模。对于一维数据,我们熟悉的一种简单的density estimator有:直方图(histogram)。直方图将数据分成离散的桶,计算掉在每个桶中的点的个数,然后直观地可视化这个结果。

例如,我们从两个正态分布(normal distribution)中创建一些数据:

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
def make_data(N, f=0.3, rseed=1):
    rand = np.random.RandomState(rseed)
    x = rand.randn(N)
    x[int(f * N):] += 5
    return x
x = make_data(1000)

可以使用plt.hist()函数创建基于标准计数的直方图。通过指定直方图的normed参数最终得到normalized直方图,其中桶的高度不反应计数,而是反应概率密度。

hist = plt.hist(x, bins=30, normed=True)

在这里插入图片描述
需要注意的是,对于均等分桶(equal binning),此种归一化仅改变y轴上的比例,而相对高度和使用计数的方法构建的直方图中的高度基本相同。选择此归一化,以便直方图的总面积等于1,我们可以通过下面的代码来查看直方图函数的输出来确认:

density, bins, patches = hist
widths = bins[1:] - bins[:-1]
(density * widths).sum()

在这里插入图片描述
使用直方图作为密度估计器的问题之一是,桶的大小和位置的选择可能会导致表示具有本质上不同的特征。例如,如果我们仅用20个点查看数据的样子,如何绘制这些桶,会导致我们对数据有完全不同的解析!例如下面这个例子:

x = make_data(20)
bins = np.linspace(-5, 10, 10)
fig, ax = plt.subplots(1, 2, figsize=(12, 4),
sharex=True, sharey=True,
subplot_kw={
   'xlim':(-4, 9),'ylim':(-0.02, 0.3)})
fig.subplots_adjust(wspace=0.05)
for i, offset in enumerate([0.0, 0.6]):
    ax[i].hist(x, bins=bins + offset, normed=True)
    ax[i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值