Sklearn参数详解—聚类算法

栏目: 编程工具 · 发布时间: 6年前

Sklearn参数详解—聚类算法

总第115篇

前言

聚类是一种非监督学习,是将一份给定数据集划分成k类,这一份数据集可能是某公司的一批用户,也可能是某媒体网站的一系列文章,如果是某公司的一批用户,那么k-means做的就是根据用户的表现对用户的分类;如果媒体的文章,那么k-means做的就是根据文章的类型,把他分到不同的类别。

当一个公司用户发展到一定的量级以后,就没有办法以同样的精力去维护所有用户,这个时候就需要根据用户的种种表现对用户进行分类,然后根据用户类别的不同,采取不同的运营策略。而这里的分类方法就是聚类算法。我们这篇文章主要讲述一下常用的三种聚类方法:

  • K-means聚类

  • 层次聚类

  • 密度聚类

K-means聚类算法

K-means聚类算法是最简单、最基础的聚类算法,原理很简单,就是先指定k个点,然后计算每一个样本点分别到这k个点之间的距离,并将不同样本点划分到距离最近的那个点的集合,这样就把所有的样本分成k类了。比如下图就是将所有的样本分为3类。

Sklearn参数详解—聚类算法

步骤:

  1. 随机选择K个点(质心)

  2. 通过计算每个点到这K个点之间的距离(这里的距离默认是欧式距离,一般也选择欧式距离,也可以是其他,比如DTW),并将样本点划分到距离最近的那个点。

  3. 计算划分后的点的平均值,并将均值作为新的质心,继续进行距离求解,然后重新进行划分,再次求均值,直到均值不发生变化时循环停止。

参数

class sklearn.cluster.KMeans
(n_clusters=8, init='k-means++', n_init=10, max_iter=300,
tol=0.0001, precompute_distances='auto', verbose=0,
random_state=None, copy_x=True, n_jobs=1, algorithm='auto')

n_clusters:质心数量,也就是分类数,默认是8个。

init:初始化质心的选取方式,主要有下面三种参数可选,‘k-means++’、‘random’ or an ndarray,默认是'k-means++'。因为初始质心是随机选取的,会造成局部最优解,所以需要更换几次随机质心,这个方法在sklearn中通过给init参数传入=“k-means++”即可。

K-means与K-means++区别:

原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:

假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心,但在选取第一个聚类中心(n=1)时同样通过随机的方法,之所以这样做是因为聚类中心互相离得越远越好。

n_init:随机初始化的次数,kmeans质心迭代的次数。

max_iter:最大迭代次数,默认是300。

tol:误差容忍度最小值。

precompute_distances:是否需要提前计算距离, auto , True , False 三个参数值可选。默认值是 auto ,如果选择 auto ,当样本数*质心数>12兆的时候,就不会提前进行计算,如果小于则会与提前计算。提前计算距离会让聚类速度很快,但是也会消耗很多内存。

copy_x:主要起作用于提前计算距离的情况,默认值是True,如果是True,则表示在源数据的副本上提前计算距离时,不会修改源数据。

algorithm:优化算法的选择,有 autofullelkan 三种选择。 full 就是一般意义上的K-Means算法, elkan 是使用的 elkan K-Means 算法。默认的 auto 则会根据数据值是否是稀疏的(稀疏一般指是有大量缺失值),来决定如何选择 fullelkan 。如果数据是稠密的,就选择 elkan K-means ,否则就使用普通的Kmeans算法。

Sklearn参数详解—聚类算法

刘建平大佬博客关于elkan算法的解释

对象/属性

cluster_centers_:输出聚类的质心。

labels_:输出每个样本集对应的类别。

inertia_:所有样本点到其最近点距离之和。

层次聚类

层次聚类有两种方式,一种是从上至下(凝聚法),另一种是从下至上(分裂法),如下图所示。

Sklearn参数详解—聚类算法

从下至上(凝聚法)

从上至下就是把 每一个样本 分别当作一类,然后计算两两样本之间的距离,将距离较近的两个样本进行合并,再计算两两合并以后的簇之间的距离,将距离最近的两个簇进行合并,重复执行这个过程,直到达到最后指定的类别数或者达到了停止条件。

从上至下(分裂法)

从下至上就是刚开始把 所有样本 都当作同一类,然后计算两两样本之间的距离,将距离较远的两个样本分割成两类,然后再计算剩余样本集中每个样本到这两类中的距离,距离哪类比较近,则把样本划分到哪一类,循环执行这个过程,直到达到最后指定的类别数或者达到了停止条件。

参数

AgglomerativeClustering 是用来实现凝聚法聚类模型的。

class sklearn.cluster.AgglomerativeClustering
(n_clusters=2, affinity='euclidean', memory=None,
connectivity=None, compute_full_tree='auto', linkage='ward',
pooling_func=<function mean at 0x174b938>)

n_clusters:目标类别数,默认是2。

affinity:样本点之间距离计算方式,可以是 euclidean (欧式距离),  l1l2manhattan (曼哈顿距离)、 cosine (余弦距离)、 precomputed (可以预先设定好距离),如果参数 linkage 选择“ward”的时候只能使用 euclidean

linkage:链接标准,即样本点的合并标准,主要有 wardcompleteaverage 三个参数可选,默认是 ward 。每个簇(类)本身就是一个集合,我们在合并两个簇的时候其实是在合并两个集合,所以我们需要找到一种计算两个集合之间距离的方式,主要有这三种方式: wardcompleteaverage ,分别表示使用两个集合方差、两个集合中点与点距离之间的平均值、两个集合中距离最小的两个点的距离。

对象/属性

labels_:每个样本点的类别。

n_leaves_:层次树中叶结点树。

密度聚类:

密度聚类与前面两种聚类方式不同,密度聚类无法事先指定类别个数,只能通过去指定每个点的邻域,以及邻域内包含样本点的最少个数。

先来看几个密度聚类里面用到的概念:

  • 邻域:邻域是针对样本集中的每个点而言的,我们把距离某个样本点(可以把该点理解为圆心)距离在r(可理解为圆的半径)以内的点的集合称为该点的邻域。

  • 核心对象:如果某个点的邻域内至少包含MinPts个样本,则该点就可以称为核心对象。

  • 密度直达:如果点A位于点B的邻域中,且点B是核心对象,则称A和B是密度直达。

  • 密度可达:对于点A和B,如果存在一个(或者若干个)点C,其中A到C是密度直达,C到B是密度直达,则A和B就称为密度可达。(你可以理解为C是一个跳板,你可以通过C从点A跳到B)

  • 密度相连:若存在一个点C,使得C到A是密度直达,C到B是密度直达,则称A和B是密度相连的。

具体步骤

  1. 先建立几个集合,一个用来存储核心对象的集合Ω,初始值是空集;再初始化一个值k,用来存放簇的类别数,初始值为0;再新建一个集合Γ,用来存放未被使用的样本,初始值为全部样本集D。

  2. 遍历所有样本集中的每个样本点p,判断其是否满足核心对象的条件,如果满足,则把该点加入到核心对象集合Ω中;如果没有样本点满足核心对象条件,则结束遍历。

  3. 判断核心对象集合Ω是否为空,如果为空,则算法结束;如果不为空,则在集合Ω中随机选取一个样本点,将该点密度可达的所有样本点划分为一个簇,这个簇的样本集合称为Ck ,将簇的类别数k+1,未被使用样本Γ-Ck。

    4.再在剩余的核心对象中重复步骤3,直到没有核心对象为止。

    5.最后输出k个类别的样本集合{C1、C2、……、Ck}。

参数

class sklearn.cluster.DBSCAN
(eps=0.5, min_samples=5, metric='euclidean', metric_params=None,
algorithm='auto', leaf_size=30, p=None, n_jobs=1)

eps:即邻域中的r值,可以理解为圆的半径。

min_samples:要成为核心对象的必要条件,即邻域内的最小样本数,默认是5个。

metric:距离计算方式,和层次聚类中的 affinity 参数类似,同样也可以是 precomputed

metric_params:其他度量函数的参数。

algorithm:最近邻搜索算法参数, autoball_tree (球树)、 kd_tree (kd树)、 brute (暴力搜索),默认是 auto

leaf_size:最近邻搜索算法参数,当 algorithm 使用 kd_tree 或者 ball_tree 时,停止建子树的叶子节点数量的阈值。

p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离,p=2为欧式距离。

对象/属性

core_sample_indices_:核心对象数。

labels_:每个样本点的对应的类别,对于噪声点将赋值为-1。

你还可以看:

SKlearn参数详解—随机森林

Sklearn参数详解—GBDT

Sklearn参数详解—Adaboost

参考文章:

http://www.cnblogs.com/pinard/p/6217852.html

Sklearn参数详解—聚类算法

Sklearn参数详解—聚类算法

本文由张俊红 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


以上所述就是小编给大家介绍的《Sklearn参数详解—聚类算法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance JavaScript

High Performance JavaScript

Nicholas C. Zakas / O'Reilly Media / 2010-4-2 / USD 34.99

If you're like most developers, you rely heavily on JavaScript to build interactive and quick-responding web applications. The problem is that all of those lines of JavaScript code can slow down your ......一起来看看 《High Performance JavaScript》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具