摘要 : 以“为什么需要聚类分析这一问题”作为引入,逐步阐述聚类分析领域是如何发展的。这篇文章主要阐述聚类分析的四类方法:划分方法、层次方法、基于密度的方法和基于网格的方法的基本原理以及它们中的代表算法和实现方式。将聚类算法的设计总结为两大核心:划分过程和相似度量的设计。

1 引言

       聚类分析技术已经发展了近60年,至今该领域依旧非常活跃[1]^{[1]}。聚类分析的地位与其他的机器学习理论,如分类,SVM等,有所不同。首先,聚类分析是一个多学科交织的研究领域,大部分的聚类算法都需要跨域知识(领域知识)的参与,不同角度会产生不一样的聚类结果,因此聚类结果没有统一的衡量标准;其次,聚类分析领域中的算法多如牛毛,但很难对这些算法提出一个总的划分(概念的划分),算法之间存在着重叠概念。以上原因导致了聚类分析理论难以形成系统化的理论体系,以至于有些教科书只会轻描淡写的阐述聚类分析的一些理论。但是不可否认的一点是,聚类分析在现实任务中占据着非常重要的地位。

       本文从聚类分析本质的角度阐述聚类分析的来龙去脉,让读者们能够简单明了的掌握聚类分析的基本概念。在第二部分将会围绕着4个聚类分析的本质问题,即:

  1. 为什么需要聚类分析?
  2. 什么是聚类分析?
  3. 如何进行聚类分析?
  4. 如何评估聚类分析结果?

展开详细的论述;第三部分阐述聚类分析中一些具有代表性算法以及常用的聚类结果评估标准;希望通过本文能让读者对聚类分析有一个全方位的理解。

2 聚类分析的因与果

       不同的研究者对聚类分析这个领域的观察角度是不同的,例如周志华教授的《机器学习》[2]^{[2]}就会从性能度量和距离度量着手,而韩家炜教授[3]^{[3]}则会以数据挖掘的一个工具的角度讲聚类定义和要求。尽管不论从何种角度看待聚类最终我们学到的东西都是一致的,但对于入门者来说这些就有点摸不着头脑了。就比如我当初学习聚类时我更希望教科书能告诉我为什么需要聚类技术?,而后才是如何定义聚类这个概念等等。因此本节从聚类最本质的问题着手,回答聚类分析的因与果。

2.1 聚类分析的因

问题一:为什么需要聚类分析?

       在我们接触到的许多常见的机器学习任务(算法)大部分都是带有标记的(有监督的),如分类与回归。分类与回归问题恐怕是绝大部分学习机器学习理论的人最开始接触到的内容。有监督学习(或者称有先验结果的学习)自然是从业者最愿意看到的一种学习任务,然而在真实的世界中,有人工标记的数据仅仅占很少的一部分,对于大数据时代而言甚至可以忽略不计(可以说无监督(不带标记)的学习才是机器学习的终极目标)。但我们仍然希望探究那些无法或者还未标记的数据的内在数据结构或规律。 聚类分析就此诞生。

问题二:什么是聚类分析?

       从问题一中我们知道了聚类分析的目的,就是要寻找非预先得知的数据分类信息,其中分类信息值得就是我们现在所称呼的“簇”的概念,物以类聚。韩家炜教授[2]^{[2]}用了更为精炼的语言阐述这一概念,即:

Cluster analysis or simply clustering is the process of partitioning a set of data objects (or observations) into subsets. Each subset is a cluster, such that objects in a cluster are similar to one another, yet dissimilar to objects in other clusters. The set of clusters resulting from a cluster analysis can be referred to as a clustering.

聚类分析,是一个把数据对象(或观测)划分成子集的过程。每个子集是一个簇,使得簇中的对象彼此相似,但与其他簇中的对象不相似。由这个过程产生的一系列簇成为一个聚类。

2.1 聚类分析的果

问题三:如何进行聚类分析?

       从问题二聚类分析的定义定义中我们可以提取两个关键的信息点,划分过程与(对象之间)相似与否。实际上聚类分析所有的工作都关注在这两者上,划分过程一般的有:

  • 依距离划分
  • 依层次划分
  • 依密度估计划分
  • 依概率估计划分
  • 依网格划分

不同的划分方式有不同的优缺点(如簇的形状,数据集的大小等),没有包打一切的算法[2]^{[2]}。而对于相似度(一般是特征空间上的相似度,因此也称距离度量),一般有:

  • 有序属性的相似度,常用的欧氏距离(Euclidean distance),闵氏距离(Minkovski distance)等。
  • 无序属性的相似度,如VDM(Value Difference Metric)。

具体可查阅周志华教授的机器学习[2]^{[2]},这里就不再赘述。

问题四:如何评估聚类分析结果?

       在问题三我们知道聚类分析主要关注划分方式与相似度量,自然地评价一个聚类结果的好与坏也主要关注在这两者上,即评估划分结果与聚类的质量。对于估算簇的个数,一般地常用以下两种:

  • 经验法,簇数取n2\sqrt{\frac{n}{2}},其中nn为样本数。
  • 肘方法(elbow method),其中常用的为Gap Statistic[4]^{[4]}的方法,在第三部分将会详细讲解。

对于评估聚类质量,一般地也有两种方法:

但从上文中我们了解一个事实,即使聚类技术发展到如今也没有产生一个绝对统一的衡量标准,因此所有的评估方式都只能充当一种参考,一种从数据角度(统计理论)出发的参考。

       至此,我们已经理解了聚类分析的由来以及功用。接下来我们将对问题三与问题四展开详细的讨论,但由于聚类分析这棵大树的果实非常多,因此我们仅能阐述有代表性的部分,关于它们的变种或改进我们也会稍微提及。

3 聚类算法与评估方法

       至今为止,都没有一个很准确的方法去归类聚类算法,有的研究者将聚类算法大致归并为两类[1]^{[1]}:划分方法(Partition methods)和层次方法(Hierarchical methods),有的会归并为四类[3]^{[3]}:划分方法、层次方法、基于密度的方法(Density-based methods)和基于网格的方法(Grid-based methods),而在最近出现了一种更为细致的[6]^{[6]}划分方式,如图3.1所示:


图3.1: 聚类算法归类方式,取自Rehioui, Idrissi, Abourezq和Zegrari[6]

新增了基于模型的方法(Model-based methods/clustering)的划分方式,但纵使有这些总结性的划分方式,也不见得所代表的算法就是“纯”的(即特性完全属于该分类),例如CLIQUE(CLustering In QUEst)[21]^{[21]}就是同时基于网格和密度的算法,而且算法间也经常互相借鉴思想。本文将会以图1中的归并方式为下文组织结构阐述若干个有代表性的算法(其中基于模型的方法属于高级内容,不在本文的进行阐述),本文所有的代码均可以在附录中找到。

3.1 划分方法

       划分方法,是聚类分析中两大经典的划分过程之一。根据距离度量将nn个观测对象划分成kk个簇(分区),其中knk \leq n。显然当k=nk=n时是划分方法的一种极端情况,此时代价函数最小(为0)。其中以KMeans为代表的算法最为常用,由于划分方法基于距离度量,因此非常擅长发现球状的互斥簇,并且能发现每个簇的代表对象,也常用于压缩。但由于划分方法在计算时通常需要计算每一对对象之间的距离,因此通常在小数据集上表现得很好,但近几年不断有研究者创造出了高伸缩的适合大规模数据集的划分方法,如KMeans的变种MiniBatchKMeans[7]^{[7]}。本节主要介绍KMeans以及另一种围绕中心点划分算法PAM(Partitioning Around Medoids)。

3.1.1 形心划分方法KMeans

       KMeans以簇内变差度量为划分依据,即:
E=i=1kpCidist(p,ci)2(3.1) E = \sum^{k}_{i=1} \sum_{p \in C_i} dist(p, c_i)^2 \tag*{(3.1)}
nn个观测对象划分成以kk个中心点(均值点)为代表的簇C1,C2,,CkC_1, C_2 , \cdots , C_k,其中k2k \geq 2。KMeans算法通常有两个步骤组成:分配(Assigment)更新(Update),一开始 (1) 算法会随机在数据集DD中选择kk个中心点,然后 (2)nn个观测对象依据距离(一般为欧氏距离)最近原则分配给kk个簇,最后 (3) 以启发式的方式迭代计算(式3.1)得到新的kk个中心点,重复步骤(2)(3)直到中心点不再发生改变或者已达到设定的迭代次数,关于KMeans的详细内容可以查阅《KMeans原理、实现及分析》。

       KMeans因此简便易操作的特性,使其逐渐成为了聚类分析任务中的首选聚类器。但KMeans也存在许多缺陷,如无法发现任意形状的簇,在图3.2中,由于KMeans基于欧氏距离导致其不能发现类似同心圆簇或是U型簇。不仅如此,KMeans使用了 平均值(Mean) 这种较为脆弱的统计量还导致了其对离群点(噪点)敏感。而且由于在步骤(1)使用了随机初始化中心点的策略,无法保证KMeans算法能够收敛到全局最优解,因此需要多次运行KMeans,才能的到一个较为满意的聚类结果。


图3.2: KMeans在任意形状簇上的表现

       到目前为止,已有许多KMeans的变种算法被开发出来,用于处理不同需求的聚类任务。当要处理的数据是类别属性(标称属性)时,使用平均值可能是无意义的,这时就可以使用众数(mode)来代替均值,即K-mode算法[8]^{[8]},在Python上可以使用实现了K-mode的第三方库;当需要处理较大规模的数据集时,KMeans就显得抓襟见肘,因此一种行之有效的方法就是选取适当规模的数据集进行多次训练,如MiniBatchKMeans,该算法被scikit-learn作为标准工具实现了;当数据存在噪声或离群数据时,KMeans算法产生的聚类结果与真实结果存在较大的偏差,一种抗噪方案是使用中心划分的技术,使用真实观测点代替均值点,如3.1.2节提到的K-medoids算法。

       即使KMeans本身已经非常成熟,但仍然有许多新的变种相继被开发出来,甚至可以KMeans的历史是聚类分析发展史的缩影。更多的KMeans相关信息可以查阅Jain[1]^{[1]}的文章。

3.1.2 中心划分方法PAM

       为了减少离群点对聚类结果的影响,Kaufman和Rousseeuw[9]^{[9]}于1987年提出了围绕中心划分的方法,一种流行的实现是K-medoids,如图3.3。K-medoids算法与KMeans一样可以分为两大步骤:分配与更新,在开始时 (1) 会随机地在数据集DD中选择kk个中心点oo,然后 (2) 将剩余的所有观测对象依据最近原则分配给每个中心点,形成kk个簇,最后 (3) 随机地选取kk个非中心对象orandomo_{random}尝试代替最原来的中心对象oo,计算orandomo_{random}的平均距离代价差SS,若S<0S<0,则用orandomo_{random}替换原中心对象oo,否则继续寻找,直到遍历完所有对象为止。算法迭代地执行步骤(2)(3)直到中心对象oo不再发生改变。该算法的代码实现可在附录文件中找到。


图3.3: K-medoids算法,取自Han J[3]

       显然,步骤(3)的计算是非常消耗时间的,当n,kn,k都比较大时,其时间计算开销远大于KMeans,虽然K-medoids算法能够有较好的抗噪能力,但很难在大型数据集上有较好的表现。因此Kaufman和Rousseeuw于1990年又提出一种基于抽样的中心划分方法CLARA(Clustering LARge Applications)[10]^{[10]}拟补K-medoids算法处理大型数据的不足,理论上只要抽样数据分布与原数据分布足够接近,是可以找到最佳中心点的,但这就会导致CLARA的聚类结果的好坏依赖抽样的好坏。于是乎Raymond和Jiawei Han提出了更为高效的CLARANS(Clustering Large Applications based on RANdomized Search)[11]^{[11]}算法,基于随机搜索查找全局最优解,该算法在Python上被pyclustering库实现。此外Schubert和Rousseeuw[22]{^{[22]}}在2019年提出了更快速的K-Medoids算法,有兴趣的读者可以自行查阅!

3.1.3 小结

       划分方法的算法步骤大多都是相似的:随机的选择初始点,然后划分簇,不断尝试将一个簇中对象放至另一个簇中来降低代价函数。划分方法通常的划分依据是距离,常用的欧氏距离、马氏距离和闵氏距离等,通过更换距离度量有可能会提高聚类质量。划分方法通常在高斯簇上表现得很好,但不能发现任意形状的簇。

3.2 层次方法

       与划分方法要求聚类结果为互斥簇不同,层次方法更加强调对象间层次关系。如在一个公司的管理体系内,可以分成董事局-总经理-部门经理-业务员,利用“树状”的图形表示这些层次关系,是层次聚类可视化的常用方法。一般地,使用两种划分策略来完成层次聚类:凝聚(Agglomerative)分裂(Divisive),用数据结构的语言来描述,即自底向上和自顶向下。这两者不仅含义相仿,甚至层次聚类里面的许多算法都与数据结构中的构建各种“树”的算法相似。而层次聚类常用的距离度量是有:

:distmin(Ci,Cj)=minpCi,pCj{pp}(3.2):distmax(Ci,Cj)=maxpCi,pCj{pp}(3.3):distmean(Ci,Cj)=mimj(3.4):distavg(Ci,Cj)=1ninjpCi,pCjpp(3.5) \begin{aligned} & 最小距离: dist_{min}(C_i, C_j) = \min_{p \in C_i, p^{'} \in C_j} \{ | p - p^{'}| \} \qquad & (3.2) \\ & 最大距离: dist_{max}(C_i, C_j) = \max_{p \in C_i, p^{'} \in C_j} \{ | p - p^{'}| \} \qquad & (3.3) \\ & 均值距离: dist_{mean}(C_i, C_j) = | m_i - m_j | \qquad & (3.4) \\ & 平均距离: dist_{avg}(C_i, C_j) = \frac{1}{n_i n_j} \sum_{p \in C_i, p^{'} \in C_j} | p - p^{'}| \qquad & (3.5)\\ \end{aligned}

其中如果算法是以最小距离作为划分依据,那么此时算法就会在不同簇之间添加一条线段作为边,形成最大连通图,也称单链接算法(Single-linkage algorithm),形象的理解为就是只有一条连通分量(线)链接所有的簇,如图3.4(b)中的情况所示,数据集被一条线全部链接。而如果是以最大距离作为划分依据,则此时形成的是最大完全图,也称全链接算法(Complete-linkage algorithm),形象的理解为是由多个完全连通的子图构成的簇,如图3.5©所示。本文将在3.2.1阐述凝聚与分裂的层次聚类的基本原理,在3.2.2节探讨其他一些流行的大型层次聚类算法。


图3.4: 单链接与全链接,取自Han J[3]

3.2.1 凝聚与分裂的层次聚类

       凝聚层次聚类采取的是自底向上合并簇的方式,最终将n个节点合并成1个簇(树根root),类似最小生成树算法。只需要nn次迭代即可完成聚类,但弊端在于无法更正以前的操作。凝聚聚类算法也是静态层次聚类算法中最常用的,在scikit-learn等机器学习库中实现了相应的算法类AgglomerativeClustering,周志华教授用了西瓜4.0数据[2]^{[2]}来展示基于全链接的凝聚层次聚类,我们也可以尝试使用其数据来复现结果,使用SciPy提供的dendrogram工具能够使用树状图展示聚类结果,如图3.5所示(除顺序不同外,分类结果一致),横轴对应样本编号,纵轴表示样本距离。


图3.5: 西瓜数据4.0 全链接聚类算法

层次聚类的一个好处是可以根据需要筛选簇,如图3.5中,若簇的粒度为4,则可以得到:

C1={1,2,3,4,21,22,26,29},C2={23,24,25,27,28,30},C3={5,7,9,13,14,16,17},C4={6,8,10,11,12,15,18,19,20} \begin{aligned} C_1 & = \{1, 2, 3, 4, 21, 22, 26, 29\}, \\ C_2 &= \{23, 24, 25, 27, 28, 30\}, \\ C_3 &= \{5, 7, 9, 13, 14, 16, 17\}, \\ C_4 &= \{6, 8, 10, 11, 12, 15, 18, 19, 20 \}。 \end{aligned}

       而分裂的层次聚类要面对的挑战就比凝聚的方式要多,最大的一个挑战是如何将大簇变成一个小簇,拆分成互斥簇的方法是多种多样的,当样本数nn足够大时,问题是NP-Hard的。因此只能牺牲精度采用启发式的算法,这种策略通常无法修改以前的操作,因此分裂的算法在工业界并不常用,在学术界受到的关注也比凝聚型的要少,目前较新的研究成果是Tengke Xiong[12]^{[12]}等人的DHCC(Divisive Hierarchical Clustering of Categorical data)算法用于处理标称属性数据,同时该算法也具有很好的伸缩性,适用于大型数据集。

3.2.2 现代流行的层次聚类

       经典的层次聚类虽然拥有非常好的可视化潜力,但在面对大型数据时就会显得很无力,且每一层一旦划分结束后便不可修改,很有可能会错失最优解。为了针对层次聚类不同方面的局限性,现代的层次聚类技术都采用了复合聚类的策略,即与其他聚类方式结合:划分方法,如BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)[13]^{[13]};或密度方法,如Chameleon算法[14]^{[14]}等。

       BIRCH算法(译为:利用层次结构的平衡迭代归约和聚类),该算法使用聚类特征树(Clustering Feature Tree)来描述一个簇,聚类特征(CF)是一个三维向量:

CF=n,LS,SS(3.6) CF=\langle n, LS, SS\rangle \tag*{(3.6)}

其中nn是一个簇CC的样本数,LSLS(Linear Sum)是n个样本的线性和,SSSS(Square Sum)是n个样本的平方和。使用CF能够很轻易地推导出簇的形心x0x_0,半径R0R_0和直径D0D_0这些统计量:

x0=i=1nxin=LSn(3.7)R0=i=1n(xix0)2n(3.8)D0=i=1nj=1n(xixj)2n(n1)=2nSS2LS2n(n1)(3.9) \begin{aligned} x_0 & = \frac{\sum^{n}_{i=1}x_i}{n} = \frac{LS}{n} \qquad \qquad &(3.7) \\ R_0 & = \sqrt{\frac{\sum^{n}_{i=1}(x_i - x_0)^2}{n}} & (3.8) \\ D_0 & = \sqrt{\frac{\sum^{n}_{i=1} \sum^{n}_{j=1} (x_i - x_j)^2}{n (n-1)}} = \sqrt{\frac{2nSS - 2LS^2}{n(n-1)}} &(3.9) \end{aligned}

其中半径R0R_0和直径D0D_0都反映了簇CC的紧凑程度,且对于任意两个不相交的簇来说,它们的CF是可加的。如C1,C2C_1, C_2是两个不相交的簇,对应的CF为CF1=n1,LS1,SS1,CF2=n2,LS2,SS2CF_1=\langle n_1, LS_1, SS_1 \rangle, CF_2=\langle n_2, LS_2, SS_2 \rangle,合并C1,C2C_1, C_2成为C3C_3,则C3C_3的CF为:CF3=n1+n2,LS1+LS2,SS1+SS2CF_3 = \langle n_1 + n_2, LS_1 + LS_2, SS_1 + SS_2 \rangle。该算法集成了层次聚类与划分聚类的思想,能够适应大规模数据的训练,拟补了凝聚方法的不足。CF树(CF-Tree)是一个高度平衡的树,CF树有两个重要的参数:分支因子(Branch factor)BB和阈值(Threshold)TT,其中BB定义的是非叶结点的子女的最大数目,即最大分支数,而TT定义的是叶节点存储的最大直径RR。两个参数超过任意一个都会产生分裂,类似B+树。BIRCH是一种动态的层次聚类方法,从CF的特征上看该方法能够很好的发现圆形的簇,且支持增量聚类,因此常用于处理流数据聚类任务。scikit-learn也实现了BIRCH算法。

       Chameleon同样也是动态层次聚类算法,结合了密度方法的特点,引入了簇间互连度RI(Ci,Cj)RI(C_i, C_j)和簇间接近度RC(Ci,Cj)RC(C_i, C_j),这两个度量一同描述了Ci,CjC_i, C_j的相似程度。该方法由于结合了密度方法,因此能够发现任意形状的簇,同时在高维数据下比DBSCAN方法的表现要更好。需要深入了解的读者可以查阅Karypis等人[14]^{[14]}的文章。

       此外还有一些基于概率估计的层次聚类方法,如贝叶斯层次聚类[15]^{[15]},使用概率估计的层次聚类不需要寻找合适的连接度量,同时能够很好的处理数据缺失的问题,且基于概率估计的优化目标明确,能够直接求解全局最优解,而不会像前面提到的方法一样陷入局部陷阱。但这类算法的弊端是当数据量比较大时,参数估计的计算开销是巨大的。

3.2.3 小结

       静态的层次聚类有凝聚和分裂两种策略进行聚类,它们都是不可修改的,其中凝聚类的算法比较多,效果也比较好。动态层次聚类如BIRCH等能够更好的适应大型数据集,且由于结合了其他聚类方法,因此性能表现要优于静态层次聚类。

3.3 基于密度的方法

       前面我们阐述了划分方法和层次方法的基本原理,但它们都有一个共同的特点是:都是基于距离度量,因此它们仅能处理圆形簇的情况,类似于图3.6中展示的数据形状它们就很难处理好。如果数据是充满噪声的,那么它们就表现大打折扣。

       为了克服它们无法发现任意簇的缺陷,研究者们重新考虑了簇的划分过程,一个事实是在一个足够大的数据空间中,噪点总是稀疏的,而真正的簇总是稠密的,因此就有了基于密度的划分方法。有了划分策略,那么现在的问题就是如何定义相似度呢?换句话来说到底如何才算是稠密的呢?这一个问题恐怕到目前为止也很难有统一的标准,就如同为划分方法和层次方法寻在一个绝对统一的距离度量一样难。如著名的DBSCAN(Density-Based Spatial Clustering of Application with Noise)[16]^{[16]}算法就是需要用户手动调节密度参数;而为了克服DBSCAN的需要设置全局参数的弊端,Ankerst等人[17]^{[17]}发明了OPTICS(Ordering Points To Identify the Clustering Structure)算法,通过簇排序的方式来辨识稠密的簇,但其仍然要手工设置广泛密度参数;为了完全摆脱参数的限制,Hinneburg和Keim[18]^{[18]}提出了基于密度函数估计的算法DENCLUE(DENsity-based CLUstEring),该算法使用了高斯核函数作为相似度量,使用者不需要考虑经验参数的问题。本节在3.3.1详细介绍DBSCAN的基本原理以及在Python上的使用方法,在3.3.2介绍OPTICS算法,在3.3.3阐述DENCLUE的原理以及其变种算法的发展。


图3.6: 任意形状的簇

3.3.1 DBSCAN算法

       DBSCAN的划分策略是:根据指定的邻域半径ε\varepsilon以及邻域内至少需要包含的对象个数MinPtsMinPts来确定一块稠密区域,密度相连(density-connected)的最大稠密区域构成一个簇(其算法原理类似寻找最大连通块的问题)。从该算法的划分策略上,DBSCAN是可以区分噪声的。在DBSCAN算法中有3个非常重要的概念:

  • 概念1: 核心对象(Core object)
           核心对象指的是该对象oo在其邻域半径ε\varepsilon内存在不少于MinPtsMinPts个对象。核心对象是一个稠密区域的支撑对象,它的作用在于不断的发现密度连通的对象。一个簇可能拥有许多个核心对象。

  • 概念2: 直接密度可达(directly density-reachable)
           对于一个核心对象oo和一个对象pp,如果ppooε\varepsilon-领域内,那么pp是可以从oo直接密度可达的。此时如果pp也是一个核心对象,则也可以说oo是从pp直接密度可达的,如果pp不是核心对象,则错误。直接密度可达的作用在于将可以从核心对象直接密度可达的对象全部纳入考虑范围内,发现稠密区域。

  • 概念3: 密度相连
           对于一个核心对象oo以及两个对象p1,p2p_1, p_2,且p1A1,p2A2p_1 \in A_1, p_2 \in A_2,此时如果p1,p2p_1, p_2都是可以从oo直接密度可达的,那么p1,p2p_1, p_2就是密度相连的。密度相连与密度可达是有区别的,密度相连是等价关系,而密度可达除非两者都是核心对象否则不是等价的。密度相连的作用在于将若干个密度可达的稠密区域连接成一个大的稠密区域,即形成簇。

DBSCAN算法在开始时 (1) 将数据集DD中所有的对象都标记为 “unvisited”,然后 (2) 随机选择DD中一个 “unvisited” 的对象pp,将其标记为 “visited”,接着 (3) 检查ppε\varepsilon-邻域内是否包含MinPtsMinPts个对象,如果是则为pp创建一个新的簇,并且将该邻域内的所有对象加入待观测队列中,如果不是,则标记pp为噪声。最后 (4) 继续从待观测队列或者数据集DD中取出对象pp执行步骤(3),直到队列为空且DD中没有 “unvisited” 的对象为止。伪代码如图3.7所示。


图3.7: DBSCAN伪代码,取自Han J[3]

       在sckit-learn中有相应的DBSCAN算法实现,只需设定邻域半径ε\varepsilon以及邻域阈值MinPtsMinPts即可,图3.8展示了DBSCAN在任意形状簇上的聚类能力。从结果上来看,DBSCAN与预期聚类结果几乎一致。


图3.8: DBSCAN处理任意形状簇

但是正如前面所说,DBSCAN的聚类能力取决于邻域半径ε\varepsilon以及邻域阈值MinPtsMinPts的设定,而这些往往都是经验使然的结果,因此使用DBSCAN算法需要大量的领域知识注入,才能取得一个较为满意的聚类结果。

3.3.2 OPTICS算法

       OPTICS算法,是为了克服DBSCAN的全局参数对于描述数据能力不够而提出来的(因为在高维的数据中,全的参数不一定能很好的描绘簇内结构)。但是它并非完全不使用参数,而是使用一种广泛参数策略,即通过簇排序来寻找合适的簇结构,从而达到聚类的目的。其原理是:较稠密的对象在簇排序中的位置是相对接近的。它与DBSCAN的算法结构大致相同,区别在于它重新定义了簇的相似依据:

  • 概念1: 对象p的核心距离(core-distance of an object p)

           对于任何一个对象pp都会寻找其最小的半径阈值ε\varepsilon^{'}ε\varepsilon^{'}称为pp的核心距离,如果pp不是核心对象(见3.3.1),则pp的核心距离是未定义的。这个核心距离的作用在于尽最大可能去使得pp成为一个核心对象,即自动的发现簇,显然如果pp是噪点,那么pp一定会是为定义的。对于不同的核心对象ppε\varepsilon^{'}值很可能会不同,这是与DBSCAN的区别之一

  • 概念2: 可达距离(reachability-distance)

           对于对象p,op, o,如果oo是核心对象,则pp是从oo密度可达的(这点与DBSCAN一致),此时为pp设置可达距离为max{coredistance(o),dist(p,o)}max\{core-distance(o), dist(p, o)\},如果oo不是核心对象,则oopp无定义。显然,pp很有可能同时拥有对个核心对象的可达距离,OPTICS只关注最短可达距离,这样就能发现最适合的簇结构。可达距离的作用在于对其排序后,能使得距离接近的簇位置相对较近,也就是得出了簇的结构。

另外的一个区别是使用了一个OrderSeeds表的数据结构,这个表维护了各个对象p到其核心对象的最短可达距离。OPTICS还有另一个有趣的用途,就是用于簇结构可视化。对于高维数据来说,我们很难观察其全貌,但OPTICS根据可达距离对所有数据进行排序后将其展示就能看到簇的结构,图3.9中有4个簇C1,C2,C3,C4C_1, C_2, C_3, C_4,使用可达距离(纵轴)与排序结果(横轴)展示簇,可以看出有四块空白区域(凸区域),这能反映簇的真实情况。


图3.9: OPTICS用于数据可视化 取自Ankerst, Breunig和Kriegel[16],有修改

3.3.3 DENCLUE算法基本思想

       无论是DBSCAN或OPTICS都是对半径值ε\varepsilon敏感的,过大的ε\varepsilon会导致簇内不够紧凑,而过小的ε\varepsilon会导致不完全聚类。为了解决这一问题,Hinneburg等人[18]^{[18]}引入了统计学中非参数估计方法——核密度估计,DENCLUE使用高斯核估计待聚类的对象集密度。其局部最大点(即一个解)称为密度吸引点(density-attractor)xx^*,每对密度吸引点之间定义了一条不大于噪声阈值ξ\xi的连通路径,通过这样的密度划分方式发现任意形状的簇。由于篇幅限制,不在这里详细展开DENCLUE算法的讨论。

       DENCLUE发展至今已经衍生出许多变种算法,如Rehioui等人[19]^{[19]}提出的DENCLUE-IM算法,它能够应对更加复杂的数据种类,更多的数据量的聚类任务,感兴趣的读者可以自行研读。

3.3.4 小结

       基于密度的方法能够发现任意形状的簇,但是难免会先于经验困境,即依赖经验参数的设定。但即便如此DBSCAN仍然是任意形状簇聚类任务的首选,因为其过程更可控,而OPTICS常常用于发现簇内结构。

3.4 基于网格的方法

       如果从划分的角度去区分的话,那么前面所提到的所有方法都可以算是以数据驱动的划分方式[3]^{[3]},即关注点在数据本身,从数据上划分出一系列空间。而基于网格的方法则属于空间驱动的划分方式,即从输入空间的角度考虑,将输入空间划分成一系列子空间,再把数据嵌入其中。其划分方法是使用一种多分辨率的网络数据结构,将对象空间量化成有限数目的单元。不同的算法使用不同的相似度量,如果STING(STatistical INformation Grid)[20]^{[20]}使用统计信息作为度量,进行层次聚类,而CLIQUE则是一种子空间的密度聚类。CLIQUE是网格聚类中常用的算法之一。

3.4.1 STING: 统计信息网格聚类方法

       STING利用分层和递归对输入空间进行划分,每一个高层都被划分为多个低层单元,如图3.10中,第(i1)(i-1)层的单元被划分成第ii层的四个单元,每个单元格会预先存储一些来自低层单元格的统计信息,如均值,标准差,最大值和最小值等,使用者来可以预先指定数据的分布情况。最底层可以近似的等于DBSCAN的聚类结果,在产生查询请求时,STING会依照自顶向下的方式依次查询相关的单元格,直到最底层为止。


图3.10: STING层次结构 取自Wang, Yang和Muntz[20]

这种基于网格查询层次聚类的特点使得STING的执行效率非常高,通常在线性时间内就能完成一次聚类信息的查询,不仅如此,STING还支持并行处理与增量更新操作。但其弊端也是很显然易见的,就是依赖于最底层的粒度,如果最底层的粒度很细,则STING模型的层数就会很多,因此处理的代价就会增加,如果最底层的粒度很粗,那么聚类的质量就会大打折扣。这是个两难的问题,因此导致STING的使用场景并不是很多。

3.4.2 CLIQUE: 子空间密度聚类方法

       划分子空间是属性约简的一种常见手段,而随着信息的爆炸式增长需要处理的数据维度越来越高,高维度的信息通常含有许多冗余(不相关)的属性,因此这对在整个空间中寻找合适的簇是一件很难完成的任务,CLIQUE算法基于划分子空间的策略,对若干个子空间进行密度聚类就可以发现稠密的区域,即合适的簇。

       CLIQUE算法有两个运行阶段:

  • 第一阶段(分割与链接): CLIQUE将dd-维数据空间按照每个维度划分成若干个互不重叠的子空间,然后识别密度阈值超过ll的区域,之后迭代地链接各个子空间中重叠的区域。

  • 第二阶段(合成): CLIQUE将第一阶段得到的若干个稠密单元合成为一个最大的稠密区域。使用贪心算法,从任意稠密单元开始找出覆盖这些稠密单元的最大区域,直到这一区域所有的稠密单元都已被覆盖完。循环这一步骤直到所有数据都已被覆盖完全。

虽然CLIQUE能够自动地发现含有高密度簇的子空间,但是它的聚类结果十分依赖密度阈值ll的设定,如图3.11与图3.12分别为l=10l=10l=20l=20的聚类情况,预期的聚类结果应该是2个同心圆的簇,而当l=10l=10时,在图3.11(a)中可见满足这一阈值的稠密区域是非常多的,因此两个簇之间就非常相似,导致最后聚类结果仅有一个簇,如图3.11(b)所示。当重新调整l=20l=20后,在图3.12(a)中可以发现簇间距离增大,CLIQUE能够发现两个最大的稠密区域,最有将它们合成为两个互斥的簇,如图3.12(b)所示。


图3.11: CLIQUE聚类结果,网格密度因子为10

图3.12: CLIQUE聚类结果,网格密度因子为20

合适密度阈值ll是要花费大量实践时间去得到的,因此这也成为了CLIQUE最大的弊端。

3.5 评估聚类质量

       至此,我们已经了解了聚类分析领域几个有代表性的算法,聚类的总体步骤总是相似的,定义划分过程和相似度量。本文所使用的许多数据集实际上都是带有标记的数据,但对于无标记的数据,我们该如何判断这些聚类结果的好坏呢?我们从两个方面着手:(1) 划分的簇的个数是否合适?(2) 聚类质量是否够好?本节我们将讨论这两个问题。

3.5.1 确定簇的数量

       如K-Means等算法需要用户设定预期的簇数,如网格方法需要用户定义粒度等,这些都要求我们对最后的簇数有正确的评估,否则聚类结果没有实际意义。通过前面的介绍我们知道簇的数量是有两个极端的:当簇数为1或为nn时。显然这两者都不可取,但如何在1n1~n之间选定一个合适的数字呢?假如我们使用(式3.1)来衡量聚类的误差和,如图3.13所示,在(a)中我们判断实质上簇数为2是最好的选择,而在(b)中簇数越大,簇内变差就越小,这也解释了为什么当簇为nn时,误差最小。


图3.13: 簇内变差曲线,取自Tibshirani, Walther和Hastie[22]

那么显然误差不能作为衡量簇数的标准,常用的方法有二:(1) 经验法 和 (2) 肘方法(elbow method),经验法一般是取簇数为n2\sqrt{\frac{n}{2}},显然不适合所有场景,而肘方法在大多数情况下是适用的,如图3.13(b)肘显然出现在2的位置,但是当如果数据分布不近似高斯分布的时候呢?这时候肘的位置是不明显的,因为误差曲线会很平滑。因此本节要介绍的是Tibshirani, Walther和Hastie提出的Gap Statistic[4]^{[4]}的方法,该方法使用分布相似来确定最合适的簇数。要想理解这一概念首先我们需要知道一个事实是:如果一个数据集的分布是均匀分布的,那么这个数据集的聚类结果没有任何实际意义,因为均匀分布产生的簇是随机的。Gap Statistic的思想是假设测试在每一个待定的簇数时,都对真实数据的分布与参考分布(reference distribution, 实质上是一个均匀分布)进行对比,随着簇数增加时,真实数据分布的误差函数的值与参考分布的误差函数的值一定是在同时下降的,而在肘方法我们得知在最合适的簇数出现的时候会出现一个拐点,但对于均匀分布对这一簇数并不敏感,因此在此时两个分布的误差函数值就会出现一个全局最大的空隙(Gap),使得最大间隙出现的簇数就是最优解。因此我们就有了间隙函数(Gap)定义:

Gap(k)=1Bnlog(Wkb)log(Wk)(3.10) \tag*{(3.10)} Gap(k) = \frac{1}{B}\sum_{n}log(W^{*}_{kb}) - log(W_k)

其中kk是簇的数量,BB是参考分布的个数,WkW_k是在簇数kk下的误差值,WkbW^{*}_{kb}是在簇数kk下第bb个参考分布的误差值,这一理论的证明可以查阅Tibshirani等人的论文。而Gap Statistic的目标就是使得Gap()Gap(\cdot)最大。具体代码实现见本文附录文件。

       接下来我们可以尝试利用Gap Statistic来评估两个高斯簇合成的数据集和周志华老师的西瓜数据4.0。如图3.14对于两个高斯簇合成的数据集,其最大Gap出现在K=2K=2的位置,符合我们所预期的结果。在图3.15中使用的西瓜数据4.0,最大的Gap出现在K=4K=4的位置,也符合西瓜数据的预期结果[2]^{[2]}


图3.14: 高斯簇与Gap Statistic

图3.15: 西瓜数据4.0与Gap Statistic

3.5.2 评估簇的质量

       在得到了合适的簇数量之后,需要考虑的事情是评估不同聚类算法得出的结果。如对于图3.6的任意形状簇来说,假设我们未知数据的真实分布,那么到底如何选择使用KMEANS、DBSCAN和OPTICS进行聚类呢?一般地,有两种指标对簇的质量进行评估,有监督的评估指标和无监督的评估指标。这些在scikit-learn中的metric包中都有相应的工具。

(1) 有监督的评估指标

       在我们已知簇的标记的时候,这时聚类的评估与分类的评估较为相似,即预测的对象是否都在相应的簇中。使用下面工具就可以轻松的得到聚类结果的得分:

from sklearn.metrics import v_measure_score

在同心圆数据上我们分别测试KMEANS、DBSCAN以及OPTICS的得分:

-------------------- Circle Datasets --------------------
KMeans spended time: 0.03s, and got score 0.00
DBSCAN spended time: 0.01s, and got score 1.00
OPTICS spended time: 0.90s, and got score 1.00
---------------------------------------------------------

分数结果会在[0,1][0, 1]区间,得分为11时说明聚类质量很高。

(2) 无监督的评估指标

       与有监督相比,无监督的评估就较为复杂。我们没有可以参考的对象之后,就仅能从数据本身出发。一种朴素的策略是考虑簇间的分离情况与簇内的紧凑情况。如轮廓系数(silhouette coefficient),轮廓系数有两个重要的指标a(o)a(o)b(o)b(o),其中:

a(o)=oCi,oodist(o,o)Ci1(3.11) \tag*{(3.11)} a(o) = \frac{\sum_{o^{'} \in C_i, o \neq o^{'}} dist(o, o^{'})}{|C_i| - 1}

表示对象o所属的簇的紧凑程度,

b(o)=minCj:1jk,ji{oCjdist(o,o)Cj}(3.12) \tag*{(3.12)} b(o) = \min_{C_j:1 \leq j \leq k, j \neq i } \lbrace \frac{\sum_{o^{'} \in C_j} dist(o, o^{'})}{|C_j|} \rbrace

表示簇间的分离程度。轮廓系数:

s(o)=b(o)a(o)max{a(o),b(o)}(3.13) \tag*{(3.13)} s(o) = \frac{b(o) - a(o)}{\max \{ a(o), b(o)\}}

显然当oo与所属的簇较为紧凑且远离其他簇,即b(o)>a(o)b(o) > a(o)时,s(o)s(o)为正数,越接近1说明聚类质量越高。当oo所属的簇各个对象距离较大且与其他簇相距较近,即b(o)<a(o)b(o) < a(o)时时,s(o)s(o)为正数,越小说明聚类结果越差。在scikit-learn中使用相应的工具:

from sklearn.metrics import silhouette_score

但轮廓系数的一个弊端是会偏向于圆形簇。同样的在同心圆数据集上使用轮廓系数对比KMeans、DBSCAN和OPTICS算法得以下结果:

-------------------- Circle Datasets (without real labels)--------------------
KMeans spended time: 0.04s, and got score 0.35
DBSCAN spended time: 0.01s, and got score 0.11
OPTICS spended time: 0.98s, and got score 0.11
------------------------------------------------------------------------------

此时KMeans的分数要高于我们已知的聚类结果较好的DBSCAN和OPTICS。原因就在于轮廓系数使用了基于距离的度量。

4 总结

       我们已经了解了聚类的缘由,以及聚类分析中几个典型的方法以及它们所对应的代表算法。聚类分析目前仍然是一个富有活力的研究领域,尤其是如今数据具有3V的特点,聚类分析更加看重伸缩能力、处理不同类型数据的能力、增量能力、并行处理能力和抗噪能力等。但不管聚类分析算法如何变化,其核心思想是不会变的,即两大问题:划分过程和相似度量。

参 考 文 献

[1] Jain, A. K. (2010). Data clustering: 50 years beyond K-means. Pattern Recognition Letters, 31(8), 651–666.

[2] 周志华. 机器学习[M]. Qing hua da xue chu ban she, (2016): 197-224.

[3] Han J, Pei J, Kamber M. Data mining: concepts and techniques[M]. Elsevier, (2011): 442-495.

[4] Tibshirani, R., Walther, G., & Hastie, T. (2001). Estimating the number of data clusters via the gap statistic. In Journal of the Royal Statistical Society: Series B (Vol. 63, Issue Part 2, pp. 411–423).

[5] Amigó, Enrique, et al.: A comparison of Extrinsic Clustering Evaluation Metrics based on Formal Constraints. In: Information Retrieval 12.4 (2009): 461-486.

[6] Rehioui, H., Idrissi, A., Abourezq, M., & Zegrari, F. (2016). DENCLUE-IM: A New Approach for Big Data Clustering. Procedia Computer Science, 83(Ant 2016), 560–567.

[7] Sculley D. Web-scale k-means clustering[C]//Proceedings of the 19th international conference on World wide web. 2010: 1177-1178.

[8] Huang, Z.: Clustering large data sets with mixed numeric and categorical values, Proceedings of the First Pacific Asia Knowledge Discovery and Data Mining Conference, Singapore, pp. 21-34, 1997.

[9] Kaufman, L. and Rousseeuw, P.J. (1987), Clustering by means of Medoids.

[10] Kaufman L, Rousseeuw P J. Clustering large applications (Program CLARA)[J]. Finding groups in data: an introduction to cluster analysis, 1990.

[11] Ng, Raymond T., and Jiawei Han. “CLARANS: A method for clustering objects for spatial data mining.” IEEE transactions on knowledge and data engineering 14.5 (2002): 1003-1016.

[12] Xiong, T., Wang, S., Mayers, A. et al. DHCC: Divisive hierarchical clustering of categorical data. Data Min Knowl Disc 24, 103–135 (2012).

[13] Zhang T, Ramakrishnan R, Livny M. BIRCH: an efficient data clustering method for very large databases[J]. ACM Sigmod Record, 1996, 25(2): 103-114.

[14] Karypis G, Han E H, Kumar V. Chameleon: Hierarchical clustering using dynamic modeling[J]. Computer, 1999, 32(8): 68-75.

[15] Katherine A. Heller and Zoubin Ghahramani. 2005. Bayesian hierarchical clustering. In Proceedings of the 22nd international conference on Machine learning (ICML ’05). Association for Computing Machinery, New York, NY, USA, 297–304.

[16] Ester M, Kriegel H P, Sander J, et al. A density-based algorithm for discovering clusters in large spatial databases with noise[C]//Kdd. 1996, 96(34): 226-231.

[17] Ankerst M, Breunig M M, Kriegel H P, et al. OPTICS: ordering points to identify the clustering structure[J]. ACM Sigmod record, 1999, 28(2): 49-60.

[18] Hinneburg, A., & Keim, D. (1998). An Efficient Approach to Clustering in Large Multimedia Databases with Noise. In Proceedings of 4th International Conference in Knowledge Discovery and Data Mining (KDD 98), 58–65.

[19] Rehioui, H., Idrissi, A., Abourezq, M., & Zegrari, F. (2016). DENCLUE-IM: A New Approach for Big Data Clustering. Procedia Computer Science, 83(Ant 2016), 560–567.

[20] Wang, W., Yang, J., & Muntz, R. (1997). STING : A statistical information grid approach to spatial data mining. Proceedings of the 23rd International Conference on Very Large Databases, VLDB 1997, 186–195.

[21] Agrawal, R., Gehrke, J., Gunopulos, D. et al. Automatic Subspace Clustering of High Dimensional Data. Data Min Knowl Disc 11, 5–33 (2005).

[22] Schubert, E., & Rousseeuw, P. J. (2019). Faster k-Medoids Clustering: Improving the PAM, CLARA, and CLARANS Algorithms. Lecture Notes in Computer Science (Including Subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), 11807 LNCS, 171–187.

附        录

  • 本文代码

  • Arbitrary shape datasets

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 吃透设计模式第五篇-适配器模式

    设计模式的重要性对于程序员来说,相当于盾牌对于美国队长,暴风战斧相对于雷神,内裤对于绿巨人(绿巨人最强武器,手动狗头)来说,是必不可少的。 在此,特别总结下23钟设计模式:创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。 结构型模式:适配器模式、桥接…...

    2024/4/24 10:10:25
  2. 012-Web前端-CSS动画-3

    过度与动画#6.2 接上篇 :过度与动画一、过度Transition使用css的属性值在一段时间内平滑的过渡1)指定四个要素:过渡属性,如background、color等过渡所需时间过渡函数,即过渡的速度、方式等过渡延迟时间,表示开始执行的时间2)触发过渡通过用户的行为触发,如点击、悬浮等…...

    2024/4/24 10:10:25
  3. Lifecycle介绍以及源码解析

    一 概述 MVVM 架构是继mvc架构后衍生出的一个新的架构, 最早于 2005 年被微软的 WPF 和 Silverlight 的架构师 John Gossman 提出,并且应用在微软的软件开发中,Android开发中常见的模式,有 MVC,MVP,MVVM。Google15年推出databinding 和 2018年推出 LiveData、ViewModel 库…...

    2024/5/4 22:29:29
  4. servlet监听器Listener

    @TOC 监听的作用 监听一些对象、启动销毁、属性的改变等 如何创建以及销毁监听器 接口ServletContextListener contextInitialized、contextDestroyed 创建监听器 1、新建一个MyServlet类,继承ServletContextListener 2、重写contextInitialized()和contextDestroyed()方法 …...

    2024/4/24 10:10:22
  5. 典型相关分析的认知

    ...

    2024/4/24 10:10:21
  6. ES6语法常用总结

    const声明常量的时候必须赋初始值,否则报错 const声明常量,常量就是值(内存地址)不能变化的值对于简单类型,数值类型、字符串类型。内存地址就是值,不可以更改 对于复杂类型,数组,对象等,内存地址不可以改,但是地址中存的值就可以被改变的。内部的值可以更改但是重新…...

    2024/5/3 23:24:15
  7. linux安装Nexus

    安装 一般远程调用下载软件,一般文件路径类型是http,下载https文件需要一个认证指令,即wget 后面加上--no-check-certificate wget --no-check-certificate https://download.sonatype.com/nexus/3/latest-unix.tar.gz#解压文件 tar -zxvf nexus-3.19.1-01-unix.tar.gz -C .…...

    2024/4/24 10:10:19
  8. 算法设计与分析实践-作业12-图的m着色问题

    算法设计与分析实践-作业12-图的m着色问题 1. 问题:2. 解析: 基本思路:用回溯的算法,以三种颜色为例,建立一棵三叉搜索树,往下遍历,这当中会遇到一些我们已经知道往下搜索不行的结点,此时回溯。 示意图:3. 设计: 伪代码:4. 分析: 假设颜色种数为m,即搜索树为m叉树…...

    2024/4/24 10:10:18
  9. 攻防世界 Crypto进阶 Handicraft_RSA

    1、题目 #!/usr/bin/pythonfrom Crypto.Util.number import * from Crypto.PublicKey import RSA from secret import s, FLAGdef gen_prime(s):while True:r = getPrime(s) #生成一个素数rR = [r] #将r转换为列表t = int(5 * s / 2) + 1for i in range(0, t):R.append(r + get…...

    2024/4/16 8:12:39
  10. MVC+EF的简单增删改查

    一,了解Entity Framework 实体框架(Entity Framework)是微软以ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句当中解放出来。 相对于传统的ADO等各种数据库操纵技术来说,微软的ADO.Net更为先进,它封装了很多底…...

    2024/5/5 0:38:11
  11. Docker笔记--为什么这只鲸鱼这么厉害?一篇文章让你恍然大悟

    显而易见,docker的图标是一只鲸鱼托着一大堆的集装箱 Docker 与虚拟机 虚拟机: 我们传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用。,每一个虚拟机包括应用,必要的二进制和库,以及一个完整的…...

    2024/4/19 12:47:30
  12. mybatisplus多条件并列复杂查询

    在使用mybatisPlus时,有时需要一些负责的sql条件拼接,这时,我们可以利用 QueryWrapper的and(Consumer consumer) 和 or(Consumer consumer) 来对条件进行拼接。 查询条件拼接, 例如:(a and b) OR (c or d) WHERE is_deleted=n AND (refund_sts = ? AND ( (apply_type …...

    2024/4/19 9:00:58
  13. 学习记录—— java 星期几

    题目请输入星期几的第一个字母来判断一下是星期几。 如果第一个字母一样,则继续判断第二个字星期简写:Mon Tues Weds Thurs Fri Sat Sun 以下 import java.util.Scanner; public class Problem26 {public static void main(String[] args) {Scanner scan = new Scanner (Syst…...

    2024/4/24 10:10:17
  14. 批量获取pubmed中文献的标题和摘要

    为了满足快速浏览pubmed中相关文献标题和摘要的需求,写了个简单的爬虫(目前只实现了单个关键词以及多个关键词的and检索),用于批量获取感兴趣文献的标题和摘要。 使用编辑器是python,所编写的爬虫主要使用requests模块+正则表达式。使用requests.get()来获取请求,使用re模…...

    2024/4/24 10:10:18
  15. 操作:NFS服务器的搭建与访问

    本文作为专业课程Linux操作系统管理的项目之记录学习。 ** 实训目的: ** 会安装NFS服务器,能基于匿名用户身份访问NFS服务器共享的文件夹,会在Linux或Windows客户端上访问NFS服务器上的共享资源。 ** 实训环境: ** 每人1台windows物理机,1台RHEL7虚拟机,1台windows7虚拟机…...

    2024/4/24 10:10:19
  16. 排序训练之快排

    初学算法-手撕快排 1:注意两个指针的遍历顺序,先从后往前找(为了使最后的基准数调换满足条件) 2:关与数组里面两个不同位置的数的交换一定要细心 public class SouSiKuaiPai {public static void main(String[] args) {int[] arr = new int[]{2, 5, 6, 7, 8, 9, 2, 10};qu…...

    2024/4/24 10:10:14
  17. Windows内核模糊测试笔记

    扯点别的,在挖了一个多星期软件附带驱动的洞并运气超好的获得2枚CVE 后(一枚大厂的哈哈),总结如下:大多数硬件厂商都会附带驱动 比如打印机啊,声卡显卡 ,路由器,主板等等但是你要对其进行测试百分之90是行不通的。因为你必须要购买他们的产品 否则驱动安装了也启动不了…...

    2024/4/24 10:10:19
  18. 科技人文丨仪式感

    大家好,我是SKODE。有趣的灵魂,聊科技人文。本系列博客地址:传送门M:喂,橙子,我圣诞节没送她礼物说我不在乎她,你说一个洋节有啥好过的?咱不能文化自信一点?一天天不学点好的,累不累?她一天天不学点好的,净跟人家比,别人过,她也过?平常对她那么好,竟然因为一个…...

    2024/4/24 10:10:12
  19. 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!

    自序 这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉淀几年了。 先说下这次面试的结果吧: 到 hr 面的:阿里、美团、滴滴、金山云、每日一淘、火币、宜信、旺店通、黄包车、linkedMe 其他: 小米 (…...

    2024/4/24 10:10:11
  20. 可逆不可逆加密&对称非对称加密

    可逆/不可逆加密&对称/非对称加密 1、加密种类: 1.1、不可逆加密:【Hash加密算法/散列算法/摘要算法】 一旦加密就不能反向解密得到密码原文,一般用来加密用户密码,app的服务器端数据库里一般存储的也都是加密后的用户密码。 在数据传输的过程中,首先把密码类数据经过M…...

    2024/4/24 10:10:10

最新文章

  1. 5月4(信息差)

    &#x1f384; HDMI ARC国产双精度浮点dsp杜比数码7.1声道解码AC3/dts/AAC环绕声光纤、同轴、USB输入解码板KC33C &#x1f30d; 国铁集团回应高铁票价将上涨 https://finance.eastmoney.com/a/202405043066422773.html ✨ 源代码管理平台GitLab发布人工智能编程助手DuoCha…...

    2024/5/5 0:44:25
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Linux学习 - 文件内容操作

    Linux学习 - 文件内容操作 常用的文件内容操作有文件压缩解压缩、文件大小行数统计、文件内容查询等。 gzip: 压缩文件; gunzip: 解压缩文件 # gzip -c 把压缩的文件输出到标准输出 (一般是屏幕) # > 输出重定向&#xff0c;输出写入文件ctehbio:~/ehbio_project$ gzip -…...

    2024/5/3 15:42:21
  4. 前端 js 经典:字符编码详解

    前言&#xff1a;计算机只能识别二进制&#xff0c;开发语言中数据类型还有数字&#xff0c;字母&#xff0c;中文&#xff0c;特殊符号等&#xff0c;都需要转化成二进制编码才能让技术机识别。 一. 编码方式 ACSLL、Unicode、utf-8、URL 编码、base64 等。 1. ACSLL 对英语…...

    2024/5/4 10:30:35
  5. composer常见错误解决

    在Java中&#xff0c;常见的问题和解决方法包括&#xff1a; 内存不足错误&#xff1a;Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决&#xff0c;可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...

    2024/4/30 3:27:03
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/4 18:20:48
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/4 2:59:34
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57