数学建模入门笔记(2) 聚类分析

聚类分析

​ 聚类分析(Cluster Analysis):又称群分析,对多个样本/指标定量分类的多元分析方法,是无监督学习

1 聚类分析的分类

​ Q型聚类(Qualitative Clustering):也称硬聚类,一般用于将样本聚类,每一簇之间无交集,用距离作为相似性度量,包括 K-Means聚类、层次聚类、DBSCAN聚类

​ R型聚类(Qualitative Clustering):也称软聚类或模糊聚类,一般用于将指标聚类,每一簇之间有交集,用相关系数/夹角余弦等作为相似性度量,包括 Fuzzy C-Means聚类、Possibilistic C-Means聚类

a. http://t.csdnimg.cn/X0jnX

b. Q聚类针对个案,适合个体预测,诊断,分型之类的;R聚类针对指标,适合指标归类、降维之类的。

2 Q型聚类的相似性度量

2.1 样本距离的计算方式

1. 闵氏距离(Minkowski Distance)

d q ( x , y ) = [ ∑ k = 1 p ∣ x k − y k ∣ q ] 1 q , q > 0 , d_q(\boldsymbol{x}, \boldsymbol{y})=\left[\sum_{k=1}^p\left|x_k-y_k\right|^q\right]^{\frac{1}{q}}, q>0, dq(x,y)=[k=1pxkykq]q1,q>0,

​ 当 q = 1 , 2 q=1,2 q=1,2 q → + ∞ q\rightarrow+\infty q+ 时,则分别得到:
( 1 ) (1) (1) 绝对值距离
d 1 ( x , y ) = ∑ k = 1 p ∣ x k − y k ∣ d_1(\boldsymbol{x}, \boldsymbol{y})=\sum_{k=1}^p\left|x_k-y_k\right| d1(x,y)=k=1pxkyk
( 2 ) (2) (2) 欧几里得(Euclid)距离 (最常用)

优点: 正交变换后欧式距离不变
d 2 ( x , y ) = [ ∑ k = 1 p ∣ x k − y k ∣ 2 ] 1 2 d_2(\boldsymbol{x}, \boldsymbol{y})=\left[\sum_{k=1}^p\left|x_k-y_k\right|^2\right]^{\frac{1}{2}} d2(x,y)=[k=1pxkyk2]21
( 3 ) (3) (3) 切比雪夫 (Chebyshev) 距离
d ∞ ( x , y ) = max ⁡ 1 ⩽ k ⩽ p ∣ x k − y k ∣ d_{\infty}(\boldsymbol{x}, \boldsymbol{y})=\max _{1 \leqslant k \leqslant p}\left|x_k-y_k\right| d(x,y)=1kpmaxxkyk

2. 马氏距离(Mahalanobis Distance)

​ 是欧氏距离的一种修正,对一切线性变换不变

​ 样本数据归一化后指标内部的方差仍会影响欧氏距离对相似性的度量,于是进行标准化,然而标准化之后指标之间的相关性仍会影响欧 氏距离的度量,于是用马氏距离对欧式距离进行矫正

​ 马氏距离实际上是PCA+标准化的效果(即按照特征值向量的方向旋转再缩放特征值倍),都与相似性和协方差矩阵密切相关

d ( x , y ) = ( x − y ) T Σ − 1 ( x − y ) , d(\boldsymbol{x}, \boldsymbol{y})=\sqrt{(\boldsymbol{x}-\boldsymbol{y})^{\mathrm{T}} \mathbf{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{y})}, d(x,y)=(xy)TΣ1(xy) ,

x , y \boldsymbol{x}, \boldsymbol{y} x,y 为来自 p p p 维总体 Z Z Z 的样本观测值; Σ \boldsymbol{\Sigma} Σ Z Z Z 的协方差矩阵, 实际中 Σ \boldsymbol{\Sigma} Σ 往往是未知的, 常常需要用样本协方差来估计。

a. 马氏距离(Mahalanobis Distance) - 知乎 (zhihu.com)

b. http://t.csdnimg.cn/ajYtK

c. 聚类问题,在聚类成的不同类别当中,协方差矩阵很难是相同的,所以消除量纲影响的马氏距离反而在大多数情况下是不合理的,因为很难找到一个公共的协方差矩阵。??

2.2 类间距离的计算方式

​ 大多采用较少受异常值影响且不知数据分布的情况下依然能有较好表现的 Ward 法

1. 最短距离法 (Nearest Neighbor or Single Linkage Method):

D ( G 1 , G 2 ) = min ⁡ x i ∈ G 1 y j ∈ G 2 { d ( x i , y j ) } , D\left(G_1, G_2\right)=\min _{\substack{x_i \in G_1 \\ y_j \in G_2}}\left\{d\left(\boldsymbol{x}_i, \boldsymbol{y}_j\right)\right\}, D(G1,G2)=xiG1yjG2min{d(xi,yj)},

2. 最长距离法(Farthest Neighbor or Complete Linkage Method):

D ( G 1 , G 2 ) = max ⁡ x i ∈ G 1 y j ∈ G 2 { d ( x i , y j ) } , D\left(G_1, G_2\right)=\max _{\substack{x_i \in G_1 \\ y_j \in G_2}}\left\{d\left(\boldsymbol{x}_i, \boldsymbol{y}_j\right)\right\}, D(G1,G2)=xiG1yjG2max{d(xi,yj)},

3. 重心法(Centroid Method):

D ( G 1 , G 2 ) = d ( x ‾ , y ‾ ) , D\left(G_1, G_2\right)=d(\overline{\boldsymbol{x}}, \overline{\boldsymbol{y}}), D(G1,G2)=d(x,y),

x ˉ , y ˉ \bar{x}, \bar{y} xˉ,yˉ 分别为 G 1 , G 2 G_1, G_2 G1,G2 的重心。

4. 类平均法 (Group Average Method):

D ( G 1 , G 2 ) = 1 n 1 n 2 ∑ x i ∈ G 1 ∑ x j ∈ G 2 d ( x i , x j ) , D\left(G_1, G_2\right)=\frac{1}{n_1 n_2} \sum_{x_i \in G_1} \sum_{x_j \in G_2} d\left(\boldsymbol{x}_i, \boldsymbol{x}_j\right), D(G1,G2)=n1n21xiG1xjG2d(xi,xj),

​ 它等于 G 1 , G 2 G_1, G_2 G1,G2 中两样本点距离的平均, n 1 , n 2 n_1, n_2 n1,n2 分别为 G 1 , G 2 G_1, G_2 G1,G2 中的样本点个数。

5. Ward方法/离差平方和法 (Sum of Squares Method):

​ 若记
D 1 = ∑ x i ∈ G 1 ( x i − x ‾ 1 ) T ( x i − x ‾ 1 ) , D 2 = ∑ x j ∈ G 2 ( x j − x ‾ 2 ) T ( x j − x ‾ 2 ) , D 12 = ∑ x k ∈ G 1 ∪ G 2 ( x k − x ‾ ) T ( x k − x ‾ ) , \begin{gathered} D_1=\sum_{x_i \in G_1}\left(\boldsymbol{x}_i-\overline{\boldsymbol{x}}_1\right)^{\mathrm{T}}\left(\boldsymbol{x}_i-\overline{\boldsymbol{x}}_1\right), D_2=\sum_{\boldsymbol{x}_j \in G_2}\left(\boldsymbol{x}_j-\overline{\boldsymbol{x}}_2\right)^{\mathrm{T}}\left(\boldsymbol{x}_j-\overline{\boldsymbol{x}}_2\right), \\ D_{12}=\sum_{x_k \in G_1 \cup G_2}\left(\boldsymbol{x}_k-\overline{\boldsymbol{x}}\right)^{\mathrm{T}}\left(\boldsymbol{x}_k-\overline{\boldsymbol{x}}\right), \end{gathered} D1=xiG1(xix1)T(xix1),D2=xjG2(xjx2)T(xjx2),D12=xkG1G2(xkx)T(xkx),

​ 式中
x ˉ 1 = 1 n 1 ∑ x i ∈ G 1 x i , x ˉ 2 = 1 n 2 ∑ x j ∈ G 2 x j , x ˉ = 1 n 1 + n 2 ∑ x k ∈ G 1 ∪ G 2 x k , \bar{x}_1=\frac{1}{n_1} \sum_{x_i \in G_1} x_i, \bar{x}_2=\frac{1}{n_2} \sum_{x_j \in G_2} x_j, \bar{x}=\frac{1}{n_1+n_2} \sum_{x_k \in G_1 \cup G_2} x_k, xˉ1=n11xiG1xi,xˉ2=n21xjG2xj,xˉ=n1+n21xkG1G2xk,

​ 则定义
D ( G 1 , G 2 ) = D 12 − D 1 − D 2 . D\left(G_1, G_2\right)=D_{12}-D_1-D_2 . D(G1,G2)=D12D1D2.

​ 事实上, 若 G 1 , G 2 G_1, G_2 G1,G2 内部点与点距离很小, 则它们能很好地各自聚为一类, 并且这两类又能够充分分离 (即 D 12 D_{12} D12 很大), 这时必然有 D = D 12 − D 1 − D 2 D=D_{12}-D_1-D_2 D=D12D1D2 很大。

a. 关于ward方法 科学网—凝聚法层次聚类之ward linkage method - 宋景和的博文 (sciencenet.cn)

3 常用的Q型聚类方法

3.1 层次聚类

步骤: ( 1 ) (1) (1) 先将每个样本当成一簇

( 2 ) (2) (2) 不断计算每簇之间的相似性并将最相似的合并为一簇

( 3 ) (3) (3) 直至簇数达到要求即可

特点: 不需要提前确定类数,使用于样本量较小的情况,计算量偏大

可视化: 层次树

代码: 可绘制层次树和二维散点图

import numpy as np
from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram,linkage
import xlrd as xr
import pandas as pd
from sklearn import preprocessing
from sklearn.cluster import AgglomerativeClustering

#把表格转置并去除不必要的标签
stats_frame = pd.read_excel("C:\\Users\86133\Desktop\工厂指标数据.xlsx")
stats_frame.drop("工厂",axis=1,inplace=True)
stats_frame = stats_frame.T
stats_frame = stats_frame.reset_index(drop=True)

#标准化
stats_frame_nomalized=preprocessing.scale(stats_frame)
print(stats_frame_nomalized)

#层次聚类
z=linkage(stats_frame,"ward",metric='euclidean',optimal_ordering=True)# average=类平均法,ward=离差平方和法,sin=最短距离法,com=最长距离法,med=中间距离法,cen=重心法,fle=可变类平均法
print(z)

#绘制聚类图1
fig, ax = plt.subplots(figsize=(10,9))
dendrogram(z, leaf_font_size=14) #画图
plt.title("Hierachial Clustering Dendrogram")
plt.xlabel("Cluster label")
plt.ylabel("Distance")
plt.axhline(y=4) #画一条分类线 y表示距离
plt.show()

#绘制聚类图2
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')#版本不同可能要affinity换成metric
print(cluster.fit_predict(stats_frame))
plt.figure(figsize=(10, 7))
plt.scatter(stats_frame[0],stats_frame[1], c=cluster.labels_)
plt.show()

a. http://t.csdnimg.cn/pbidn

b. http://t.csdnimg.cn/ogXMd (例子来源)

c. http://t.csdnimg.cn/tZuLm

3.2 K-Means++聚类

3.2.1 K-Means

步骤: ( 1 ) (1) (1) 选择K个样本作为初始聚类中心

( 2 ) (2) (2) 针对每个样本,计算它到目前K个聚类中心的距离并且将它归入距离最小的类

( 3 ) (3) (3) 使用 c i = 1 ∣ c i ∣ ∑ x ∈ c i x c_i=\frac{1}{\left|c_i\right|} \sum_{x \in c_i} x ci=ci1xcix 更新添加样本后的聚类中心

( 4 ) (4) (4) 重复(2)(3)直至所有样本归类完毕

特点: 可使用于数据量较大的样本集,分类结果会受初始点的影响

3.2.2 K-Means++

步骤: 对初始点的选择有改进,其他步骤都一样。

​ 初始质心选取的基本思路就是,初始的聚类中心之间的相互距离要尽可能的远。

( 1 ) (1) (1) 随机选取一个样本作为第一个聚类中心 c 1 c_1 c1

( 2 ) (2) (2) 计算每个样本与当前已有类聚中心最短距离 D ( x ) D(x) D(x);概率计算公式为 D ( x ) 2 ∑ x ∈ X D ( x ) 2 \frac{D(x)^2}{\sum_{x \in X} D(x)^2} xXD(x)2D(x)2,值越大,表示被选取作为聚类中心的概率较大;

( 3 ) (3) (3) 将概率最大的选为聚类中心,,更新 D ( x ) D(x) D(x)

( 4 ) (4) (4) 重复步骤(2)(3),直到选出 k 个聚类中心。

特点: 提高收敛速度,但它内在的有序性特性:下一个中心点的选择依赖于已经选择的中心点

代码:

a. https://blog.csdn.net/pentiumCM/article/details/103657283

3.2.3 关于K的选取

( 1 ) (1) (1) K = N / 2 K=\sqrt{N/2} K=N/2

( 2 ) (2) (2) 肘部法则(Elbow Method)

原理: a . a. a. 画出 W k W_k Wk 组内离差平方和随着 k k k 取值变化的曲线,手肘除即为最合适的 k k k 值,

b . b. b. 其中 W k = ∑ i = 1 k ∑ p ∈ C i ( p − m i ) 2 W_k=\sum_{i=1}^{k}\sum_{p\in C_i}(p-m_i)^2 Wk=i=1kpCi(pmi)2 , C i C_i Ci 表示第 i i i 簇中样本组成的集合 m i m_i mi 表示第 i i i 簇的质心

c . c. c. 随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么组内离差平方和会逐渐变小。并且,当k小于最佳聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故组内离差平方和的下降幅度会很大,而当k到达最佳聚类数时,再增加k所得到的聚合程度会迅速变小,所以组内离差平方和的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说组内离差平方和和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的最佳聚类数。

特点: 适用于K值较小时,且肘部不明显时效果不好

代码:

( 3 ) (3) (3) 间隔统计量(Gap Statistic)

原理: 手肘法加强版

a . a. a. 计算样本数据的 W k W_k Wk 从而得到 log ⁡ ( W k ) \log(W_k) log(Wk)
D r = ∑ i , i ′ ∈ C r d i i ′ D_r=\sum_{i,i'\in C_r}d_{ii'} Dr=i,iCrdii

d i i ′ = ∑ j ( x i j − x i ′ j ) 2 d_{ii'}=\sum_j(x_{ij}-x_{i'j})^2 dii=j(xijxij)2

W k = ∑ r = 1 k 1 2 n r D r W_k=\sum_{r=1}^{k}\frac{1}{2n_r}D_r Wk=r=1k2nr1Dr

D r D_r Dr 表示组内距离之和, d i i ′ d_{ii'} dii 用两点欧氏距离的平方度量, W k W_k Wk 即可度量聚类数量取 k k k 时的总聚集程度

∗ . *. . 到此处除了距离的度量和手肘法略微不同以外思路是一致的,接下来是改进部分

b . b. b. 用蒙特卡洛(Monte Carlo)方法估计 E log ⁡ ( W k ) E\log(W_k) Elog(Wk) ,估计值记为 E n ∗ log ⁡ ( W k ) E_n^*\log(W_k) Enlog(Wk) 表示样本数量为 n n n 的估计值

​ 即假设在立方区域内样本均匀分布,随机取n个样点作为一组数据,通过a步骤计算出改组样本的 log ⁡ ( W k ) \log(W_k) log(Wk) ,这样随机取20 次并计算这20次 log ⁡ ( W k ) \log(W_k) log(Wk) 的均值作为 E n ∗ log ⁡ ( W k ) E_n^*\log(W_k) Enlog(Wk)

c . c. c. 计算每个 k k k 对应的 G a p n ( k ) Gap_n(k) Gapn(k) ,画出其随 k k k 值变化的折线图
G a p n ( k ) = E n ∗ log ⁡ ( W k ) − log ⁡ ( W k ) Gap_n(k)=E_n^*\log(W_k)-\log(W_k) Gapn(k)=Enlog(Wk)log(Wk)
可视化: 可以作出4张图

( 4 ) (4) (4) 轮廓系数(Silhouette Coeffcient)

​ 利用内聚度(cohesion)计算样本 i i i 的轮廓系数 S ( i ) S(i) S(i) ,接近1证明样本聚类合理,接近0说明样本在两簇的边界,接近-1说明样本更应该分到其他簇

原理: a . a. a. 计算样本 i i i 到同簇其他样本的平均距离
a ( i ) = 1 n − 1 ∑ j ≠ i n distance ⁡ ( i , j ) a(i)=\frac{1}{n-1} \sum_{j \neq i}^n \operatorname{distance}(i, j) a(i)=n11j=indistance(i,j)
b . b. b. 计算样本 i i i 到其他簇样本的平均距离 { b 1 ( i ) , b 2 ( i ) , b 3 ( i ) , … , b m ( i ) } \left\{b_1(i), b_2(i), b_3(i), \ldots, b_m(i)\right\} {b1(i),b2(i),b3(i),,bm(i)},取最小值
b ( i ) = m i n { b 1 ( i ) , b 2 ( i ) , b 3 ( i ) , … , b m ( i ) } b(i)=min\left\{b_1(i), b_2(i), b_3(i), \ldots, b_m(i)\right\} b(i)=min{b1(i),b2(i),b3(i),,bm(i)}
c . c. c. 计算样本 i i i 的轮廓系数
S ( i ) = { 1 − a ( i ) b ( i ) a ( i ) < b ( i ) 0 a ( i ) = b ( i ) b ( i ) a ( i ) − 1 a ( i ) > b ( i ) S(i)=\left\{\begin{array}{cc} 1-\frac{a(i)}{b(i)} & a(i)<b(i) \\ 0 & a(i)=b(i) \\ \frac{b(i)}{a(i)}-1 & a(i)>b(i) \end{array}\right. S(i)= 1b(i)a(i)0a(i)b(i)1a(i)<b(i)a(i)=b(i)a(i)>b(i)
d . d. d. 计算样本整体的轮廓系数(取均值)

特点: 时间复杂度高,为 O ( n 2 ) O(n^2) O(n2)

可视化: 可以做出 S S S k k k 变化的折线图

代码:

( 5 ) (5) (5) Canopy算法

数据挖掘笔记-聚类-Canopy-原理与简单实现 - 手心里的雪的文章 - 知乎
https://zhuanlan.zhihu.com/p/31870478

a. 间隔统计量的来源 gap.pdf (su.domains)

b. http://t.csdnimg.cn/pAeNe

c. 蒙特卡洛方法 http://t.csdnimg.cn/uLPPb

d. K-Means聚类最优k值的选取 - 三三的文章 - 知乎 https://zhuanlan.zhihu.com/p/351366544

e. 关于MSE、RMSE、MAE http://t.csdnimg.cn/esky5

f. k的选取 http://t.csdnimg.cn/i0gk2

g. Canopy聚类 http://t.csdnimg.cn/Y18r0

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学建模中,使用Python进行聚类分析可以通过导入相关库来实现。首先,我们需要导入numpy、matplotlib、scipy、xlrd、pandas、sklearn等库来支持聚类分析的各个环节。聚类分析是一种研究问题的多元统计方法,也可以称为群分析。它的目的是将具有相似元素的集合聚集到一类中。聚类分析可以采用定性研究和定量研究的方法,通过选取共同指标,分析元素指标值之间的差距,从而实现分类的目的。在聚类分析中,常用的分类方法有Q分类和R分类。Q分类是对样品进行聚类,而R分类是对指标进行聚类。在使用Python进行聚类分析时,我们重点讲解Q分类。聚类分析的一般步骤包括:数据准备、选择合适的聚类算法、确定聚类数目、进行聚类分析、评估聚类结果。这些步骤可以帮助我们在数学建模中使用Python进行聚类分析。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【数学建模聚类分析——python实现](https://blog.csdn.net/m0_56120502/article/details/124509024)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值