导航:首页 > 源码编译 > meanshift聚类算法

meanshift聚类算法

发布时间:2023-02-05 07:13:29

A. 建议收藏!10 种 python 聚类算法完整操作示例

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。完成本教程后,你将知道:

聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。

群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。

聚类可以作为数据分析活动提供帮助,以便了解更多关于问题域的信息,即所谓的模式发现或知识发现。例如:

聚类还可用作特征工程的类型,其中现有的和新的示例可被映射并标记为属于数据中所标识的群集之一。虽然确实存在许多特定于群集的定量措施,但是对所识别的群集的评估是主观的,并且可能需要领域专家。通常,聚类算法在人工合成数据集上与预先定义的群集进行学术比较,预计算法会发现这些群集。

有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。

一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为“关闭”或“连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:

每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本教程中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。这些示例将为您复制粘贴示例并在自己的数据上测试方法提供基础。我们不会深入研究算法如何工作的理论,也不会直接比较它们。让我们深入研究一下。

在本节中,我们将回顾如何在 scikit-learn 中使用10个流行的聚类算法。这包括一个拟合模型的例子和可视化结果的例子。这些示例用于将粘贴复制到您自己的项目中,并将方法应用于您自己的数据。

1.库安装

首先,让我们安装库。不要跳过此步骤,因为你需要确保安装了最新版本。你可以使用 pip Python 安装程序安装 scikit-learn 存储库,如下所示:

接下来,让我们确认已经安装了库,并且您正在使用一个现代版本。运行以下脚本以输出库版本号。

运行该示例时,您应该看到以下版本号或更高版本。

2.聚类数据集

我们将使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据,并通过指定的群集对图中的点进行颜色绘制。这将有助于了解,至少在测试问题上,群集的识别能力如何。该测试问题中的群集基于多变量高斯,并非所有聚类算法都能有效地识别这些类型的群集。因此,本教程中的结果不应用作比较一般方法的基础。下面列出了创建和汇总合成聚类数据集的示例。

运行该示例将创建合成的聚类数据集,然后创建输入数据的散点图,其中点由类标签(理想化的群集)着色。我们可以清楚地看到两个不同的数据组在两个维度,并希望一个自动的聚类算法可以检测这些分组。

已知聚类着色点的合成聚类数据集的散点图接下来,我们可以开始查看应用于此数据集的聚类算法的示例。我已经做了一些最小的尝试来调整每个方法到数据集。3.亲和力传播亲和力传播包括找到一组最能概括数据的范例。

它是通过 AffinityPropagation 类实现的,要调整的主要配置是将“ 阻尼 ”设置为0.5到1,甚至可能是“首选项”。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法取得良好的结果。

数据集的散点图,具有使用亲和力传播识别的聚类

4.聚合聚类

聚合聚类涉及合并示例,直到达到所需的群集数量为止。它是层次聚类方法的更广泛类的一部分,通过 AgglomerationClustering 类实现的,主要配置是“ n _ clusters ”集,这是对数据中的群集数量的估计,例如2。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组。

使用聚集聚类识别出具有聚类的数据集的散点图

5.BIRCHBIRCH

聚类( BIRCH 是平衡迭代减少的缩写,聚类使用层次结构)包括构造一个树状结构,从中提取聚类质心。

它是通过 Birch 类实现的,主要配置是“ threshold ”和“ n _ clusters ”超参数,后者提供了群集数量的估计。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。

使用BIRCH聚类确定具有聚类的数据集的散点图

6.DBSCANDBSCAN

聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。

它是通过 DBSCAN 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。

使用DBSCAN集群识别出具有集群的数据集的散点图

7.K均值

K-均值聚类可以是最常见的聚类算法,并涉及向群集分配示例,以尽量减少每个群集内的方差。

它是通过 K-均值类实现的,要优化的主要配置是“ n _ clusters ”超参数设置为数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。

使用K均值聚类识别出具有聚类的数据集的散点图

8.Mini-Batch

K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。

它是通过 MiniBatchKMeans 类实现的,要优化的主配置是“ n _ clusters ”超参数,设置为数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,会找到与标准 K-均值算法相当的结果。

带有最小批次K均值聚类的聚类数据集的散点图

9.均值漂移聚类

均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。

它是通过 MeanShift 类实现的,主要配置是“带宽”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。

具有均值漂移聚类的聚类数据集散点图

10.OPTICSOPTICS

聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。

它是通过 OPTICS 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。

使用OPTICS聚类确定具有聚类的数据集的散点图

11.光谱聚类

光谱聚类是一类通用的聚类方法,取自线性线性代数。

它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是“ n _ clusters ”超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,找到了合理的集群。

使用光谱聚类聚类识别出具有聚类的数据集的散点图

12.高斯混合模型

高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。它是通过 Gaussian Mixture 类实现的,要优化的主要配置是“ n _ clusters ”超参数,用于指定数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我们可以看到群集被完美地识别。这并不奇怪,因为数据集是作为 Gaussian 的混合生成的。

使用高斯混合聚类识别出具有聚类的数据集的散点图

在本文中,你发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了:

B. meanshift算法怎样解释

meanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。meanShift这个概念最早是由Fukunage在1975年提出的,其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。

C. kmean算法是干什么的

聚类分析是一种静态数据分析方法,常被用于机器学习,模式识别,数据挖掘等领域。通常认为,聚类是一种无监督式的机器学习方法,它的过程是这样的:在未知样本类别的情况下,通过计算样本彼此间的距离(欧式距离,马式距离,汉明距离,余弦距离等)来估计样本所属类别。从结构性来划分,聚类方法分为自上而下和自下而上两种方法,前者的算法是先把所有样本视为一类,然后不断从这个大类中分离出小类,直到不能再分为止;后者则相反,首先所有样本自成一类,然后不断两两合并,直到最终形成几个大类。
常用的聚类方法主要有以下四种: //照搬的wiki,比较懒...
Connectivity based clustering(如hierarchical clustering 层次聚类法)
Centroid-based clustering(如kmeans)
Distribution-based clustering
Density-based clustering
Kmeans聚类是一种自下而上的聚类方法,它的优点是简单、速度快;缺点是聚类结果与初始中心的选择有关系,且必须提供聚类的数目。Kmeans的第二个缺点是致命的,因为在有些时候,我们不知道样本集将要聚成多少个类别,这种时候kmeans是不适合的,推荐使用hierarchical 或meanshift来聚类。第一个缺点可以通过多次聚类取最佳结果来解决。
Kmeans的计算过程大概表示如下
随机选择k个聚类中心. 最终的类别个数<= k
计算每个样本到各个中心的距离
每个样本聚类到离它最近的中心
重新计算每个新类的中心
重复以上步骤直到满足收敛要求。(通常就是中心点不再改变或满足一定迭代次数).

D. 常用聚类(K-means,DBSCAN)以及聚类的度量指标:

一年前需要用聚类算法时,自己从一些sklearn文档和博客粗略整理了一些相关的知识,记录在电子笔记里备忘,现在发到网上,当时就整理的就很乱,以后有空慢慢把内容整理、完善,用作备忘。之前把电影标签信息的聚类结果作为隐式反馈放进SVD++中去训练,里面有两个小例子

利用条件熵定义的同质性度量:
sklearn.metrics.homogeneity_score:每一个聚出的类仅包含一个类别的程度度量。
sklearn.metrics.completeness:每一个类别被指向相同聚出的类的程度度量。
sklearn.metrics.v_measure_score:上面两者的一种折衷:
v = 2 * (homogeneity * completeness) / (homogeneity + completeness)
可以作为聚类结果的一种度量。
sklearn.metrics.adjusted_rand_score:调整的兰德系数。
ARI取值范围为[-1,1],从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度
sklearn.metrics.adjusted_mutual_info_score:调整的互信息。
利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI与NMI取值范围为[0,1],AMI取值范围为[-1,1]。

在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score.
CH指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。

silhouette_sample
对于一个样本点(b - a)/max(a, b)
a平均类内距离,b样本点到与其最近的非此类的距离。
silihouette_score返回的是所有样本的该值,取值范围为[-1,1]。

这些度量均是越大越好

K-means算法应该算是最常见的聚类算法,该算法的目的是选择出质心,使得各个聚类内部的inertia值最小化,计算方法如下:
inertia可以被认为是类内聚合度的一种度量方式,这种度量方式的主要缺点是:
(1)inertia假设数据内的聚类都是凸的并且各向同性( convex and isotropic),
各项同性是指在数据的属性在不同方向上是相同的。数据并不是总能够满足这些前提假设的,
所以当数据事细长簇的聚类,或者不规则形状的流形时,K-means算法的效果不理想。

(2)inertia不是一种归一化度量方式。一般来说,inertia值越小,说明聚类效果越好。
但是在高维空间中,欧式距离的值可能会呈现迅速增长的趋势,所以在进行K-means之前首先进行降维操作,如PCA等,可以解决高维空间中inertia快速增长的问题,也有主意提高计算速度。

K-means算法可以在足够长的时间内收敛,但有可能收敛到一个局部最小值。
聚类的结果高度依赖质心的初始化,因此在计算过程中,采取的措施是进行不止一次的聚类,每次都初始化不同的质心。
sklearn中可以通过设置参数init='kmeans++'来采取k-means++初始化方案,
即初始化的质心相互之间距离很远,这种方式相比于随机初始质心,能够取得更好的效果。
另外,sklearn中可以通过参数n_job,使得K-means采用并行计算的方式。

##sklearn 中K-means的主要参数:

1) n_clusters: 设定的k值

2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。

3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10。如果你的k值较大,则可以适当增大这个值。

4)init: 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++'。

5)algorithm:有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般来说建议直接用默认的"auto"

聚类的中心
print clf.cluster_centers_

每个样本所属的簇
print clf.labels_

用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print clf.inertia_
Sum of distances of samples to their closest cluster center.
两个小例子(很久以前弄的,写得比较简略比较乱,有空再改,数据是movielen中的电影标签信息):
例1:

例2,在区间[2,200]上遍历k,并生成两个聚类内部评价指标CH分、轮廓系数以及kmeans自带inertia分和对应的k值的图片来选择k:

其中两点相似度s(i, j)的度量默认采用负欧氏距离。
sklearn.cluster.AffinityPropagation
有参数preference(设定每一个点的偏好,将偏好于跟其他节点的相似性进行比较,选择
高的作为exmplar,未设定则使用所有相似性的中位数)、damping (阻尼系数,
利用阻尼系数与1-阻尼系数对r 及 a进行有关迭代步数的凸组合,使得算法收敛
default 0.5 可以取值与[0.5, 1])

cluster_centers_indices_:中心样本的指标。
AP算法的主要思想是通过数据点两两之间传递的信息进行聚类。
该算法的主要优点是能够自主计算聚类的数目,而不用人为制定类的数目。
其缺点是计算复杂度较大 ,计算时间长同时空间复杂度大,
因此该算法适合对数据量不大的问题进行聚类分析。

数据点之间传递的信息包括两个,吸引度(responsibility)r(i,k)和归属度(availability)a(i,k)。
吸引度r(i,k)度量的是质心k应当作为点i的质心的程度,
归属度a(i,k)度量的是点i应当选择质心k作为其质心的程度。

其中t是迭代的次数,λ是阻尼因子,其值介于[0,1],在sklearn.cluster.AffinityPropagation中通过参数damping进行设置。
每次更新完矩阵后,就可以为每个数据点分配质心,分配方式?是针对数据点i,遍历所有数据点k(包括其自身),
找到一个k使得r(i,k)+a(i,k)的值最大,则点k就是点i所属的质心,迭代这个过程直至收敛。
所谓收敛就是所有点所属的质心不再变化

首先说明不引入核函数时的情况。
算法大致流程为:随机选取一个点作为球心,以一定半径画一个高维球(数据可能是高维的),
在这个球范围内的点都是这个球心的邻居。这些邻居相对于球心都存在一个偏移向量,
将这些向量相加求和再平均,就得到一个mean shift,起点在原球心,重点在球内的其他位置。
以mean shift的重点作为新的球心,重复上述过程直至收敛。

这个计算过程中,高维球内的点,无论其距离球心距离多远,对于mean shift的计算权重是一样的。
为了改善这种情况,在迭代计算mean shift的过程中引入了核函数
sklearn中相关实现是sklearn.cluster.MeanShift。

sklearn中实现的是自底向上的层次聚类,实现方法是sklearn.cluster.AgglomerativeClustering。
初始时,所有点各自单独成为一类,然后采取某种度量方法将相近的类进行合并,并且度量方法有多种选择。
合并的过程可以构成一个树结构,其根节点就是所有数据的集合,叶子节点就是各条单一数据。
sklearn.cluster.AgglomerativeClustering中可以通过参数linkage选择不同的度量方法,用来度量两个类之间的距离,
可选参数有ward,complete,average三个。

ward:选择这样的两个类进行合并,合并后的类的离差平方和最小。

complete:两个类的聚类被定义为类内数据的最大距离,即分属两个类的距离最远的两个点的距离。
选择两个类进行合并时,从现有的类中找到两个类使得这个值最小,就合并这两个类。

average:两个类内数据两两之间距离的平均值作为两个类的距离。
同样的,从现有的类中找到两个类使得这个值最小,就合并这两个类。

Agglomerative cluster有一个缺点,就是rich get richer现象,
这可能导致聚类结果得到的类的大小不均衡。
从这个角度考虑,complete策略效果最差,ward得到的类的大小最为均衡。
但是在ward策略下,affinity参数只能是“euclidean”,即欧式距离。
如果在欧氏距离不适用的环境中,average is a good alternative。

另外还应该注意参数affinity,这个参数设置的是计算两个点之间距离时采用的策略,
注意和参数linkage区分,linkage设置的是衡量两个类之间距离时采用的策略,
而点之间的距离衡量是类之间距离衡量的基础。
affinity的可选数值包括 “euclidean”, “l1”, “l2”, “manhattan”, “cosine”,
‘precomputed’. If linkage is “ward”, only “euclidean” is accepted.

DBSCAN算法的主要思想是,认为密度稠密的区域是一个聚类,各个聚类是被密度稀疏的区域划分开来的。
也就是说,密度稀疏的区域构成了各个聚类之间的划分界限。与K-means等算法相比,该算法的主要优点包括:可以自主计算聚类的数目,不需要认为指定;不要求类的形状是凸的,可以是任意形状的。

DBSCAN中包含的几个关键概念包括core sample,non-core sample,min_sample,eps。
core samle是指,在该数据点周围eps范围内,至少包含min_sample个其他数据点,则该点是core sample,
这些数据点称为core sample的邻居。与之对应的,non-sample是该点周围eps范围内,所包含的数据点个数少于min_sample个。从定义可知,core sample是位于密度稠密区域的点。

一个聚类就是一个core sample的集合,这个集合的构建过程是一个递归的构成。
首先,找到任意个core sample,然后从它的邻居中找到core sample,
接着递归的从这些邻居中的core sample的邻居中继续找core sample。
要注意core sample的邻居中不仅有其他core sample,也有一些non-core smaple,
也正是因为这个原因,聚类集合中也包含少量的non-core sample,它们是聚类中core sample的邻居,
但自己不是core sample。这些non-core sample构成了边界。

在确定了如何通过单一core sample找到了一个聚类后,下面描述DBSCAN算法的整个流程。
首先,扫描数据集找到任意一个core sample,以此core sample为起点,按照上一段描述的方法进行扩充,确定一个聚类。然后,再次扫描数据集,找到任意一个不属于以确定类别的core sample,重复扩充过程,再次确定一个聚类。
迭代这个过程,直至数据集中不再包含有core sample。
这也是为什么DBSCAN不用认为指定聚类数目的原因。

DBSCAN算法包含一定的非确定性。数据中的core sample总是会被分配到相同的聚类中的,哪怕在统一数据集上多次运行DBSCAN。其不确定性主要体现在non-core sample的分配上。
一个non-core sample可能同时是两个core sample的邻居,而这两个core sample隶属于不同的聚类。
DBSCAN中,这个non-core sample会被分配给首先生成的那个聚类,而哪个聚类先生成是随机的。

sklearn中DBSCAN的实现中,邻居的确定使用的ball tree和kd-tree思想,这就避免了计算距离矩阵。

阅读全文

与meanshift聚类算法相关的资料

热点内容
如何修改ie代理服务器 浏览:417
折纸手工解压玩具不用a4纸 浏览:485
怎么双向传输服务器 浏览:286
电脑如何实现跨网段访问服务器 浏览:549
模块化网页源码字节跳动 浏览:485
梯度下降算法中遇到的问题 浏览:605
服务器连接电视怎么接 浏览:323
phploop语句 浏览:502
交叉编译工具链里的库在哪 浏览:781
安卓手q换号怎么改绑 浏览:399
nba球星加密货币 浏览:789
命令看网速 浏览:124
java堆分配 浏览:161
linuxbuiltin 浏览:560
cstpdf 浏览:941
texstudio编译在哪 浏览:352
国家反诈中心app注册登记表怎么注册 浏览:972
加密机默认端口 浏览:101
有哪个网站有免费的python源代码 浏览:305
苹果手机如何导入安卓电话 浏览:915