反作弊中的无监督算法2_聚类的4种方式及典型算法

一、从迭代学习的过程,聚类的方式可分为:
1)基于原型聚类
2)基于密度的聚类
3)基于模型:基于概率模型(高斯混合模型)、基于神经网络的;
4)基于层次聚类:

二、从类或簇的形式分
1)以中心定义的簇:规则形的分布,形状与度量的距离有关
2)以密度定义的簇:对形状不敏感,在处理不规则或缠绕等复杂情况、有噪声和离群点的时候比较合适。
3)以联通定义的簇:这类数据集合中的数据点和数据点之间有连接关系,整个数据簇表现为图结构。它同样对数据形状不敏感。

一、基于原型聚类(K-means)

原型 通常指具有连续特征的相似点的质心,或者中心。简单说就是对于一堆待聚类的数据点,先确定最后期望聚成几类,然后挑选几个点作为初始中心点,根据预定的启发式的方法做迭代,直到达到我们的停止条件。在期望聚类数目确定、初始中心点的挑选、噪声和离群点处理,数值以及类别型数据处理方法、引入核方法等具体细节上的不同衍生出了不同的聚类算法,但是毫无疑问最起源的一个算法就是k-means算法,这也是我们这里将要详述的算法[1]。

1) 原理:

  • 随机从样本中挑选k个质心作为初始集群中心
  • 将每个样本分配到最近的质心 μ ( j ) , j ∈ 1 , . . . , k \mu^{(j)},j∈{1,...,k} μ(j)j1,...,k
  • 把质心分配到已分配样本的中心
  • 重复步骤2和3,直到集群赋值不再改变,或者用户达到定义的公差或者最大迭代数。

度量对象之间相似性的方法,欧式距离的平方
距离和相似性的文章:https://cloud.tencent.com/developer/article/1668762

2)优缺点:
优点:极易实现且计算效率也很高。
缺点:必须指定集群数k,k的选择不当会导致性能不良。

3)超参数
分类数量、最大迭代次数

二、基于密度聚类:DBSCAN原理、参数

基于密度的聚类方法:把集群标签分配给样本数据点密集的区域。为了处理以密度为特征的类而设计的算法,最初始的算法为DBSCAN。
1)原理
3种点:
边界点:在半径范围 e p l i s o n eplison eplison内,相邻点的数量比MinPts少
中心点:至少指定数量(MinPts)的相邻点落在以该点为圆心的半径范围内
噪声点:既不是核心点也不是半径点。
步骤:
1)每个核心点或连接的一组核心点组成一个单独的集群(如果核心点在 e p l i s o n eplison eplison的范围内,那么核心点被视为连接的)
2)把每个边界点分配到与其核心点相对应的集群中。

2)优缺点
优点:不需要假设集群呈球形分布,不一定把每个点都分到集群中去,可以去除噪声点。
缺点:
1)数据量不变时,增加数据特征,维数诅咒会增大

3)超参数
最少的数量(MinPts)与半径( e p l i s o n eplison eplison)。

三、基于层次聚类

参考链接:https://blog.csdn.net/ysq96/article/details/107204889
实现louvain算法和GN算法的库:https://www.kuxai.com/article/239

层次聚类进一步地看,又有自下而上和自上而下。

  • 自下而上的算法,最开始时每个样本自成一类,之后将最相似的两类合并称为一个新的类,重复直到满足停止条件,这里的停止条件可能是类的个数,也可能是相似性阈值等等,
  • 自上而下则相反,最开始时将所有样本都分为一类,迭代地将类拆分,直到满足类似的停止条件。

1)louvain

Louvain算法是由底向上的层次聚类算法的一种,目的是优化提升模块度
步骤
1.将图中的每个节点看成一个独立的社区,社区的数目与节点个数相同;
2.对每个节点i,依次尝试把节点i分配到其每个邻居节点所在的社区,计算分配前与分配后的模块度变化ΔQ,并记录ΔQ最大的那个邻居节点,如果maxΔQ>0,则把节点i分配ΔQ最大的那个邻居节点所在的社区,否则保持不变;
3.重复2),直到所有节点的所属社区不再变化;
4.对图进行压缩,将所有在同一个社区的节点压缩成一个新节点,社区内节点之间的边的权重转化为新节点的环的权重,社区间的边权重转化为新节点间的边权重;
5.重复1)直到整个图的模块度不再发生变化

2)GN算法

GN算法是社区发现中的第一个算法,也就是它开启了这个研究领域。它的基本思想是删除掉那些社区之间的连接,那么剩下的每个连通部分就是一个社区。那么问题来了,就是那些是社区之间的边呢?作者巧妙地借助最短路径解决了这个问题,他们定义一条边的介数(betweeness)为网络中所有结点之间的最短路径中通过这条边的数量,而介数高的边要比介数低的边更可能是社区之间的边。其实,这也比较好理解,因为两个社区中的结点之间的最短路径都要经过那些社区之间的边,所以它们的介数会很高。

GN算法每次都删除网络中介数最大的边,直至网络中的所有边都被删除。这样GN的过程对应着一颗自顶向下构建的层次树。在层次树中选择一个合适的层次分割即可。

四、 基于模型的聚类 - 高斯分布(EM方式求解)

进一步地看,主要有基于概率模型的和基于神经网络的;前者主要是认为每一类数据属于一个概率分布,样本集合是由混合概率分布生成的,其中每一个数据点不再是一定属于某一类,而是以概率的形式来看,典型的就是高斯混合模型了,也是我们要详述的;后者指的就是自组织映射神经网络,我们稍后也会简要介绍。

1、高斯混合模型

那么问题来了,怎么从概率模型找出不同的类呢? 分布的组合,我们通过将多个基础分布混合起来近似整体分布,这里的组合方式主要是线性组合。

高斯分布(Gaussian distribution),又名正态分布(Normal distribution),若随机变量X服从一个数学期望为μ、标准方差为σ2的高斯分布,记为:X∼N(μ,σ2)。
在这里插入图片描述

GMM Python实践算法的过程:https://zhuanlan.zhihu.com/p/81255623

它使用EM算法进行迭代:1.选择位置和初始形状 2.循环直至收敛:
E步骤:对于每个点,为每个点分别计算由该混合模型内的每个分量生成的概率。
M步骤:调整模型参数以最大化模型生成这些参数的可能性。
该算法保证该过程内的参数总会收敛到一个局部最优解。

无监督算法的评估方式:

1、kmeans求解最优k值的方法:轮廓系数、肘部法

https://www.jianshu.com/p/335b376174d4
1、轮廓系数
计算集群内聚度,即样本与同一集群内所有其他点之间的平均距离
计算集群分离度,样本与最近集群内所有样本之间的平均距离
轮廓系数,计算集群内聚度 与集群分离度之差,除以两者中较大那一个。

2、肘部法:
随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。
当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数
在这里插入图片描述

2、GMM的最优组件个数:AIC 和 BIC

https://zhuanlan.zhihu.com/p/81255623
为了确定最优组件的个数,需要使用一些分析标准来调整模型可能性。模型中封装了Akaike information criterion (AIC) 或 Bayesian information criterion (BIC)两种评价方法。

参考文章

1)https://zhuanlan.zhihu.com/p/75554749,
2)《Python机器学习》第11章
3)GMM Python实践算法的过程:https://zhuanlan.zhihu.com/p/81255623
4)Louvain参考链接:https://blog.csdn.net/ysq96/article/details/107204889
5)层次聚类Louvain https://yuancl.github.io/2019/05/22/ml/%E5%B1%82%E6%AC%A1%E8%81%9A%E7%B1%BBLouvain/
6)实现louvain算法和GN算法的库:https://www.kuxai.com/article/239
7)kmeans最优k值的确定方法-手肘法和轮廓系数法:https://www.jianshu.com/p/335b376174d4

kmeans、GMM、DBSCAN的sklearn实现

7000条数据
GMM算法:运行时间0.025秒
KMeans算法:运行时间0.023秒
DBSCAN算法:运行时间0.061秒

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
import time

#产生实验数据
from sklearn.datasets import make_blobs
# from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs(n_samples=7000, centers=4,
                       cluster_std=0.5, random_state=2019)
X = X[:, ::-1] #方便画图

GMM算法

from sklearn.mixture import GaussianMixture as GMM
start_gm = time.perf_counter()
gmm = GMM(n_components=3).fit(X) #指定聚类中心个数为4
labels = gmm.predict(X)
print(time.perf_counter() - start_gm)
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')

在这里插入图片描述
KMeans算法

from sklearn.cluster import KMeans
start_km = time.perf_counter()
km = KMeans(n_clusters = 3,
           init = 'random',
           n_init = 10,
           max_iter = 300,
           tol = 1e-04,
           random_state = 0)
y_km = km.fit(X)
print(time.perf_counter() - start_km)
plt.scatter(X[:, 0], X[:, 1], c=y_km.labels_, s=50, cmap='viridis')

在这里插入图片描述
DBSCAN算法

from sklearn.cluster import DBSCAN
start_db = time.perf_counter()
db = DBSCAN(eps = 0.2,
           min_samples = 5,
           metric = 'euclidean')
y_db = db.fit(X)
print(time.perf_counter() - start_db)
plt.scatter(X[:, 0], X[:, 1], c=y_db.labels_, s=50, cmap='viridis')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值