网站建设nayuwang,iis网站怎么做域名绑定,1千万人网站维护成本,wordpress sae图床文章目录一、Mini Batch K-Means 算法原理与实现二、DBSCAN 密度聚类基本原理与实践1. K-Means 聚类算法的算法特性2. DBSCAN 密度聚类基本原理3. DBSCAN 密度聚类的 sklearn 实现除了 K-Means 快速聚类意外#xff0c;还有两种常用的聚类算法。#xff08;1#xff09; 是能…
文章目录一、Mini Batch K-Means 算法原理与实现二、DBSCAN 密度聚类基本原理与实践1. K-Means 聚类算法的算法特性2. DBSCAN 密度聚类基本原理3. DBSCAN 密度聚类的 sklearn 实现除了 K-Means 快速聚类意外还有两种常用的聚类算法。1 是能够进一步提升快速聚类的速度的 Mini Batch K-Means 算法.2 则是能够和 K-Means 快速聚类形成性能上互补的算法 DBSCAN 密度聚类。
# 科学计算模块
import numpy as np
import pandas as pd
# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt
# 自定义模块
from ML_basic_function import *
# K-Means
from sklearn.cluster import KMeans一、Mini Batch K-Means 算法原理与实现
K-Means 算法作为最常用的聚类算法在长期的使用过程中也诞生了非常多的变种典型的如提高迭代稳定性的二分 K 均值法、能够显著提升算法执行速度的 Mini Batch K-Means。由于聚类算法的稳定性可以通过 k-means 以及多次迭代选择最佳划分方式等方法解决此处重点介绍 Mini Batch K-Means 算法。顾名思义所谓 Mini Batch K-Means 算法就是在 K-Means 基础上增加了一个 Mini Batch 的抽样过程并且每轮迭代中心点时不在带入全部数据、而是带入抽样的 Mini Batch 进行计算。即每一轮的迭代操作更新为1 从数据集中随机抽取一些数据形成小批量把他们分配给最近的质心2 根据小批量数据划分情况更新质心。此处可以用梯度下降和小批量Mini Batch梯度下降之间的差异进行类比。在梯度下降的过程中我们带入全部数据构造损失函数相当于带入全部数据进行参数的更新就类似于 K-Means 带入每个簇的全部数据进行中心点位置计算。而在小批量梯度下降的过程中实际上我们是借助小批数据构造损失函数并对参数进行更新就类似于 Mini Batch K-Means 中利用小批数据更新中心点。而 Mini Batch K-Means 的有效性其实也和小批量梯度下降的有效性类似那就是对于一组规律连贯的数据集来说小批量数据能够很大程度反映整体数据集规律因此带入小批量数据进行计算是有效的。此外Mini Batch K-Means 相比 K-Means 的优劣势也和小批量梯度下降对比梯度下降过程类似采用小批数据带入进行计算能够极大缩短单次运算时间因此迭代速度会更快但由于小批量数据还是和整体数据之间存在差异因此每次计算结果的精度不如带入整体数据的计算结果。不过对于 K-Means 是否会落入局部最小值陷阱我们可以通过 k-means 以及重复多次训练模型来解决因此 Mini Batch K-Means 并不用承担跨越局部最小值陷阱的职责所以 Mini Batch K-Means 对比 K-Means其实就相当于牺牲了部分精度来换取聚类速度。而聚类算法毕竟不是有监督学习算法因此如果是面对海量数据的聚类我们是可以考虑牺牲部分精度来换取聚类执行的速度的当然这也要视情况而定。此处所谓小批量聚类精度不足指的是小批量聚类和 K-Means 聚类结果上的差异一般我们会认为 K-Means 聚类是精准的而小批量聚类如果出现了和 K-Means 聚类不同的结果则说明小批量聚类出现了误差也就是精度不足。接下来尝试调用相关评估器进行 Mini Batch K-Means 聚类
from sklearn.cluster import MiniBatchKMeans我们发现MiniBatchKMeans 中部分参数和 K-Means 中参数不同我们针对这些不同的参数来进行解释。
MiniBatchKMeans?NameDescriptionbatch_size小批量抽样的数据量compute_labels在聚类完成后是否对所有样本进行类别计算max_no_improvement当SSE不发生变化时质心最多再迭代多少次init_size用于生成初始中心点的样本数量reassignment_ratio某比例数值越大、样本数越少的簇被重新计算中心点的概率就越大
能够发现MiniBatchKMeans 在参数设置上和 K-Means 有两方面差异1 是在迭代收敛条件上通过查看说明文档我们不难发现MiniBatchKMeans 主要通过 max_no_improvement 和 max_iter 两个参数来控制收敛在默认情况下不采用 tol 参数。其根本原因在于小批量聚类往往需要迭代很多轮因而出实际未收敛、但现两次相邻的迭代结果中 SSE 变化值小于 tol 的情况的概率会显著增加因此此时我们不能以 tol 条件作为收敛条件2 是在控制结果精度上尽管小批量聚类是用精度换速度但仍然提供了可以提升聚类精度的参数也就是 reassignment_ratio当发现聚类结果不尽如人意时可以适当提升该参数的取值。接下来尝试调用相关评估器进行建模
mbk MiniBatchKMeans(n_clusters2)np.random.seed(23)
X, y arrayGenCla(num_examples 20, num_inputs 2, num_class 2, deg_dispersion [2, 0.5])plt.scatter(X[:, 0],X[:, 1],cy)mbk.fit(X)
#MiniBatchKMeans(n_clusters2)# 观察聚类结果
plt.scatter(X[:, 0], X[:, 1], cmbk.labels_)
plt.plot(mbk.cluster_centers_[0, 0], mbk.cluster_centers_[0, 1], o, cred)
plt.plot(mbk.cluster_centers_[1, 0], mbk.cluster_centers_[1, 1], o, ccyan)我们发现在简单数据集的聚类过程中MiniBatchKMeans 和 KMeans 并没有太大差异接下来我们尝试在更大的数据集上来进行聚类测试二者的精度和运算速度
np.random.seed(23)
X, y arrayGenCla(num_examples 1000000, num_inputs 10, num_class 5, deg_dispersion [4, 1])km KMeans(n_clusters5, max_iter1000)
mbk MiniBatchKMeans(n_clusters5, max_iter1000)# 导入时间模块
import time
# K-Means聚类用时
t0 time.time()
km.fit(X)
t_batch time.time() - t0
t_batch
#12.087070941925049# MiniBatchKMeans聚类用时
t0 time.time()
mbk.fit(X)
t_batch time.time() - t0
t_batch
#3.6028831005096436能够发现MiniBatchKMeans 聚类速度明显快于 K-Means 聚类接下来查看二者 SSE 来对比其精度
km.inertia_
#49994316.22276671mbk.inertia_
#50166895.159873486能够发现MiniBatchKMeans 精度略低于 K-Means但整体结果相差不大基本可忽略不计当然这也是因为当前数据集分类性能较好的原因。不过经此也可验证 MiniBatchKMeans 聚类的有效性。一般来说对于 2 万条以上的数据集MiniBatchKMeans 聚类的速度优势就会逐渐显现。当然如果希望更进一步提高迭代速度可以适度减少 batch_size、减少 reassignment_ratio、max_no_improvement 这三个参数不过代价就是聚类的精度可能会进一步降低而如果希望提高精度则可以提升 reassignment_ratio 参数不过相应的运行时间将会有所提升。
二、DBSCAN 密度聚类基本原理与实践
1. K-Means 聚类算法的算法特性
尽管 MiniBatchKMeans 能够有效提高聚类速度、提升聚类效率但从最终聚类效果上来看MiniBatchKMeans 和 K-Means 聚类算法仍然属于同一类聚类——假设簇的边界是凸形的聚类。换而言之就是这种聚类能够较好的捕捉圆形/球形边界直线边界可以看成是大直径的圆形边界而对于非规则类边界则无法进行较好的聚类当然这也是和 K-Means 聚类的核心目的让更相近同一个中线点的数据属于一个簇息息相关。但有些时候更接近同一个中心点的数据却不一定应该属于一个簇例如如下情况
from sklearn.datasets import make_moonsX, y make_moons(200, noise0.05, random_state24)
plt.scatter(X[:,0], X[:,1], c y)其中 make_moons 函数是 datasets 模块中创造数据集的函数默认创建月牙形数据分布的数据集并且 noise 参数取值越小、数据分布越贴近月牙形状。当然此时我们发现上述数据集明显可分为两个簇但两个簇的边界却不是凸型的。此时如果我们用 K-Means 对其进行聚类则会得到如下结果
km KMeans(n_clusters2)
km.fit(X)
#KMeans(n_clusters2)plt.scatter(X[:,0], X[:,1], c km.labels_)
plt.plot(km.cluster_centers_[:,0], km.cluster_centers_[:,1], ro)从上述结果中也能很明显的看出 K-Means 聚类的凸型边界但很明显此时聚类结果并不合理上图中有多处彼此相邻但却不属于同一类的情况出现。此时如果我们希望捕获上述非凸的边界则需要使用一种基于密度的聚类方法也就是我们将要介绍的 DBSCAN 密度聚类。不过此处需要强调的是尽管上述情况主观判断不太合理但最终上述结果是否可用还是需要结合实际业务进行考虑这也是无监督学习算法没有统一的评价标准的具体表现。此处我们只能说 K-Means 算法性能使得其无法捕获不规则边界但这个特性导致的结果好坏无法直接通过数据结果进行得出。
2. DBSCAN 密度聚类基本原理
和 K-Means 依据中心点划分数据集的思路不同DBSCAN 聚类则是试图通过寻找特征空间中点的分布密度较低的区域作为边界并进一步以此划分数据集。正是因为以低密度区域作为边界DBSCAN 最终对数据的划分边界很有可能是不规则的从而突破了 K-Means 依据中心点划分数据集从而使得边界是凸型的限制。当然对于给予密度的聚类算法最重要的是给出密度的相关的定义。在 DBSCAN 中我们通过两个概念和密度密切相关分别是半径eps与半径范围内点的个数num_samples。对于数据集中任意一个点只要给定一个 eps就能算出对应的 num_samples例如对于下述 A 点在一个 eps 范围内num_samples 为 7包括自己。 当然eps 越小、num_samples 越大则说明该点所在区域密度较高。当然我们可以据此设置一组参数即半径eps和半径范围内至少包含多少点min_samples作为评估指标来对数据集中不同的点进行密度层面的分类。例如我们令 epsEps某个数min_samples6并且如果某点在一个 Eps 范围内包含的点的个数大于 min_samples则称该点为核心点core point如下图中的 A 点。而如果某个点不是核心点但是在某个核心点的一个 eps 领域内则称该点为边界点例如下图 B 点。而如果某点既不是核心点也不是边界点则成该点为噪声点如下图的 C 点。 当我们对数据集中的所有点完成上述三类的划分之后接下来我们一个 eps 范围内的核心点化为一个簇并且将边界点划归到一个临近的核心点所属簇中并且抛弃噪声点最终完成数据集整体的划分。而实际上 DBSCAN 整体划分过程就是在将高密度区域划分成一个簇将低密度区域视作不同簇的分界线。很明显在 DBSCAN 聚类中核心参数就是 eps 和 min_samples其不仅可以控制高低密度区域的划分并且可以实际控制聚成几类的结果当 eps 较小而 min_samples 较大时核心点的定义较为严格、同一个簇对簇内的密度要求更高此时更容易划分出多个簇反之划分成的簇的个数可能会更少。接下来我们尝试在 sklearn 进行 DBSCAN 建模试验。
3. DBSCAN 密度聚类的 sklearn 实现
from sklearn.cluster import DBSCANDBSCAN?其中核心参数就是上面介绍的 eps 和 min_samples其他参数都是距离计算相关和最近邻计算相关的参数暂时可以不做考虑。接下来围绕上述月牙型数据进行建模
# 实例化模型
DB DBSCAN(eps0.3, min_samples10)# 训练模型
DB.fit(X)
#DBSCAN(eps0.3, min_samples10)# 查看聚类结果
plt.scatter(X[:,0], X[:,1], c DB.labels_)能够发现DBSCAN 通过捕获低密度区域作为聚类划分的边界线使得最终聚类结果和预想中的情况更加接近。接下来我们尝试在上一小节定义的数据集中执行 DBSCAN 聚类
np.random.seed(23)
X, y arrayGenCla(num_examples 20, num_inputs 2, num_class 2, deg_dispersion [2, 0.5])
plt.scatter(X[:, 0],X[:, 1],cy)DB DBSCAN(eps0.5, min_samples5).fit(X)
plt.scatter(X[:,0], X[:,1], c DB.labels_)DB.labels_
#array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0,
# 0, -1, 0, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1,
# 1, 1, 1, 1, 1, 1])能够发现DBSCAN 舍弃了一些点噪声点标签为 -1并且将数据聚成两类。当然我们也可以尝试减少 eps、提高 min_samples
DB DBSCAN(eps0.4, min_samples6).fit(X)
plt.scatter(X[:,0], X[:,1], c DB.labels_)此时出现了更多的噪声点而如果降低密度要求则会有更多的点被划分到不同的簇中。
DB DBSCAN(eps0.6, min_samples4).fit(X)
plt.scatter(X[:,0], X[:,1], c DB.labels_)至此我们就完成了 DBSCAN 算法从理论到实践的全过程。还是需要值得一提的是由于聚类算法的特殊性导致聚类算法本身的原理和应用难度都远低于有监督学习算法并且在实际进行聚类的过程中选择算法的过程要重于调参的过程而且该过程需要加入实际业务背景作为聚类效果好坏评估的更加具体的指导意见。目前介绍的 K-Means 和 DBSCAN能够在实际分类性能上形成很好的互补建议在使用的过程中先尝试 K-Means如效果不佳则可考虑尝试使用 DBSCAN 进行聚类。