聚类分析方法(一)
目录
- 一、聚类分析原理
- (一)聚类分析概述
- (二)聚类的数学定义
- (三)簇的常见类型
- (四)聚类框架及性能要求
- (五)簇的距离
- 二、划分聚类算法
- (一)划分聚类框架
- (二)划分聚类的质量
- (三)k-means算法
- (四)空簇与离群点
- (五)k-中心点算法
聚类分析 (clustering analysis) 是数据挖掘研究最为活跃、内容最为丰富的领域之一,其目的是通过对数据的深度分析,将一个数据集拆分成若干个子集 (每个子集称为一个簇,cluster),使得同一个簇中数据对象 (也称数据点) 之间的距离很近或相似度较高,而不同簇中的对象之间距离很远或相似度较低。
一、聚类分析原理
(一)聚类分析概述
聚类分析 (clustering analysis) 就是根据某种相似性度量标准,将一个没有类别标号的数据集 S S S (表10-1) 直接拆分成若干个子集 C i ( i = 1 , 2 , ⋯ , k ; k ≤ n ) C_i (i=1,2, \cdots,k; k≤n) Ci(i=1,2,⋯,k;k≤n),并使每个子集内部数据对象之间相似度很高,而不同子集的对象之间不相似或相似度很低。每个子集 C i C_i Ci 称为一个簇,所有簇构成的集合 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1 ,C_2, \cdots,C_k\} C={C1,C2,⋯,Ck} 称为数据集 S S S 的一个聚类。
聚类分析与分类规则挖掘不同,前者是一种探索性的分析过程。聚类分析的数据集 S S S 中没有已知的先验知识 (即对象的类别标号) 来指导,它要求直接从 S S S 本身出发,依据某种相似度标准为 S S S 的每个对象给出类别标号。因此,聚类分析也称为无监督的分类 (unsupervised classification)。对于同一个数据集,就算使用同一个聚类算法,如果选择了不同的“相似度”标准,也常常会得到不同的聚类结果。
聚类分析作为数据挖掘的一个热门研究领域,在帮助人们获取潜在的、有价值的信息并过滤掉无用的信息方面起到了至关重要的作用。
目前,数据聚类技术在许多领域都已得到实际应用。在生物学的研究中,科学家们可以通过聚类算法来分析大量的遗传信息,从而发现哪些基因组具有类似的功能,以此获得对种群的认识;在信息检索方面,聚类算法可以将搜索引擎返回的结果划分为若干个类,从每个类中获取查询的某个特定方面,从而产生一个类似树状的层次结构来帮助用户进一步探索查询结果;在医学领域的研究中,一种疾病通常会有多个变种,而聚类分析可以根据患者的症状描述来确定患者的疾病类型,以此提高诊断效率和治疗效果;在气象领域,聚类已经被用来发现对气候具有明显影响的海洋大气压力模式;在电子商务中,聚类分析可以对用户群体进行细分,并针对不同类型的用户进行不同的营销策略,以提升销售额。
(二)聚类的数学定义
定义10-1 设有数据集 S = { X 1 , X 2 , ⋯ , X n } S=\{X_1 ,X_2, \cdots,X_n\} S={X1,X2,⋯,Xn},其中 X i X_i Xi 为 d d d 维向量 (表10-1), s ( X , Y ) s(X,Y) s(X,Y) 为定义在 S S S 上的相似度函数。若利用函数 s ( X , Y ) s(X,Y) s(X,Y) 可将 S S S 拆分成 k k k 个子集 C i C_i Ci,并记 C = { C 1 , C 2 , ⋯ , C k } ( k ≤ n ) C=\{C_1 ,C_2, \cdots,C_k\}(k≤n) C={C1,C2,⋯,Ck}(k≤n),使 C C C 满足以下条件:
(1) C i ≠ ∅ ( i = 1 , 2 , ⋯ , k ) C_i ≠ \varnothing (i=1 ,2, \cdots,k) Ci=∅(i=1,2,⋯,k) (10-1)
(2) C 1 ∪ C 2 ∪ ⋯ ∪ C k = S C_1∪ C_2∪\cdots∪C_k =S C1∪C2∪⋯∪Ck=S (10-2)
(3) C i ∩ C j = ∅ ( i = 1 , 2 , ⋯ , k ; i ≠ j ) C_i∩C_j= \varnothing (i=1 ,2, \cdots,k; i≠j) Ci∩Cj=∅(i=1,2,⋯,k;i=j) (10-3)
(4) ∀ X , Y ∈ C i , s ( X , Y ) = 1 \forall X,Y\in C_i, s(X,Y)=1 ∀X,Y∈Ci,s(X,Y)=1 或接近 1 1 1; ∀ X ∈ C i \forall X\in C_i ∀X∈Ci 和 Y ∈ C j ( i ≠ j ) , s ( X , Y ) = 0 Y\in C_j(i≠j) ,s(X,Y)=0 Y∈Cj(i=j),s(X,Y)=0 或接近 0 0 0;则称 C i C_i Ci 为 S S S 由 s ( X , Y ) s(X,Y) s(X,Y) 生成的一个簇 (cluster),简称簇 C i ( i = 1 , 2 , … ⋯ , k ) C_i (i=1 ,2, …\cdots,k) Ci(i=1,2,…⋯,k);同时,称 C C C 为 S S S 由 s ( X , Y ) s(X,Y) s(X,Y) 生成的一个划分聚类 (partitional clustering),简称 C C C 为 S S S 的划分聚类,或称为互斥 (exclusive) 的聚类。
(2)+ 如果将公式 (10-2) 改为
C 1 ∪ C 2 ∪ ⋯ ∪ C k ⊂ S (10-4) C_1∪C_2∪\cdots∪C_k \subset S\tag{10-4} C1∪C2∪⋯∪Ck⊂S(10-4) 而其它假设条件都不变,则称 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1 ,C_2, \cdots,C_k\} C={C1,C2,⋯,Ck} 为 S S S 的部分聚类 (partial clustering)。这时, S S S 中的某些对象没有分配到任何簇中。
(2)++ 如果将定义10-1中的公式 (10-2) 改为
C 1 ∪ C 2 ∪ ⋯ ∪ C k ⊆ S (10-5) C_1∪C_2∪\cdots∪C_k\subseteq S \tag{10-5} C1∪C2∪⋯∪Ck⊆S(10-5) 且至少存在两个簇 C i ∩ C j ≠ ∅ C_i∩C_j≠\varnothing Ci∩Cj=∅,而其它假设不变,则称 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1 ,C_2, \cdots,C_k\} C={C1,C2,⋯,Ck} 为 S S S 的非互斥聚类 (non-exclusive clustering),也称 C C C 为重叠聚类 (overlapping clustering)。
相似度函数 s ( X , Y ) s(X,Y) s(X,Y),通常可使用之前介绍的某种相似度,但一般都需要根据实际数据集 S S S 的属性类型来选择或确定;可选择距离或相异度 d ( X , Y ) d(X,Y) d(X,Y) 来作为相似性的度量标准,这时只要将定义10-1中的第(4)条改为“对 X , Y ∈ C i , d ( X , Y ) = 0 X,Y\in C_i, d(X,Y)=0 X,Y∈Ci,d(X,Y)=0 或接近 0 0 0,对 X ∈ C i X\in C_i X∈Ci 和 Y ∈ C j ( i ≠ j ) , d ( X , Y ) Y\in C_j(i≠j) ,d(X,Y) Y∈Cj(i=j),d(X,Y) 很大”即可。还可以定义其它广义的“相似度”,比如簇内点的密度,或要求每个簇构成某种形状等。聚类分析不仅与数据集 S S S 有关,而且与所选择的相似性度量有关。
在实际应用中,对于一个给定的数据集 S S S,如何选择恰当的相似性度量却没有普遍适用的标准,仍是一个困难而富有挑战性的问题。
例10-1 假设数据集 S S S 有20个点,其在平面上位置如图10-1(1)所示。我们可将数据集 S S S 分别交给甲、乙、丙3个同学,希望他们自己选择恰当的相似度标准对 S S S 进行聚类。
虽然三个同学的聚类结果不一样,但老师在评分时给三个同学都是满分,因为都是在各自选定的相似度标准下正确的聚类结果。
(三)簇的常见类型
聚类分析旨在发现“有用”或“有意义”的簇,这里的有用性或意义完全由数据挖掘目的来决定。虽然实际存在有很多种类的簇,但数据挖掘的实践表明,无论多么奇怪的簇在实际应用中都可能是有用的。
簇的类型一般可从簇的形状和簇间关系来划分。
1、簇的形状
从簇的形状主要分为类球状 (凸形) 的簇,非球状的簇两种类型。
(1)类球状的簇 (图10-2),一般是聚类算法使用距离函数所产生的簇,而非球状的簇,通常由基于密度或基于原型的聚类算法获得的簇。
(2)非球状的簇,通常由基于密度或基于原型的聚类算法获得的簇。
2、簇间关系
1)明显分离的簇
簇中每个数据对象到同簇中其它对象的距离,比到不同簇中任意对象的距离更近;下图中不同簇中任意两点之间的距离都大于簇内任意两点之间的距离。当然,明显分离的簇不必是球形的,也可以是其它任意的形状。
2)基于原型的簇
所谓原型其实就是簇中最具代表性的点。对连续属性的数据,簇的原型通常就是质心,即簇中所有点的平均值。当数据包括分类属性时,簇的原型通常是中心点,即簇中最有代表性的点。对于许多数据类型,原型可以视为最靠近中心的点,因此,通常把基于原型的簇看作基于中心的簇 (center-based cluster),下图就是一个基于中心的簇的例子。
3)基于连片的簇 (contiguity-based cluster)
簇中两个相邻对象的距离都在指定的阈值之内即将其归为同一个簇。当簇的形状不规则或缠绕,且数据集没有噪声时,用这种方式来定义簇会收到很好的聚类效果。如果存在噪声,其聚类效果就不一定理想。图中的哑铃状簇,就是由线状 (噪声) 连接两个球状簇形成的一个簇。
4)基于密度的簇 (density-based cluster)
基于密度的簇由对象间相对稠密的区域组成,且其周围是低密度的区域。一般通过指定簇中任何一个对象周围区域内最少点数 (即密度) 来实现。下图有3个基于密度的簇,它们是在哑铃状图中添加了一些低密度的对象创建的。由于增加了低密度噪声点的缘故,原先的S状、线状簇不能形成较稠密的簇而被当作噪声排斥在外。当簇的形状不规则或互相盘绕,并且有噪声和离群点时,使用基于密度的簇定义通常得到较理想的聚类效果。
5)基于概念的簇
即具有某种“共同性质”的数据对象集合。比如,离相同的质心或中心点最近,或组成三角形、梯形,或圆环状 (重叠聚类) 等。
(四)聚类框架及性能要求
算法10-1 聚类算法框架
输入:数据集 S S S,相似度 s s s,以及簇的个数 k k k;
输出:聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck};
(1)任意产生 S S S的一个聚类 C C C
(2)以 s s s为相似性标准对 S S S循环更新聚类 C C C的簇 C 1 , C 2 , ⋯ , C k C_1,C_2,\cdots,C_k C1,C2,⋯,Ck,直到满意为止。
其中,“满意”的标准一般是簇内对象之间的距离很近,簇与簇之间的距离很远等相似度或相异度。
- 对数据集的可伸缩能力:不仅在小数据集上聚类效果好,而且在大数据集上的聚类也要效率高、效果好。
- 处理混合属性的能力:能够处理同时含有二元、分类、序数和数值等属性的数据集。
- 发现任意形状簇的能力:不仅能够发现凸型球状的、大小和密度相近的簇,也能够发现一些特殊形状的簇。
- 聚类参数自适应能力:对用户输入初始参数,如簇的个数 k k k,密度半径 ε \varepsilon ε 和最少点数 MinPts 等具有自适应能力,可以减少甚至克服初始参数对聚类的结果影响,以保障聚类的质量。
- 噪声数据的处理能力:以减轻或者消除“噪声”数据影响,提高聚类结果的质量。
- 数据输入顺序的适应能力:即适应数据集任意输入顺序的能力,有助于提高聚类结果的稳定性。
- 处理高维数据的能力:不仅能高效地处理2-3维的数据集,对高维数据 (几十个甚至更多的属性) 也能高效运行。
- 带约束条件的聚类能力:即聚类算法不仅能满足客户特定的约束条件,又能得到具有良好聚类特性的簇。
值得注意的是,在实际的算法设计中,要求一个聚类算法同时具备以上所有能力是不现实的,如果能够同时具备其中的3-4个能力已算是相对优质的算法了。
(五)簇的距离
数据集 S S S 的一个聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck} 的质量,包括每个簇 C i C_i Ci 的质量和 C C C 的总体质量。前者用簇内距离来刻画,后者用簇间距离来衡量。
1、簇内距离
1)簇的直径
簇 C i C_i Ci 中任意两个对象之间欧氏距离的最大者,也称为簇外径,并记作
Φ ( C i ) = m a x { d ( X , Y ) ∣ X , Y ∈ C i } (10-6) \Phi(C_i)=max\{d(X,Y) | X,Y\in C_i\}\tag{10-6} Φ(Ci)=max{d(X,Y)∣X,Y∈Ci}(10-6) 2)簇的内径
簇 C i C_i Ci 中任意两个对象之间欧氏距离的最小者,并记作
ϕ ( C i ) = m i n { d ( X , Y ) ∣ X , Y ∈ C i } (10-7) \phi(C_i)=min\{d(X,Y) | X,Y\in C_i\}\tag{10-7} ϕ(Ci)=min{d(X,Y)∣X,Y∈Ci}(10-7)3)簇的平均距离
簇 C i C_i Ci 中任意两个对象之间欧氏距离之和与 C ∣ C i ∣ 2 C i C^2_{|C_i|}C_i C∣Ci∣2Ci 中元素个数取2的组合数比值,并记作
d a ( C i ) = 1 C ∣ C i ∣ 2 ∑ X , Y ∈ C i d ( X , Y ) (10-8) d_a(C_i)=\frac{1}{C^2_{|C_i|}}\sum_{X,Y\in C_i}d(X,Y)\tag{10-8} da(Ci)=C∣Ci∣21X,Y∈Ci∑d(X,Y)(10-8) 4)簇的中心距离和
设 X ‾ i \overline{X}_i Xi 为簇 C i C_i Ci 的中心点,簇中每个点到中心点的距离之和,并记作
d σ = ∑ X ∈ C i d ( X , X ‾ i ) (10-9) d_{\sigma}=\sum_{X\in C_i}d(X,\overline{X}_i)\tag{10-9} dσ=X∈Ci∑d(X,Xi)(10-9)
2、簇间距离
设有两个簇 C i C_i Ci 和 C j C_j Cj,且对于任意 X ∈ C i X\in C_i X∈Ci, Y ∈ C j Y\in C_j Y∈Cj,其距离为 d ( X , Y ) d(X,Y) d(X,Y),则两个簇之间的距离 d ( C i , C j ) d(C_i, C_j) d(Ci,Cj),一般可采用以下几种方式来定义。
1)簇间最小距离
以两个簇中任意两个元素距离的最小者 (smallest),即
d s ( C i , C j ) = m i n { d ( X , Y ) ∣ X ∈ C i , Y ∈ C j } (10-10) d_s(C_i,C_j)=min\{d(X,Y) | X\in C_i,Y\in C_j\}\tag{10-10} ds(Ci,Cj)=min{d(X,Y)∣X∈Ci,Y∈Cj}(10-10) 2)簇间最大距离
以两个簇中任意两个元素距离的最大者 (largest) ,即
d l ( C i , C j ) = m a x { d ( X , Y ) ∣ X ∈ C i , Y ∈ C j } (10-11) d_l(C_i,C_j)=max\{d(X,Y) | X\in C_i,Y\in C_j\}\tag{10-11} dl(Ci,Cj)=max{d(X,Y)∣X∈Ci,Y∈Cj}(10-11) 3)簇间中心距离
以两个簇 C i C_i Ci 和 C j C_j Cj 的中心点 X ‾ i \overline{X}_i Xi 和 X ‾ j \overline{X}_j Xj 之间的距离作为两个簇之间的距离度量,即
d c ( C i , C j ) = d ( X ‾ i , X ‾ j ) (10-12) d_c(C_i,C_j)=d(\overline{X}_i,\overline{X}_j)\tag{10-12} dc(Ci,Cj)=d(Xi,Xj)(10-12) 其中 C i C_i Ci 的中心定义为
X ‾ i = 1 ∣ C i ∣ ∑ X ∈ C i X (10-13) \overline{X}_i=\frac{1}{|C_i|}\sum_{X\in C_i}X\tag{10-13} Xi=∣Ci∣1X∈Ci∑X(10-13) 簇间中心距离也称为均值距离。值得注意的是,簇中心常常不是该簇中的一个对象 (虚拟对象)。
4)簇间平均距离
以两个簇中任意两个元素距离的平均值作为两个簇之间的一种距离度量,即
d a ( C i , C j ) = 1 ∣ C i ∣ ∣ C j ∣ ∑ X ∈ C i ∑ X ∈ C j d ( X , Y ) (10-14) d_a(C_i,C_j)=\frac{1}{|C_i||C_j|}\sum_{X\in C_i}\sum_{X\in C_j}d(X,Y)\tag{10-14} da(Ci,Cj)=∣Ci∣∣Cj∣1X∈Ci∑X∈Cj∑d(X,Y)(10-14) 实际应用中可以用 d ( X , Y ) 2 d(X,Y)^2 d(X,Y)2 替换 d ( X , Y ) d(X,Y) d(X,Y)。
5)离差距离
令簇的中心距离平方和记作
r 2 ( C i ) = ∑ X ∈ C i d ( X , X ‾ i ) 2 (10-15) r^2(C_i)=\sum_{X\in C_i}d(X,\overline{X}_i)^2\tag{10-15} r2(Ci)=X∈Ci∑d(X,Xi)2(10-15) 对于任意两个簇 C i C_i Ci, C j C_j Cj,如果令 C i + j = C i ∪ C j C_{i+j}=C_i\cup C_j Ci+j=Ci∪Cj,则簇 C i C_i Ci 与簇 C j C_j Cj 之间的平方和离差定义为
d 2 ( C i , C j ) = r 2 ( C i + j ) − r 2 ( C i ) − r 2 ( C j ) (10-16) d^2(C_i,C_j)=r^2(C_{i+j})-r^2(C_i)-r^2(C_j)\tag{10-16} d2(Ci,Cj)=r2(Ci+j)−r2(Ci)−r2(Cj)(10-16) 并简称 d ( C i , C j ) d(C_i,C_j) d(Ci,Cj) 为簇 C i C_i Ci 与 C j C_j Cj 的离差距离。
二、划分聚类算法
(一)划分聚类框架
由定义10-1可知,数据集 S S S 的划分聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck} 有两个特点:
(1)每个簇至少包括一个数据对象;
(2)每个数据对象属于且仅仅属于一个簇;
将聚类算法框架10-1具体化,可得划分聚类算法框架,如下。
算法10-2:划分聚类算法框架
输入:数据对象集 S S S和正整数 k k k
输出:“好”的划分聚类 C C C
(1)生成初始划分聚类 C ( 0 ) = { C 1 , C 2 , ⋯ , C k } C^{(0)}=\{C_1,C_2,\cdots,C_k\} C(0)={C1,C2,⋯,Ck}
(2)REPEAT
(3)依照某种评价函数 f f f改变 C ( i ) C^{(i)} C(i),使新划分聚类 C ( i + 1 ) C^{(i+1)} C(i+1)比 C ( i ) C^{(i)} C(i)更好
(4)UNTIL C ( i + 1 ) C^{(i+1)} C(i+1)没有改变为止
(5)将 C ( i + 1 ) C^{(i+1)} C(i+1)作为聚类 C C C输出
(二)划分聚类的质量
1、聚类C的簇内差异
设聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck},则它的簇内差异可选择某种距离函数,通过计算簇内每个对象到其中心点距离的平方和来表示,即聚类 C C C 的簇内差异定义为
w ( C ) = ∑ i = 1 k w ( C i ) = ∑ i = 1 k ∑ X ∈ C i d ( X , X ‾ i ) 2 (10-17) w(C)=\sum^{k}_{i=1}w(C_i)=\sum_{i=1}^{k}\sum_{X\in C_i}d(X,\overline{X}_i)^2\tag{10-17} w(C)=i=1∑kw(Ci)=i=1∑kX∈Ci∑d(X,Xi)2(10-17) w ( C ) w(C) w(C) 从总体上评价聚类 C C C 中每个簇的紧凑性,在有些文献资料中也称为误差平方和 (sum of the squared error, SSE),并用 S S E ( C ) SSE(C) SSE(C) 表示。
2、聚类C的簇间差异
用 C C C 中任意两个簇中心之间的距离平方和来刻画聚类 C C C 的簇间疏远性,并记作
b ( C ) = ∑ 1 ≤ j < i ≤ k d ( X ‾ j , X ‾ i ) 2 (10-18) b(C)=\sum_{1≤j<i≤k}d(\overline{X}_j,\overline{X}_i)^2\tag{10-18} b(C)=1≤j<i≤k∑d(Xj,Xi)2(10-18) 由于 C C C 有 k k k 个簇,因此公式(10-18)右边是 k ( k + 1 ) / 2 k(k+1)/2 k(k+1)/2 个距离平方之和。
3、聚类C的评价函数
为了同时评价聚类 C C C 的每个簇是紧凑的,以及不同簇之间是疏远的,即评价聚类 C C C 的总体质量,其基本思想是同时考虑聚类 C C C 的簇内差异 w ( C ) w(C) w(C) 以及簇间差异 b ( C ) b(C) b(C) 的影响。因此,可考虑使用以下几种形式的评价函数作为聚类的质量标准。
(1) f ( C ) = w ( C ) f(C)=w(C) f(C)=w(C)
(2) f ( C ) = 1 / b ( C ) f(C)=1/b(C) f(C)=1/b(C)
(3) f ( C ) = w ( C ) / b ( C ) f(C)=w(C)/b(C) f(C)=w(C)/b(C)
(4) f ( C ) = α w ( C ) + β ( 1 / b ( C ) ) f(C)= \alpha w(C)+\beta(1/b(C)) f(C)=αw(C)+β(1/b(C)),其中 α , β \alpha,\beta α,β 为指定的权值,且 α + β = 1 \alpha+\beta=1 α+β=1。
(5) F ( C ) = ( w ( C ) , 1 / b ( C ) ) F(C)=(w(C),1/b(C)) F(C)=(w(C),1/b(C)),这里的 F F F 为二元目标函数,或多目标函数。
因此,算法10-2就是寻找使 f ( C ) f(C) f(C) 达到最小,或使 F ( C ) F(C) F(C) 达到最小的聚类 C C C,即是我们需要的好聚类。
(三)k-means算法
1、算法描述
k-means算法也称k-平均算法,它采用距离作为相异度的评价指标,以簇内差异函数 w ( C ) w(C) w(C) 作为聚类质量的优化目标函数,即将所有数据对象到它的簇中心点的距离平方和作为目标函数,算法寻找最优聚类的策略是使目标函数达到最小值 (簇中心不变化等价于 w ( C ) w(C) w(C)达最小)。
算法10-3 基本k-平均算法
输入:数据对象集 S = { X 1 , X 2 , ⋯ , X n } S=\{X_1,X_2,\cdots,X_n\} S={X1,X2,⋯,Xn}和正整数 k k k
输出:划分聚类 C = { C 1 , C 2 , ⋯ , G k } C=\{C_1,C_2,\cdots,G_k\} C={C1,C2,⋯,Gk}
(1)初始步:从 S S S中随机选择 k k k个对象作为 k k k个簇的中心,并将它们分别分配给 C 1 , C 2 , ⋯ , C k C_1,C_2,\cdots,C_k C1,C2,⋯,Ck
(2)REPEAT
(3)将 S S S的每个对象 X i X_i Xi归入距中心最近的那个簇 C j C_j Cj
(4)重新计算每个簇 C j C_j Cj的中心,即每个簇中对象的平均值
(5)Until所有簇中心不再变化
2、计算实例
例10-2 设数据集 S = { ( 1 , 1 ) , ( 2 , 1 ) , ( 1 , 2 ) , ( 2 , 2 ) , ( 4 , 3 ) , ( 5 , 3 ) , ( 4 , 4 ) , ( 5 , 4 ) } S=\{(1,1), (2,1), (1,2), (2,2), (4,3), (5,3), (4,4), (5,4)\} S={(1,1),(2,1),(1,2),(2,2),(4,3),(5,3),(4,4),(5,4)},令 k = 2 k=2 k=2, 试用k-平均算法将 X X X 划分为 k k k 个簇。
解:数据集 S S S 可表示为一张二维表;而每个对象在平面上的相对位置可用下图所示:
因为 k = 2 k=2 k=2,故 S S S 的聚类 C = { C 1 , C 2 } C=\{C_1,C_2\} C={C1,C2},由k-平均算法得循环计算如下:
(1)初始步:任选 X 1 = ( 1 , 1 ) , X 3 = ( 1 , 2 ) X_1=(1,1), X_3=(1,2) X1=(1,1),X3=(1,2) 分别作为簇的中心,即 C 1 = { X 1 } C_1=\{X_1\} C1={X1} 和 C 2 = { X 3 } C_2=\{X_3\} C2={X3};
(2)第一轮循环。
注意到 X 1 , X 3 X_1,X_3 X1,X3 已分配到 C 1 C_1 C1 和 C 2 C_2 C2,因此
① 计算 X 2 X_2 X2 的归属:因为 d ( X 2 , X 1 ) 2 = 1 , d ( X 2 , X 3 ) 2 = 2 d(X_2,X_1)^2= 1, d(X_2,X_3)^2=2 d(X2,X1)2=1,d(X2,X3)2=2 且 1 < 2 1< 2 1<2;所以 X 2 X_2 X2 归 X 1 X_1 X1 代表的簇,即 C 1 = { X 1 , X 2 } , C 2 = { X 3 } C_1=\{X_1,X_2\}, C_2=\{X_3\} C1={X1,X2},C2={X3};
② 计算 X 4 X_4 X4 的归属:因为 d ( X 4 , X 1 ) 2 = 2 , d ( X 4 , X 3 ) 2 = 1 d(X_4,X_1)^2= 2, d(X_4,X_3)^2=1 d(X4,X1)2=2,d(X4,X3)2=1 且 2 > 1 2>1 2>1;所以 X 4 X_4 X4 归 X 3 X_3 X3 代表的簇,即 C 1 = { X 1 , X 2 } , C 2 = { X 3 , X 4 } C_1=\{X_1,X_2\}, C_2=\{X_3,X_4\} C1={X1,X2},C2={X3,X4};
③ 计算 X 5 X_5 X5 的归属:因为 d ( X 5 , X 1 ) 2 = 13 , d ( X 5 , X 3 ) 2 = 10 d(X_5,X_1)^2=13, d(X_5,X_3)^2=10 d(X5,X1)2=13,d(X5,X3)2=10 且 13 > 10 13>10 13>10;所以 X 5 X_5 X5 归 X 3 X_3 X3 代表的簇, 即 C 1 = { X 1 , X 2 } , C 2 = { X 3 , X 4 , X 5 } C_1=\{X_1,X_2\}, C_2=\{X_3,X_4,X_5\} C1={X1,X2},C2={X3,X4,X5};
④ 同理 X 6 , X 7 , X 8 X_6, X_7, X_8 X6,X7,X8 也归入 X 3 X_3 X3 代表的簇,故得初始簇为
C 1 = { X 1 , X 2 } , C 2 = { X 3 , X 4 , X 5 , X 6 , X 7 , X 8 } C_1=\{X_1,X_2\},C_2=\{X_3,X_4,X_5,X_6,X_7,X_8\} C1={X1,X2},C2={X3,X4,X5,X6,X7,X8} ⑤ 重新计算得 C 1 C_1 C1 和 C 2 C_2 C2 的中心点分别是 X ‾ 1 = ( 1.5 , 1 ) , X ‾ 2 = ( 3.5 , 3 ) \overline{X}_1=(1.5,1),\overline{X}_2=(3.5,3) X1=(1.5,1),X2=(3.5,3)
(3)第二轮循环。
分别将 X 1 , X 2 , ⋯ , X 8 X_1, X_2,\cdots,X_8 X1,X2,⋯,X8 别分配到最近的中心点 X ‾ 1 \overline{X}_1 X1 或 X ‾ 2 \overline{X}_2 X2。
类似第一轮计算可得 S S S 的两个簇 C 1 = { X 1 , X 2 , X 3 , X 4 } , C 2 = { X 5 , X 6 , X 7 , X 8 } C_1=\{X_1,X_2,X_3,X_4\},C_2=\{X_5,X_6,X_7,X_8\} C1={X1,X2,X3,X4},C2={X5,X6,X7,X8} 计算得 C 1 C_1 C1 和 C 2 C_2 C2 的中心点分别是 X ‾ 1 = ( 1.5 , 1.5 ) , X ‾ 2 = ( 4.5 , 3.5 ) \overline{X}_1=(1.5,1.5),\overline{X}_2=(4.5,3.5) X1=(1.5,1.5),X2=(4.5,3.5)
(4)第三轮循环。
分别将 X 1 , X 2 , ⋯ , X 8 X_1, X_2,\cdots,X_8 X1,X2,⋯,X8 分配给最近的中心点 X ‾ 1 \overline{X}_1 X1 或 X ‾ 2 \overline{X}_2 X2。
类似第二轮循环的计算,最终可得 S S S 的两个簇
C 1 = { X 1 , X 2 , X 3 , X 4 } , C 2 = { X 5 , X 6 , X 7 , X 8 } C_1=\{X_1,X_2,X_3,X_4\},C_2=\{X_5,X_6,X_7,X_8\} C1={X1,X2,X3,X4},C2={X5,X6,X7,X8} 重新计算得 C 1 C_1 C1 和 C 2 C_2 C2 的中心点分别是 X ‾ 1 = ( 1.5 , 1.5 ) , X ‾ 2 = ( 4.5 , 3.5 ) \overline{X}_1=(1.5,1.5),\overline{X}_2=(4.5,3.5) X1=(1.5,1.5),X2=(4.5,3.5)
由于簇中心已没有变化,因此算法停止,并输出 S S S 的聚类
C = { C 1 , C 2 } = { { X 1 , X 2 , X 3 , X 4 } , X 5 , X 6 , X 7 , X 8 } } C=\{C_1,C_2\}=\{\{X_1,X_2,X_3,X_4\}, X_5,X_6,X_7,X_8\}\} C={C1,C2}={{X1,X2,X3,X4},X5,X6,X7,X8}} 思考:若在此例中指定 k = 3 k=3 k=3,而初始点选择为 X 1 , X 2 , X 3 X_1, X_2, X_3 X1,X2,X3 与 X 1 , X 5 , X 6 X_1, X_5, X_6 X1,X5,X6,其结果会有啥差异。
3、算法分析说明
1)算法的优点
① k-平均算法简单、经典,常作为其它聚类算法的参照或被改进。
② k-平均算法以 k k k个簇的误差平方和最小为目标,当聚类的每个簇是密集的,且簇与簇之间区别明显时,其聚类效果较好。
③ k-平均算法处理大数据集高效,且具较好的可伸缩性,其计算复杂性为 O ( n × k × t ) O(n\times k\times t) O(n×k×t), n n n是数据对象个数, k k k为簇个数, t t t是迭代次数。
2)算法的缺点
① k-平均算法对初始中心点的选择比较敏感。对同一个数据集,如果初始中心选择不同,其聚类结果也可能不一样。
② k-平均算法对参数 k k k是比较敏感的,即使是同一个数据集,如果 k k k选择不同,其聚类结果可能完全不一样。
③ k-平均算法以簇内对象的平均值作为簇中心来计算簇内误差,在连续属性的数据集上很容易实现,但在具有离散属性的数据集上却不能适用。
(四)空簇与离群点
1、空簇问题
基本k-平均算法在实际计算中可能出现的空簇现象,导致算法下一轮循环无法进行。
例10-3 假设 S S S 由表10-3给出,即 S S S 为二维平面上7个点的数据集。令 k = 3 k=3 k=3,请用k-平均算法将 S S S 聚类成3个簇。
解:数据集 S S S 在平面上的相对位置如下图所示。
(1)初始步:选择 X 1 , X 6 , X 7 X_1,X_6,X_7 X1,X6,X7 作为初始中心,并将它们分别指派给三个簇,即得 C 1 = { X 1 } , C 2 = { X 6 } , C 3 = { X 7 } C_1=\{X_1\},C_2=\{X_6\}, C_3=\{X_7\} C1={X1},C2={X6},C3={X7};
(2)第一次迭代
计算 X 2 , X 3 , X 4 , X 5 X_2,X_3,X_4,X_5 X2,X3,X4,X5 与中心点 X ‾ 1 = ( 0 , 0 ) , X ‾ 2 = ( 7 , 3 ) , X ‾ 3 = ( 8 , 2 ) \overline{X}_1=(0,0),\overline{X}_2=(7,3),\overline{X}_3=(8,2) X1=(0,0),X2=(7,3),X3=(8,2) 的距离平方
将它们指派给距离平方最近的中心点,可得3个簇
C 1 = { X 1 , X 2 , X 3 , X 4 } , C 2 = { X 5 , X 6 } , C 3 = { X 7 } C_1=\{ X_1, X_2, X_3, X_4\},C_2=\{X_5,X_6\},C_3=\{X_7\} C1={X1,X2,X3,X4},C2={X5,X6},C3={X7} 计算得簇 C 1 , C 2 , C 3 C_1,C_2, C_3 C1,C2,C3 新的中心点为 X ‾ 1 = ( 1.5 , 2.25 ) , X ‾ 2 = ( 5 , 3 ) , X ‾ 3 = ( 8 , 2 ) \overline{X}_1=(1.5,2.25),\overline{X}_2=(5,3),\overline{X}_3=(8,2) X1=(1.5,2.25),X2=(5,3),X3=(8,2)。
(3)第二次迭代
计算 X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 X_1,X_2,X_3,X_4,X_5,X_6,X_7 X1,X2,X3,X4,X5,X6,X7 与3个新中心点的距离
将 X 1 , X 2 , X 3 , X 4 , X 5 , X 6 , X 7 X_1,X_2,X_3,X_4,X_5,X_6,X_7 X1,X2,X3,X4,X5,X6,X7 指派给距离平方和最小的中心点,可得
C 1 = { X 1 , X 2 , X 3 , X 4 , X 5 } , C 2 = ∅ , C 3 = { X 6 , X 7 } C_1=\{X_1, X_2, X_3, X_4, X_5\},C_2=\varnothing,C_3=\{X_6 ,X_7\} C1={X1,X2,X3,X4,X5},C2=∅,C3={X6,X7} 这时 C 2 C_2 C2 就是一个空簇,因此没有簇的中心点,导致下一步计算无法进行。有以下两种策略来选择一个替补的中心。
(1)选择一个距离当前任何质心最远的点,并可消除当前对总平方误差影响最大的点。
(2)从具有最大 w ( C i ) w(C_i) w(Ci) 的簇中选择一个替补质心,并对该簇进行分裂簇,以此降低聚类的 w ( C ) w(C) w(C)。
2、离群点问题
k-平均算法使用误差平方和 w ( C ) w(C) w(C) 作为优化目标时,离群点可能过度影响所发现的簇质量,即当存在离群点时,聚类结果簇的质心可能不如没有离群点时那样具有代表性,并且 w ( C ) w(C) w(C) 也比较高。此例 X 1 X_1 X1 就是明显的离群点。因此,如果能够提前发现离群点并删除它们,在k-平均算法的聚类应用中常常是有用的。
在有些实际应用中,如股票市场交易分析,一些明显的离群点 (股票黑马) 恰恰可能是最令人感兴趣的。
(五)k-中心点算法
为降低k-平均算法对噪声数据的敏感性,k-中心点 (k-medoids) 算法不采用簇的平均值 (通常不是簇中的对象,称为虚拟点) 作为簇中心点,而是选择簇中一个离平均值最近的具体对象作为簇中心。
1、算法原理
k-中心点算法选择一个簇中位置距平均值点最近的对象替换k-平均算法的平均值中心点。首先为每个簇随机选择一个代表对象作中心点,其余对象 (非中心点) 分配给最近的代表对象所在的簇。然后反复地用一个用非代表对象替换一个代表对象,使其聚类质量更高 (用某种代价函数评估),直到聚类质量无法提高为止。
设 S = { X 1 , X 2 , X 3 , ⋯ , X n } S=\{X_1,X_2,X_3,\cdots,X_n\} S={X1,X2,X3,⋯,Xn},任选 k k k 个对象 O i ( i = 1 , 2 , ⋯ , k ) O_i(i=1,2,\cdots,k) Oi(i=1,2,⋯,k) 作为中心点,记作中心点集 O = { O 1 , O 2 , ⋯ , O k } O=\{O_1, O_2,\cdots, O_k\} O={O1,O2,⋯,Ok},其余 n − k n-k n−k 个对象称为非中心点,记作非中心点集 Q = { Q 1 , ⋯ , Q r , ⋯ , O n − k } ( S = O ∪ Q ) Q=\{Q_1, \cdots, Q_r,\cdots, O_{n-k}\}(S=O\cup Q) Q={Q1,⋯,Qr,⋯,On−k}(S=O∪Q),并将它们分配给最近的中心点,并得聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1, C_2, \cdots,C_k\} C={C1,C2,⋯,Ck},其中 C i C_i Ci 的中心点为 O i ( i = 1 , 2 , ⋯ , k ) O_i(i=1,2, \cdots,k) Oi(i=1,2,⋯,k)。
然后计算用一个非中心点 Q r Q_r Qr 去替换每一个中心点 O i ( i = 1 , 2 , ⋯ , k ) O_i(i=1,2,\cdots,k) Oi(i=1,2,⋯,k) 的代价 E i r E_{ir} Eir,找出代价最小且为负数对应的替代方案。若中心点 O i O_i Oi 被一个非中心点 Q r Q_r Qr 替换,就得到新的中心点集合 O = { O 1 , ⋯ , O i − 1 , Q r , O i + 1 , ⋯ , O k } O=\{O_1, \cdots,O_{i-1}, Q_r,O_{i+1}, \cdots, O_k\} O={O1,⋯,Oi−1,Qr,Oi+1,⋯,Ok},则可能引起 S S S 中每个对象 X j X_j Xj 到新中心点的距离变化,将这种变化之和称为代价,记作
E i r = ∑ j = 1 n W j i r (10-19) E_{ir}=\sum_{j=1}^nW_{jir}\tag{10-19} Eir=j=1∑nWjir(10-19) 其中 W j i r W_{jir} Wjir 表示 X j X_j Xj 因 O i O_i Oi 被 Q r Q_r Qr 替换后产生的代价,用替换前后 X j X_j Xj 到中心点距离之差表示,且 W j i r W_{jir} Wjir 的值因 X j ( j = 1 , 2 , ⋯ , n ) X_j (j=1,2,\cdots,n) Xj(j=1,2,⋯,n) 原先是否在 O i O_i Oi 代表的簇中而对应不同的计算方法。
(1)若 X j X_j Xj 原先属于 O i O_i Oi 的簇 C i C_i Ci,则有两种情况。
① X j X_j Xj 现在离某中心点 O m ( m ≠ i ) O_m(m≠i) Om(m=i) 最近 (图10-11a),则 X j X_j Xj 被重新分到 O m O_m Om 的簇,其代价
W j i r = d ( X j , O m ) − d ( X j , O i ) W_{jir}=d(X_j,O_m)-d(X_j,O_i) Wjir=d(Xj,Om)−d(Xj,Oi)
② X j X_j Xj 现在离新中心点 Q r Q_r Qr 最近 (图10-11b),则 X j X_j Xj 被重新分配到 Q r Q_r Qr 的簇中, 其代价
C j i r = d ( X j , Q r ) − d ( X j , O i ) C_{jir}=d(X_j,Q_r)-d(X_j,O_i) Cjir=d(Xj,Qr)−d(Xj,Oi)
(2)若 X j X_j Xj 原先属于某中心点 O m O_m Om 的簇 C m ( m ≠ i ) C_m(m≠i) Cm(m=i),也有两种情况
① X j X_j Xj 现在离中心点 O m O_m Om 仍然最近 (图10-12a),则 X j X_j Xj 保留在 O m O_m Om 的簇中,其代价
W j i r = 0 W_{jir}=0 Wjir=0
② X j X_j Xj 现在离新中心点 Q r Q_r Qr 最近 (图10-12b),则将 X j X_j Xj 重新分配到 Q r Q_r Qr 的簇中,其代价
W j i r = d ( X j , Q r ) − d ( X j , O m ) W_{jir}=d(X_j,Q_r)-d(X_j,O_m) Wjir=d(Xj,Qr)−d(Xj,Om)
由于中心点有 k k k 个,非中心点有 n − k n-k n−k 个,因此,中心点 O i O_i Oi 被一个非中心点 Q r Q_r Qr 替换就有 ( n − k ) × k (n-k)\times k (n−k)×k 个不同的方案及其对应的代价。
如果 E i h = m i n { E i r ∣ i = 1 , 2 , ⋯ , k ; r = 1 , 2 , ⋯ , n − k ) } E_{ih}=min\{E_{ir} | i=1,2,\cdots,k;r=1,2,\cdots,n-k)\} Eih=min{Eir∣i=1,2,⋯,k;r=1,2,⋯,n−k)} 且 E i h < 0 E_{ih}<0 Eih<0,则将中心点 O i O_i Oi 用非中心点 Q h Q_h Qh 替换,使 S S S 中每个点到新中心点的距离之和减少,即提高了聚类的总体质量。
在得到新的中心点集之后,计算得到新的聚类,然后继续寻找可替换的中心点,直到中心点集没有变化为止。
2、算法描述
算法10-4 k-中心点聚类算法
输入:簇的个数 k k k和数据集 S = { X 1 , X 2 , ⋯ , X n } S=\{X_1,X_2,\cdots,X_n\} S={X1,X2,⋯,Xn}
输出:低价最小的聚类 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck}
(1)从 S S S中随机选 k k k个对象作为中心点集 O = { O 1 , O 2 , ⋯ , O k } O=\{O_1,O_2,\cdots,O_k\} O={O1,O2,⋯,Ok}
(2)REPEAT
(3)将所有非中心点分配给离它最近的中心点,并得聚类 C C C
(4)FOR i = 1 , 2 , ⋯ , k i=1,2,\cdots,k i=1,2,⋯,k
(5) FOR r = 1 , 2 , ⋯ , n − k r=1,2,\cdots,n-k r=1,2,⋯,n−k
(6) 计算 S S S中每个 X j X_j Xj因中心点 O i O_i Oi被非中心点 Q r Q_r Qr替换后重新分配的代价 W j i r W_{jir} Wjir
(7) E i r = W 1 i r + W 2 i r + ⋯ + W n i r E_{ir}=W_{1ir}+W_{2ir}+\cdots+W_{nir} Eir=W1ir+W2ir+⋯+Wnir
(8) END FOR
(9)END FOR
(10) E i h = min { E i r ∣ i = 1 , 2 , ⋯ , k ; r = 1 , 2 , ⋯ , n − k } E_{ih}=\min\{E_{ir}|i=1,2,\cdots,k; r=1,2,\cdots,n-k\} Eih=min{Eir∣i=1,2,⋯,k;r=1,2,⋯,n−k}
(11)如果 E i h < 0 E_{ih}<0 Eih<0,则将 O i O_i Oi用 Q r Q_r Qr替换,得新中心点集 O = { O 1 , ⋯ , O i − 1 , Q r , O i + 1 , ⋯ , O k } O=\{O_1, \cdots,O_{i-1}, Q_r,O_{i+1}, \cdots, O_k\} O={O1,⋯,Oi−1,Qr,Oi+1,⋯,Ok}
(12)UNTIL中心点集 O O O无需变化
(13)输出 C = { C 1 , C 2 , ⋯ , C k } C=\{C_1,C_2,\cdots,C_k\} C={C1,C2,⋯,Ck}
相关文章:

聚类分析方法(一)
目录 一、聚类分析原理(一)聚类分析概述(二)聚类的数学定义(三)簇的常见类型(四)聚类框架及性能要求(五)簇的距离 二、划分聚类算法(一࿰…...

Midjourney对图片细微调整和下载保存
点击v2是对第二图片细微调整。 点击u3对第3张图片进行放大。 保存图片: 对点击u3放大的图片,双击 , 右键保存图片...

Python文件写入操作
本套课在线学习视频(网盘地址,保存到网盘即可免费观看): https://pan.quark.cn/s/b19a7c910cf6 在Python编程中,文件操作是一项基础且重要的技能。本文将详细介绍如何使用Python将列表内容写入文件以实现文件…...

FPGA_GTX:简要版
1. GTX介绍 Xilinx FPGA的GT意思是Gigabyte Transceiver。通常称呼为Serdes、高速收发器。GT在xilinx不同系列有着不同的产品,从7系列到UltraScale系列分别有GTP、GTX、GTZ、GTH、GTY和GTM。不同GT整体结构上类似,为了支持越来越高的line rateÿ…...

使用mq向队列发送消息流程
新建队列q1和q2绑定交换机和队列之间的消息路由向默认的交换机发送消息查看两个队列中的交换机消息(get messages),也可以在overview选项卡页面查看实时流量图 这里注意: 1.交换机是转发消息用的,他并没有存储消息的…...

Git中两个开发分支merge的原理
一 分支合并 1.1 原理 分支合并:就是将A分支修改后且commit的内容,合并到B分支,这些修改且提交的内容和B分支对应的内容和位置进行比较: 1.不一样的话,提示冲突,需要人工干预。 2.一样的话,…...

数字图像处理、机器视觉(计算机视觉)、计算图形学概念
数字图像处理(Digital Image Processing)--又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程,以提高图像的实用性,达到人们所要求的预期结果。从输入到输出来看,数字图…...

Android SurfaceFlinger ——获取显示屏信息(十八)
经过前面文章对开机启动动画的流程梳理,引出了实际上在开机启动动画中,并没有Activity,而是通过 OpenGL es 进行渲染,最后通过某种方式,把数据交给 Android 渲染系统。 让我们回忆一下开机动画前期准备的相关步骤,大致分为如下几个: 1)getInternalDisplayToken:获取显…...

QCustomPlot+ vs2022+ qt
零、printSupport 步骤一:下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二:配置项目 创建新的Qt项目: 打开VS2022,创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…...

Perl 语言开发(五):循环语句
目录 1. 循环语句概述 2. while 循环 2.1 基本语法 2.2 示例 2.3 无限循环 3. until 循环 3.1 基本语法 3.2 示例 3.3 无限循环 4. for 循环 4.1 基本语法 4.2 示例 4.3 嵌套循环 5. foreach 循环 5.1 基本语法 5.2 示例 5.3 遍历哈希 6. 循环控制语句 6.1 …...

线性系统理论及应用GUI设计及仿真
目录 1.控制系统的状态空间模型 1.1.状态空间模型 1.2 传递函数模型 1.3 传递函数转换为状态空间模型 1.4.状态空间模型转换为传递函数 1.5.状态空间模型转化为约当标准型 2.线性系统的时域分析 2.1.矩阵指数函数的计算 2.2.线型定常连续系统的状态空间模型求解 3.线…...

RAG综述汇总
第一篇:Retrieval-Augmented Generation for Large Language Models: A Survey(同济/复旦) 论文链接 1.简介 这篇全面的综述论文详细研究了 RAG 范式的发展,包括 Naive RAG、Advanced RAG 和 Modular RAG。介绍了 RAG 框架的三个基础技术,…...

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式
目录 一、引言:智慧水利的时代背景与意义 二、大数据:水利管理的数据基石 (一)数据收集与整合 (二)数据分析与挖掘 三、物联网:水利管理的感知神经 (一)智能感知与监…...

springcloud-gateway 网关组件中文文档
Spring Cloud网关 Greenwich SR5 该项目提供了一个基于Spring生态系统的API网关,其中包括:Spring 5,Spring Boot 2和项目Reactor。Spring Cloud网关的目的是提供一种简单而有效的方法来路由到API,并向它们提供跨领域的关注&#x…...

Android Gradle开发与应用Gradle详细使用
一、Gradle 基础知识 1. Gradle 构建脚本 Gradle 构建脚本通常使用 Groovy 或 Kotlin DSL 编写。Android 项目中有两个主要的 Gradle 构建脚本: a、项目级构建脚本 (build.gradle 或 build.gradle.kts):位于项目的根目录中,用于配置项目范…...

软件架构的23个基本原则:构建稳健、可扩展的系统
软件架构是任何软件项目成功的关键。良好的架构不仅能够支撑软件的功能实现,还能确保其性能、可维护性、可扩展性和安全性。在软件工程领域,经过多年的研究和实践,已经总结出了许多宝贵的原则和模式,用以指导软件架构的设计。以下…...

江苏省生产经营单位安全管理考核(附答案)
单选题 1.生产经营单位的主要负责人在本单位发生重大生产安全事故后逃匿的,由( )处 15 日以下拘留。 A、公安机关 B、检察机关 C、安全生产监督管理部门正确答案:A 2.据一些资料表明,心跳呼吸停止,在()min内进行抢救,约80%可以救活。 A、1 B、2 C、3正确答案:A 3.拉开闸刀时…...

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值
目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算? producer生产者怎么知道有哪些分区? 分区计算 如何自定义实现分区器? 想说的在图里啦!宝宝!💡 编辑 如果key值忘记传递了呢&a…...

二叉树的链式结构
前言 Hello,友友们,小编将继续重新开始数据结构的学习,前面讲解了堆的部分知识,今天将讲解二叉树的链式结构的部分内容。 1.概念回顾与新增 二叉树是一种数据结构,其中每个节点最多有两个子节点,分别是左子节点和右子…...

【STM32】在标准库中使用DMA
1.MDA简介 DMA全称Direct Memory Access,直接存储区访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和…...

多线程详解
文章目录 多线程创建方式p3一些教程 狂神说 多线程创建方式p3 代码: package com.demo1;//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程/*** 总结:注意,线程开启不一定立即执行,dCPU调度执行*/public class TestThread1 extends Thre…...

软件工程需求之:业务需求与用户需求
在软件开发项目中,"业务需求"和"用户需求"是两个核心概念,它们分别从不同的角度描述了软件应该具备的功能和特性。理解这两个概念的区别对于成功地规划和开发软件至关重要。 业务需求 业务需求主要关注于软件项目如何帮助实现企业…...

Nettyの源码分析
本篇为Netty系列的最后一篇,按照惯例会简单介绍一些Netty相关核心源码。 1、Netty启动源码分析 代码就使用最初的Netty服务器案例,在bind这一行打上断点,观察启动的全过程: 由于某些方法的调用链过深,节约篇幅…...

MySQL远程登录
root是超级管理员,默认情况下,root不能作为远程登录的用户名,远程登录前,需要将登录的数据库在本地登录,修改权限,输入: update user set host % where user root ; 回车键,再输…...

html的作业
目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出: 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…...

【TORCH】查看dataloader里的数据,通过dataloader.dataset或enumerate
文章目录 dataloader.dataset示例代码使用自定义数据集使用 MNIST 数据集 说明 enumerate示例代码说明使用 MNIST 数据集的例子 dataloader.dataset 是的,您可以直接访问 train_loader 的数据集来查看数据,而不必通过 enumerate 遍历数据加载器。可以通…...

KDTree 简单原理与实现
介绍 K-D树是一种二叉树的数据结构,其中每个节点代表一个k维点,可用于组织K维空间中的点,其中K通常是一个非常大的数字。二叉树结构允许对多维空间中的点进行非常有效的搜索,包括最近邻搜索和范围搜索,树中的每个非叶…...

[c++] 可变参数模版
前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…...

QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2
QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2 本方案使用了QGraphicsEffect,由于QGraphicsEffect对一些控件会有渲染问题,比如列表、表格等,所以暂时仅作为研究,优先其他方案 在之前的文章中&#…...

数据结构之“队列”(全方位认识)
🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 上期博客介绍了” 栈 “这个数据结构,他具有先进后出的特点。本期介绍“ 队列 ”这个数据结构,他具有先进先出的特点。 目录…...