机器学习笔记 第九章聚类

9.1  聚类任务

        聚类就是试图把数据集中的样本划分成若干个不相交的子集,每一个子集就称之为“簇”。这里需要说明一下,每个簇潜在的概念对于聚类算法而言事先都是未知的,聚类过程只能形成簇结构,簇对应的概念则要使用者来把握和命名。

        假设样本集D=\left \{ x_{1} ,x_{2},...,x_{m}\right \}包含m个无标记样本,每个样本x_{i}=(x_{i1};x_{i2};...;x_{in})是一个n维特征向量,再将样本集D划分为k个不相交的簇\left \{ C_{l} |l=1,2,..,k\right \},其中C_{l'}\bigcap _{l'\neq l}C_{l}=\varnothingD=\bigcup_{l=1}^{k}C_{l}。此外,用\lambda _{j}\in \left \{ 1,2,...,k \right \}表示样本x_{j}的“簇标记”,即x_{j}\in C_{\lambda _{j}}。聚类可以用簇标记向量\lambda =(\lambda _{1};\lambda _{2};...;\lambda _{m})表示。

9.2  性能度量

        聚类是将样本集D划分为若干互不相交的子集,即样本簇。我们一般希望同一个簇的样本尽可能相似,不同的簇尽可能不同。对于聚类性能的度量大致分为两类,即:

        \square外部指标:将聚类结果与某个“参考模型”进行比较;

        \square内部指标:直接考察聚类结果而不利用任何参考模型。

        对于D=\left \{ x_{1} ,x_{2},...,x_{m}\right \},假设聚类给出的簇划分为C=\left \{ C_{1},C_{2},...,C_{k} \right \},参考模型给出的簇划分为C^{*}=\left \{ C_{1}^{*},C_{2}^{*},...,C_{8}^{*} \right \}。定义如下

a=|SS|,SS=\left \{ (x_{i},x_{j})|\lambda _{i}=\lambda _{j},\lambda _{i}^{*}=\lambda _{j}^{*},i<j \right \},

b=|SD|,SD=\left \{ (x_{i},x_{j})|\lambda _{i}=\lambda _{j},\lambda _{i}^{*}\neq \lambda _{j}^{*},i<j \right \},

c=|DS|,DS=\left \{ (x_{i},x_{j})|\lambda _{i}\neq \lambda _{j},\lambda _{i}^{*}=\lambda _{j}^{*},i<j \right \},

d=|DD|,DD=\left \{ (x_{i},x_{j})|\lambda _{i}\neq \lambda _{j},\lambda _{i}^{*}\neq \lambda _{j}^{*},i<j \right \},

其中集合SS包含了再C中隶属于相同簇且再C^{*}中也隶属于相同簇的样本对;其他同理。因为样本对(x_{i},x_{j})(i<j)只能出现在一个集合中,所以就有a+b+c+d=m(m-1)/2成立。

        基于上面式子,可以得出下列常用的外部指标:

        \bulletJaccard系数

JC=\frac{a}{a+b+c}.

        \bulletFM指数

FMI=\sqrt{\frac{a}{a+b}\cdot \frac{a}{a+c}}.

        \bulletRand指数

RI=\frac{2(a+d)}{m(m-1)}.

显而易见,上述性能度量指标值都在[0,1]区间,值越大越好。

        聚类的簇划分为C=\left \{ C_{1},C_{2},...,C_{k} \right \},定义如下

avg(C)=\frac{2}{|C|(|C|-1)}\sum_{1\leqslant i<j\leqslant |C|}^{}dist(x_{i},x_{j}),

diam(C)=max_{1\leqslant i<j\leqslant |C|}dist(x_{i},x_{j}),

d_{min}(C_{i},C_{j})=min_{x_{i}\in C_{i},x_{j}\in C_{j}}dist(x_{i},x_{j}),

d_{cen}(C_{i},C_{j})=dist(\mu _{i},\mu _{j}),

其中,dist表示两样本之间的距离;\mu表示簇C的中心点\mu =\frac{1}{|C|}\sum_{1\leqslant i\leqslant |C|}^{}x_{i}avg(C)表示簇C内样本间的平均距离,diam(C)表示簇C内样本间的最远距离,d_{min}(C_{i},C_{j})表示簇C_{i}与簇C_{j}最近样本间的距离,d_{cen}(C_{i},C_{j})表示簇C_{i}与簇C_{j}中心点间的距离。

        \bulletDB指数

DB=\frac{1}{k}\sum_{i=1}^{k}max_{j\neq i}(\frac{avg(C_{i})+avg(C_{j})}{d_{cen}(\mu _{i},\mu _{j})}).

        \bulletDunn指数

DI=min_{1\leqslant i\leqslant k}\left \{ min_{j\neq i}(\frac{d_{min}(C_{i},C_{j})}{max_{1\leqslant i\leqslant k}diam(C_{l})}) \right \}.

        不难看出,DBI的值越小越好,而DI则相反,值越大越好。

9.3  距离计算

        对于函数dist,如果是一个“距离度量”,则满足一些基本性质:

非负性:dist(x_{i},x_{j})\geqslant 0;

同一性:dist(x_{i},x_{j})= 0当且仅当x_{i}=x_{j}

对称性:dist(x_{i},x_{j})= dist(x_{j},x_{i})

直递性:dist(x_{i},x_{j})\leqslant dist(x_{j},x_{k})+dist(x_{k},x_{j}).

        假设x_{i}=\left \{ x_{i1} ;x_{i2};...;x_{in}\right \}x_{j}=\left \{ x_{j1} ;x_{j2};...;x_{jn}\right \},则“闵可夫斯基距离”为

dist_{mk}(x_{i},x_{j})=(\sum_{u=1}^{n}|x_{iu}-x_{ju}|^{p})^{\frac{1}{p}}.

当p=2时,即为欧氏距离

dist_{ed}(x_{i},x_{j})=||x_{i}-x_{j}||_{2}=\sqrt{\sum_{u=1}^{n}|x_{iu}-x_{ju}|^{2}}.

当p=1时,即为曼哈顿距离

dist_{man}(x_{i},x_{j})=||x_{i}-x_{j}||_{1}=\sum_{u=1}^{n}|x_{iu}-x_{ju}|.

        \square连续属性:在定义域上有无穷多个可能的取值;

        \square离散属性:在定义域上是有限个取值。

        属性又可以划分为“有序属性”和“无序属性”,闵可夫斯基距离可用于有序属性,而对于无序属性,可采用VDM。

        假设m_{u,a}表示属性u上取值为a的样本数,m_{u,a,i}表示在第i个样本簇中在属性u上取值为a的样本数,k为样本簇数,那么属性u上两个离散值ab之间的VDM距离为

VDM_{p}(a,b)=\sum_{i=1}^{k}|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}|^{p}.

        当闵可夫斯基距离和VDM结合就可以处理混合属性。首先假设有n_{c}个有序属性、n-n_{c}个无序属性,且假设有序属性在无需属性之前,则

                             MinkovDM_{p}(x_{i},x_{j})

=(\sum_{u=1}^{n_{c}}|x_{iu}-x_{ju}|^{p}+\sum_{u=n_{c}+1}^{n}VDM_{p}(x_{iu},x_{ju}))^{\frac{1}{p}}.

        如果样本空间不同属性的重要性不相同,那么可以进行加权,如下

dist_{wmk}(x_{i},x_{j})=(w_{1}|x_{i1}-x_{j1}|^{p}+...+w_{n}|x_{in}-x_{jn}|^{p})^{\frac{1}{p}},

9.4  原型聚类

        原型聚类假设聚类结构可以用一组原型来刻画,先对原型进行初始化,然后对原型进行迭代更求解。

        9.4.1  k均值算法

        假设样本集D=\left \{ x_{1} ,x_{2},...,x_{m}\right \},簇划分为C=\left \{ C_{1},C_{2},...,C_{k} \right \},那么k均值最小化平方误差为

E=\sum_{i=1}^{k}\sum_{x\in C_{i}}^{}||x-\mu _{i}||_{2}^{2},

其中\mu _{i}=\frac{1}{|C_{i}|}\sum_{x\in C_{i}}^{}x是簇C_{i}的均值向量。上式描述的是簇内样本相对簇均值向量的紧密程度,E越小,那么簇内样本相似度越高。

        9.4.2  高斯混合聚类

        高斯混合聚类采用概率模型来表达聚类原型。对于n维样本空间\chi中的随机向量x,若x服从高斯分布,则概率密度函数为

p(x)=\frac{1}{(2\pi )^{\frac{n}{2}}|\sum |^{\frac{1}{2}}}e^{-\frac{1}{2}(x-\mu )^{T}\sum ^{-1}(x-\mu )},

其中\mu是n维均值向量,\sumn\times n的协方差矩阵。为方便表示,可将概率密度函数记为p(x|\mu ,\sum )。高斯混合分布为

p_{M}(x)=\sum_{i=1}^{k}\alpha _{i}p(x|\mu _{i},\sum _{i}),

该分布由k个混合成分组成,其中\mu _{i}\sum_{i}^{}是第i个高斯混合成分的参数,而\alpha _{i}> 0为相应的“混合系数”,\sum_{i=1}^{k}\alpha _{i}=1

        令随机变量z_{j}\in \left \{ 1,2,...,k \right \}表示生成样本x_{i}的高斯混合成分。其取值未知。根据贝叶斯定理,z_{j}的后验分布对应于

p_{M}(z_{j}=i|x_{j})=\frac{P(z_{j}=i)\cdot p_{M}(x_{j}|z_{j}=i)}{p_{M}(x_{j})}=\frac{\alpha _{i}\cdot p(x_{j}|\mu _{i},\sum _{i})}{\sum_{l=1}^{k}\alpha _{l}\cdot p(x_{j}|\mu _{l},\sum _{l})}

p_{M}(z_{j}=i|x_{j})给出了x_{j}由第i个高斯混合成分平生成的后验概率,简记为\gamma _{ji}(i=1,2,...,k)。高斯混合聚类样本集D划分为k个簇C=\left \{ C_{1},C_{2},...,C_{k} \right \},每个样本x_{j}的簇标记\lambda _{j}如下确定

\lambda _{j}=argmax_{i\in \left \{ 1,2,...,k \right \}}\gamma _{ji}.

        采用极大似然估计来求解模型参数\left \{ (\alpha _{i},\mu _{i},\sum _{i})|1\leqslant i\leqslant k \right \},如下

LL(D)=ln(\prod_{j=1}^{m}p_{M}(x_{j}))=\sum_{j=1}^{m}ln(\sum_{i=1}^{k}\alpha _{i}\cdot p(x_{j}|\mu _{j},\sum _{i}))

        若参数\left \{ (\alpha _{i},\mu _{i},\sum _{i})|1\leqslant i\leqslant k \right \}能是上述式子最大化,则\frac{\partial LL(D)}{\partial \mu _{i}}=0

\sum_{j=1}^{m}\frac{\alpha _{i}\cdot p(x_{j}|\mu _{i},\sum _{i})}{\sum_{l=1}^{k}\alpha _{l}\cdot p(x_{j}|\mu _{l},\sum _{l})}(x_{j}-\mu _{i})=0

以及\gamma _{ji}=p_{M}(z_{j}=i|x_{j}),有

\mu _{i}=\frac{\sum_{j=1}^{m}\gamma _{ji}x_{j}}{\sum_{j=1}^{m}\gamma _{ji}}

\frac{\partial LL(D)}{\partial \sum _{i}}=0可得

\sum _{i}=\frac{\sum_{j=1}^{m}\gamma _{ji}(x_{j}-\mu _{i})(x_{j}-\mu _{i})^{T}}{\sum_{j=1}^{m}\gamma _{ji}}

对于\alpha _{i},既要最大化LL(D),又要满足\alpha _{i}\geqslant 0\sum_{i=1}^{k}\alpha _{i}=1。LL(D)的拉格朗日形式为

LL(D)+\lambda (\sum_{i=1}^{k}\alpha _{i}-1)

上式对\alpha _{i}的导数为0,有

\sum_{j=1}^{m}\frac{\alpha _{i}\cdot p(x_{j}|\mu _{i},\sum _{i})}{\sum_{l=1}^{k}\alpha _{l}\cdot p(x_{j}|\mu _{l},\sum _{l})}+\lambda =0

两边同乘以\alpha _{i},对所有样本求和可知\lambda =-m,有

\alpha _{i}=\frac{1}{m}\sum_{j=1}^{m}\gamma _{ji}

        在每一步迭代中,先根据当前参数来计算每个样本属于高斯成分的后验概率\gamma _{ji},在通过前面式子更新模型参数\left \{ (\alpha _{i},\mu _{i},\sum _{i})|1\leqslant i\leqslant k \right \}

9.5  层次聚类

        层次聚类就是在不同层次对数据集进行划分,从而形成树形聚类结构。AGNES是自底向上聚合的层次聚类算法,它先把数据集样本看成初始聚类簇,接着在每一步中找出最近距离的两个聚类簇并且合并,不断重复直到达到预设聚类簇个数。假定聚类簇C_{i}C_{j},簇的距离计算如下

最小距离:d_{min}(C_{i},C_{j})=min_{x\in C_{i},z\in C_{j}}dist(x,z),

最大距离:d_{max}(C_{i},C_{j})=max_{x\in C_{i},z\in C_{j}}dist(x,z),

平均距离:d_{avg}(C_{i},C_{j})=\frac{1}{|C_{i}||C_{j}|}\sum_{x\in C_{i}}^{}\sum_{z\in C_{j}}^{}dist(x,z).

显然,最小距离由最近样本决定,最大距离由最远样本决定,平均距离由所有样本共同决定。如图所示,AGNES算法先对仅含一个样本的初始聚类簇和相应的距离矩阵进行初始化;AGNES不断合并距离最近的聚类簇,并对合并得到的聚类簇的距离矩阵进行更新;不断重复上述过程,直到达到预设的聚类簇数。

        以西瓜数据集4.0为例,令k=1,则可得到如图所示的“树状图”,其中每层链接一组聚类簇。

        将分割层逐步提升,则可以得到聚类簇逐渐减少的聚类结果,如图所示

9.6  试验

        k均值算法实现实现步骤:

        1.定义 k_means 函数,并且初始化聚类中心;

        2.迭代执行算法,直到达到最大迭代次数或聚类中心不再变化为止;

        3.计算距离并分配标签;

        4.生成 300 个随机的二维数据点(范围在 0 到 1 之间);

        5.设置聚类数并运行算法,最后得到可视化结果。

import numpy as np  
import matplotlib.pyplot as plt  

def k_means(X, k, max_iterations=100):  
    # 随机选择初始聚类中心  
    np.random.seed(42)  # 为了结果可重复  
    centroids = X[np.random.choice(X.shape[0], k, replace=False)]  

    for _ in range(max_iterations):  
        # 计算距离并分配标签  
        distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)  
        labels = np.argmin(distances, axis=1)  

        # 更新聚类中心  
        new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])  

        # 检查聚类中心是否有变化  
        if np.all(centroids == new_centroids):  
            break  
        centroids = new_centroids  

    return centroids, labels  

# 生成示例数据  
np.random.seed(42)  
X = np.random.rand(300, 2)  

# 设定聚类数  
k = 3  

# 运行k均值算法  
centroids, labels = k_means(X, k)  

# 绘制结果  
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o')  
plt.scatter(centroids[:, 0], centroids[:, 1], color='red', marker='X', s=200, label='Centroids')  
plt.title('K-Means Clustering')  
plt.xlabel('Feature 1')  
plt.ylabel('Feature 2')  
plt.legend()  
plt.show()  

        k均值算法运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值