角度I:
角度II:
假定样本集 \(D\) 包含 \(n\) 个无标记样本:
\[D = \{x_1, x_2, \ldots, x_n\}\]
每个样本是一个 \(p\) 维特征向量:
\[x_i=(x_{i1}; x_{i2}; \ldots; x_{ip})\]
聚类算法将样本集 \(D\) 划分为 \(k\) 个不相交的簇:
\[\{C_l|l=1, 2, \ldots, k\}\]
其中: \(C_{l^{'}} \cap_{l^{'} \neq l} C_{l} = \emptyset\) 且 \(D=\cup_{l=1}^{k}C_{l}\)
相应的,用
\[\lambda_{i} \in \{1, 2, \ldots, k\}\]
表示样本 \(x_{i}\) 的“簇标记”(cluster label), 即
\[x_{i} \in C_{\lambda_{i}}\]
于是,聚类的结果可用包含 \(n\) 个元素的簇标记向量表示
\[\lambda=(\lambda_{1}; \lambda_{2}, \ldots, \lambda_{n})\]
聚类性能度量亦称聚类“有效性指标”(validity index).
设置聚类性能度量的目的:
什么样的聚类结果比较好?
聚类性能度量分类:
性能度量指标:
(1) 外部指标
对数据集 \(D = \{x_1, x_2, \ldots, x_n\}\), 假定通过聚类给出的簇划分为 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\), 参考模型给出的簇划分为\(C^{*}=\{C_{1}^{*}, C_{2}^{*}\, \ldots, C_{k}^{*}\}\). 相应地,令 \(\lambda\)与\(\lambda^{*}\) 分别表示与 \(C\) 和 \(C^{*}\) 对应的簇标记向量,将样本两两配对考虑,定义:
\[a=|SS|, SS=\{(x_{i}, x_{j}) | \lambda_{i}=\lambda_{j}, \lambda_{i}^{*}=\lambda_{j}^{*}, i<j\}\] \[b=|SD|, SD=\{(x_{i}, x_{j}) | \lambda_{i}=\lambda_{j}, \lambda_{i}^{*} \neq \lambda_{j}^{*}, i<j\}\] \[c=|DS|, DS=\{(x_{i}, x_{j}) | \lambda_{i} \neq \lambda_{j}, \lambda_{i}^{*}=\lambda_{j}^{*}, i<j\}\] \[d=|DD|, DD=\{(x_{i}, x_{j}) | \lambda_{i} \neq \lambda_{j}, \lambda_{i}^{*} \neq \lambda_{j}^{*}, i<j\}\]
其中:
这样,由于每个样本对 \((x_{i}, x_{j})(i<j)\) 仅能出现在一个集合中,因此有:
\[a+b+c+d=n(n-1)/2\]
- Jaccard系数(Jaccard Coefficient 简称JC)
\[JC=\frac{a}{a+b+c}\]
- FM指数(Fowlkes and Mallows Index 简称JMI)
\[FMI=\sqrt{\frac{a}{a+b} \cdot \frac{a}{a+c}}\]
- Rand指数(Rand Index 简称RI)
\[RI=\frac{2(a+d)}{n(n-1)}\]
说明:
上述性能度量指标的结果值均在\([0,1]\)区间,值越大越好。
(2) 内部指标
根据聚类结果的簇划分 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\) ,定义:
\[avg(C)=\frac{2}{|C|(|C|-1)}\sum_{1<i<j<|C|}dist(x_{i}, x_{j})\]
\[diam(C)=max_{1<i<j<|C|}dist(x_{i}, x_{j})\]
\[d_{min}(C_{i}, C_{j})=min_{1<i<j<|C|}dist(x_{i}, x_{j}\]
\[d_{cen}(C_{i}, C_{j})=dist(\mu_{i}, \mu_{j})\]
其中:
- DB指数(Davies-Bouldin Index 简称DBI)
\[DBI=\frac{1}{k}\sum^{k}_{i=1}\underset{j \neq i}{max}\bigg(\frac{avg(C_{i})+avg(C_{j})}{d_{cen(\mu_{i}, \mu_{j})]}}\bigg)\]
- Dunn指数(Dunn Index 简称DI)
\[DI=\underset{1 \leqslant i \leqslant k}{min}\bigg\{\underset{j \neq i}{min}\bigg(\frac{d_{min}(C_{i}, C_{j})}{max_{1 \leqslant l \leqslant k}diam(C_{l})}\bigg)\bigg\}\]
说明:
- DBI的值越小越好
- DI的值越大越好
距离度量(distance measure)函数 \(dist(,)\) 需满足的基本性质:
变量属性:
(1) 闵可夫斯基距离(Minkowski distance)
样本:
\[x_{i}=(x_{i1}, x_{i2}, \ldots, x_{ip})\] \[x_{j}=(x_{j1}, x_{j2}, \ldots, x_{jp})\]
\[dist_{mk}(x_{i}, x_{j})=\bigg(\sum_{u=1}^{p}|x_{iu}-x_{ju}|^{q}\bigg)^{\frac{1}{q}}, \quad q \geqslant 1\]
\[dist_{man}(x_{i}, x_{j})=\|x_{i}-x_{j}\|_{1}=\sum^{p}_{u=1}|x_{iu}-x_{ju}|\]
\[dist_{ed}(x_{i}, x_{j})=\|x_{i}-x_{j}\|_{2}=\sqrt{\sum^{p}_{u=1}|x_{iu}-x_{ju}|^{2}}\]
(2) VDM(Value Difference Metric)
令 \(m_{u,a}\) 表示在属性 \(u\) 上取值为 \(a\) 的样本数,\(m_{u, a, i}\) 表示在第 \(i\) 个样本簇中在属性 \(u\) 上取值为 \(a\) 的样本数,\(k\) 为样本簇数,则属性 \(u\) 上两个离散值 \(a\) 与 \(b\) 之间的VDM距离为:
\[VDM_{q}(a, b)=\sum^{k}_{i=1}\bigg|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}\bigg|^{q}\]
(3) 闵可夫斯基距离与VDM混合距离
假设有 \(p_{c}\) 个有序属性,\(p-p_{c}\)个无序属性,有序属性排列在无序属性之前:
\[MinkovDM_{q}(x_{i}, x_{j})=\bigg(\sum^{p_{c}}_{u=1}|x_{i,u}-x_{j,u}|^{q}+\sum^{p}_{u=p_{c}+1}VDM_{q}(x_{i,u},x_{j,u})\bigg)^{\frac{1}{q}}\]
(4) 加权闵可夫斯基距离
当样本在空间中不同属性的重要性不同时:
\[dist_{wmk}(x_{i}, x_{j})=(w_{1}\cdot|x_{i1}-x_{j1}|^{q}+w_{2}\cdot|x_{i2}-x_{j2}|^{q}+\ldots+w_{n}\cdot|x_{in}-x_{jn}|^{q})^{\frac{1}{q}}\]
其中: 权重\(w_{i}\geqslant 0(i=1, 2, \ldots, p)\) 表示不同属性的重要性,通常\(\sum_{i=1}^{n}w_{i}=1\).
聚类算法类型:
基于原型的聚类(Prototype-based Clustering), 此类算法假设聚类结构能通过一组原形刻画. 通常情况下, 算法先对原型进行初始化, 然后对原型进行迭代更新求解, 采用不同的原型表示, 不同的求解方式,将产生不同的算法.
给定样本集 \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\), K-means 算法针对聚类所得簇划分\(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\), 最小化平方误差:
\[E = \sum^{k}_{i=1}\sum_{x \in C_{i}}\|x-\mu_{i}\|_{2}^{2}\]
其中 \(\mu_{i}\) 是簇 \(C_{i}\) 的均值向量:
\[\mu_{i}=\frac{1}{|C_{i}|}\sum_{x \in C_{i}}x\]
直观上看, 平方误差在一定程度上刻画了簇内样本围绕均值向量的紧密程度, \(E\) 值越小簇内样本相似度越高。但最小化 \(E\) 不容易,是一个NP难问题, K-means 算法采用了贪心策略,通过迭代优化来近似求解 \(E\) 的最小值。具体算法如下:
算法
输入:
样本集: \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\);
聚类簇数: \(k\).
过程:
- 从中随机取出 \(k\) 个样本作为初始均值向量: \(\{\mu_{1}, \mu_{2}, \ldots,\mu_{k}\}\)
- repeat
- 令 \(C_{i}=\emptyset (1 \leqslant i \leqslant k)\)
- for \(j=1, 2, \ldots, n\) do
- 计算样本 \(x_{j}\) 与各均值向量 \(\mu_{i} (1 \leqslant i \leqslant k)\) 的距离: \(d_{ji}=\|x_{j}-\mu_{i}\|_{2}\);
- 根据距离最近的均值向量确定 \(x_{j}\) 的簇标记 \(\lambda_{j}=arg min_{i \in \{1, 2, \ldots, k\}}d_{ji}\);
- 将样本 \(x_{j}\) 划入相应的簇: \(C_{\lambda_{j}}=C_{\lambda_{j}} \cup \{x_{j}\}\);
- end for
- for \(i=1, 2, \ldots, k\) do
- 计算新均值向量: \(\mu_{i}^{'}=\frac{1}{|C_{i}|}\sum_{x \in C_{i}}x\);
- if \(\mu_{i}^{'} \neq \mu_{i}\) then
- 将当前均值向量 \(\mu_{i}\) 更新为 \(\mu_{i}^{'}\)
- else
- 保持当前均值向量不变
- end if
- end for
- until 当前均值向量均未更新
输出:
簇划分 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\),
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
After a little bit of exploration, I found that Petal.Length and Petal.Width were similar among the same species but varied considerably between different species, as demonstrated below:
library(ggplot2)
ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) + geom_point()
set.seed(20)
irisCluster <- kmeans(iris[, 3:4], centers = 3, nstart = 20)
irisCluster
## K-means clustering with 3 clusters of sizes 50, 52, 48
##
## Cluster means:
## Petal.Length Petal.Width
## 1 1.462000 0.246000
## 2 4.269231 1.342308
## 3 5.595833 2.037500
##
## Clustering vector:
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [71] 2 2 2 2 2 2 2 3 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3
## [106] 3 2 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 2 3
## [141] 3 3 3 3 3 3 3 3 3 3
##
## Within cluster sum of squares by cluster:
## [1] 2.02200 13.05769 16.29167
## (between_SS / total_SS = 94.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss"
## [5] "tot.withinss" "betweenss" "size" "iter"
## [9] "ifault"
table(irisCluster$cluster, iris$Species)
##
## setosa versicolor virginica
## 1 50 0 0
## 2 0 48 4
## 3 0 2 46
irisCluster$cluster <- as.factor(irisCluster$cluster)
ggplot(iris, aes(Petal.Length, Petal.Width, color = irisCluster$cluster)) + geom_point()
LVQ 假设数据样本带有类别标记, 学习过程利用样本的这些监督信息来辅助聚类。
给定样本集 \(D=\{(x_{1}, y_{1}), (x_{2}, y_{2}), \ldots, (x_{n}, y_{n})\}\), \(x_{i} \in R^{p}\), \(y_{i} \in \mathcal{Y}\)是样本的类别标记. LVQ的目标是学得一组\(n\)维原型向量\(\{p_{1}, p_{2}, \ldots, p_{q}\}\), 每个原型向量代表一个聚类簇,簇标记为\(t_{i}\in \mathcal{Y}\).
算法
输入:
样本集: \(D=\{(x_{1}, y_{1}), (x_{2}, y_{2}), \ldots, (x_{n}, y_{n})\}\);
原型向量个数 \(q\), 各原型向量预设的类标记 \(\{t_{1}, t_{2}, \ldots, t_{q}\}\);
学习率\(\eta \in (0,1)\).
过程:
- 初始化一组原型向量:\(\{p_{1}, p_{2},\ldots,p_{q}\}\)
- repeat
- 从样本集中随机选取样本 \((x_{j}, y_{j})\);
- 计算样本 \(x_{j}\) 与 \(p_{i} (1 \leqslant i \leqslant q)\) 的距离: \(d_{ji}=\|x_{j}-p_{i}\|_{2}\);
- 找出与 \(x_{j}\) 距离最近的原型向量 \(p_{i^{*}}\), \(i^{*}=arg min_{i \in \{1, 2, \ldots, q\}}d_{ji}\);
- if \(y_{j}=t_{i^{*}}\)
- \(p' = p_{i^{*}} + \eta \cdot (x_{j}-p_{i^{*}})\)
- else
- \(p' = p_{i^{*}} - \eta \cdot (x_{j}-p_{i^{*}})\)
- end if
- 将原型向量 \(p_{i^{*}}\) 更新为 \(p'\)
- until 满足停止条件
输出:
原型向量 \(\{p_{1}, p_{2}, \ldots, p_{q}\}\),
算法解释
高斯混合聚类(Mixture-of-Gaussian)采用概率模型来表达聚类原型.
对 \(n\) 维样本空间 \(\mathcal{X}\) 中的随机向量 \(x\), 若 \(x\) 服从(多元)高斯分布, 其概率密度函数为:
\[p(x| \mu, \Sigma)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} e^{ - \frac{1}{2} (x-\mu)^{T} \Sigma^{-1} (x-\mu)}\]
其中:\(\mu\) 是\(n\) 维均值向量, \(\Sigma\) 是 \(n \times n\) 协方差矩阵.
对 \(n\) 维样本空间 \(\mathcal{X}\) 中的随机向量 \(x\), 若 \(x\) 服从(多元)高斯混合分布, 其概率密度函数为:
\[p_{\mathcal{M}}(x)=\sum_{i=1}^{k}\alpha_{i} \cdot p(x| \mu_{i}, \Sigma_{i})\]
该分布由 \(k\) 个混合成分组成,每个成分对应一个(多元)高斯分布,
其中:\(\mu_{i}\), \(\Sigma_{i}\) 是第 \(i\) 个高斯混合成分的参数, 而 \(\alpha_{i}\) 为相应的“混合系数”(mixture coeffcient), \(\sum_{i=1}^{k}\alpha_{i}=1\).
假设样本集 \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\) 的生成过程有高斯混合分布给出:
令随机变量 \(z_{j} \in \{1, 2, \ldots,k\}\) 表示生成样本 \(x_{j}\) 的高斯混合成分, 其取值未知.
\(z_{j}\) 的先验概率:
\[P(z_{j}=i)=\alpha_{i} \quad (i=1, 2, \ldots,k)\].
由Bayesian定理得 \(z_{j}\) 的后验分布为:
\[\begin{align*} P_{\mathcal{M}}(z_{j}=i|x_{j}) &=\frac{P(z_{j}=i) \cdot p_{\mathcal{M}}(x_{j}|z_{j}=i)}{p_{\mathcal{M}}(x_{j})}\\ &=\frac{\alpha_{i}\cdot p(x_{j}|\mu_{i},\Sigma_{i})}{\sum^{k}_{l=1}\alpha_{l}\cdot p(x_{j}|\mu_{l},\Sigma_{l})} \end{align*}\]
\(P_{\mathcal{M}}(z_{j}=i|x_{j})\) 给出了样本 \(x_{j}\) 由第 \(i\) 个高斯混合成分生成的后验概率, 记:
\[\gamma_{ji}=P_{\mathcal{M}}(z_{j}=i|x_{j}) \quad (i=1, 2, \ldots,k)\]
\[C=\{C_{1}, C_{2}, \ldots,C_{k}\}\]
每个样本 \(x_{j}\) 的簇标记 \(\lambda_{j}\) 为:
\[\lambda_{j}=arg \underset{i \in \{1, 2, \ldots,k\}}{max}\gamma_{ji}\]
给定样本集 \(D\), 最大化(对数)似然函数:
\[\begin{align*} LL(D)&=ln\Big(\prod^{n}_{j=1}p_{\mathcal{M}}(x_{j})\Big)\\ &=\sum^{n}_{j=1}\Big(\sum^{k}_{i=1}\alpha_{i}\cdot p(x_{j}|\mu_{i}, \Sigma_{i})\Big) \end{align*}\]
MLE解为:
\[\mu_{i}=\frac{\sum^{n}_{j=1}\gamma_{ji}x_{j}}{\sum^{n}_{j=1}\gamma_{ji}}\] \[\Sigma_{i}=\frac{\sum^{n}_{j=1}\gamma_{ji}(x_{j}-\mu_{i})(x_{j}-\mu_{i})^{T}}{\sum^{n}_{j=1}\gamma_{ji}}\] \[\alpha_{i}=\frac{1}{n}\sum^{n}_{j=1}\gamma_{ji}\]
输入:
样本集: \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\);
高斯混合成分个数 \(k\).
过程:
- 初始化高斯混合分布的模型参数 : \(\{(\alpha_{i},\mu_{i}, \Sigma_{i})|1 \leqslant i \leqslant k\}\)
- repeat
- for \(j=1, 2, \ldots, n\) do
- 根据()计算 \(x_{j}\) 由各混合成分生成的后验概率, 即 \(\gamma_{ji}=p_{\mathcal{M}}(z_{j}=i|x_{j})(1 \leqslant i \leqslant k)\)
- end for
- for \(i=1, 2, \ldots, k\) do
- 计算新均值向量: \(\mu_{i}'=\frac{\sum^{n}_{j=1}\gamma_{ji}x_{j}}{\sum^{n}_{j=1}\gamma_{ji}}\);
- 计算新协方差矩阵: \(\Sigma_{i}'=\frac{\sum^{n}_{j=1}\gamma_{ji}(x_{j}-\mu_{i}')(x_{j}-\mu_{i}')^{T}}{\sum^{n}_{j=1}\gamma_{ji}}\);
- 计算新混合系数: \(\alpha_{i}'=\frac{\sum^{n}_{j=1}\gamma_{ji}}{n}\);
- end for
- 将模型参数 \(\{(\alpha_{i},\mu_{i}, \Sigma_{i})|1 \leqslant i \leqslant k\}\) 更新为 \(\{(\alpha_{i}',\mu_{i}', \Sigma_{i}')|1 \leqslant i \leqslant k\}\)
- until 满足停止条
- \(C_{i}=\emptyset (1 \leqslant i \leqslant k)\)
- for \(j=1, 2, \ldots, n\) do
- 根据()确定 \(x_{j}\) 的簇标记 \(\lambda_{j}\);
- 将 \(x_{j}\) 划入相应的簇: \(C_{\lambda_{j}}=C_{\lambda_{j}} \cup \{x_{j}\}\)
- end for
输出:
簇划分 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\)
基于密度的聚类(Density-based Clustering)假设聚类结构能通过样本分布的紧密程度确定.密度聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连续样本不断扩展聚类簇以获得最终的聚类结果.
DBSCAN (Density-Based Spatial Clustering of Application with Noise):
基于一组“邻域 (neighborhood)”参数 \((\epsilon, MinPts)\) 来刻画样本分布的紧密程度.
给定数据集 \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\), 定义:
基于这些概念, DBSCAN 将“簇”定义为:由密度可达关系导出的最大的密度相连样本集合。形式化的说:给定邻域参数\((c, MinPts)\),簇 \(C \subseteq D\) 是满足以下性质的非空样本子集:
从数据集 \(D\) 中找出满足以上性质的聚类簇:
若 \(x\) 为核心对象,由 \(x\) 密度可达的所有样本组成的集合记为 \(X=\{x' \in D | x'由x密度可达\}\), 则不难证明 \(X\) 即为满足连续性与最大性的簇.
输入:
样本集: \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\);
领域参数 \((c, MinPts)\).
过程:
- 初始化核心对象集合:\(\Omega=\emptyset\)
- for \(j=1, 2, \ldots, n\) do
- 确定样本 \(x_{j}\) 的 \(\epsilon\)-领域 \(N_{\epsilon}(x_{j})\)
- if \(|N_{\epsilon}(x_{j})|\geqslant MinPts\) then
- 将样本 \(x_{j}\) 加入核心对象集合:\(\Omega=\Omega\cup\{x_{j}\}\)
- end if
- end for
- 初始化聚类簇数:\(k=0\)
- 初始化未访问样本集合 \(\Gamma=D\)
- while \(\Omega\neq\emptyset\) do
- 记录当前未访问样本集合 \(\Gamma_{old}=\Gamma\);
- 随机选取一个核心对象 \(o\in\Omega\),初始化队列 \(Q=<o>\);
- \(\Gamma=\Gamma \setminus \{o\}\)
- while \(Q\neq\emptyset\) do
- 取出队列 \(Q\) 中的首个样本 \(q\);
- if \(|N_{\epsilon}(q)|\geqslant MinPts\) then
- 令 \(\Delta=N_{\epsilon}(q) \cap \Gamma\);
- 将 \(\Delta\) 中的样本加入队列 \(Q\);
- \(\Gamma=\Gamma \setminus \Delta\);
- end if
- end while
- \(k=k+1\), 生成聚类簇 \(C_{k}=\Gamma_{old} \setminus \Gamma\);
- \(\Omega=\Omega \setminus C_{k}\)
- end while
输出:
簇划分 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\)
算法说明:
OPTICS和DBSCAN聚类相同,都是基于密度的聚类,但是,OPTICS的好处在于可以处理不同密度的类,结果有点像基于连通性的聚类,不过还是有些区别的. 上段伪代码:
层次聚类(Hierarchical Clustering) 也称为基于连通性的聚类。这种算法试图在不同层次对数据进行划分,从而形成树形的聚类结构。
数据集的划分采用不同的策略会生成不同的层次聚类算法:
AGNES(Agglomerative Nesting)是一种采用自底向上聚合策略的层次聚类算法,算法的步骤为:
这个算法的关键是如何计算两点之间以及两个聚类簇之间的距离
names | Eng. | formula |
---|---|---|
欧氏距离 | Euclidean distance | \(\|x-y\|_2 = \sqrt{\sum_i (x_i-y_i)^2}\) |
平方欧氏距离 | Squared Euclidean distance | \(\|x-y\|_2^2 = \sum_i (x_i-y_i)^2\) |
曼哈顿距离 | Manhattan distance | \(\|x-y\|_1 = \sum_i |x_i-y_i|\) |
马氏距离(统计距离) | Mahalanobis distance | \(\sqrt{(x-y)^{T} \Sigma^{-1}(x-y)}\) |
极大值距离 | Maximum distance | \(\|x-y\|_{\infty} = {max}_{i} |x_i-y_i|\) |
dist(x, method = "euclidean", diag = FALSE, upper = FALSE, p = 2)
## Default S3 method:
as.dist(m, diag = FALSE, upper = FALSE)
## S3 method for class 'dist'
print(x,
diag = NULL,
upper = NULL,
digits = getOption("digits"),
justify = "none",
right = TRUE,
...)
## S3 method for class 'dist'
as.matrix(x, ...)
算法:
输入:
样本集: \(D=\{x_{1}, x_{2}, \ldots, x_{n}\}\);
聚类簇距离度量函数 \(d\);
聚类簇数 \(k\).
过程:
- for \(j=1, 2, \ldots, n\) do
- \(C_{j}=\{x_{j}\}\)
- end for
- for \(i=1, 2, \ldots, n\) do
- for \(j=1, 2, \ldots, n\) do
- \(M(i,j)=d(C_{i}, C_{j})\);
- \(M(i,j)=M(j,i)\)
- end for
- end for
- 设置当前聚类簇个数:\(q=n\)
- while \(q>k\) do
- 找出距离最近的两个聚类簇 \(C_{i^{*}}\) 和 \(C_{j^{*}}\);
- 合并 \(C_{i^{*}}\) 和 \(C_{j^{*}}\) : \(C_{i^{*}}=C_{i^{*}} \cup C_{j^{*}}\);
- for \(j=j^{*}+1,j^{*}+2, \ldots, q\) do
- 将聚类簇 \(C_{j}\) 重编号为 \(C_{j-1}\)
- end for
- 删除距离矩阵 \(M\) 的 第 \(j^{*}\) 行与第 \(j^{*}\) 列;
- for \(j=1, 2, \ldots, q-1\) do
- \(M(i^{*},j)=d(C_{i^{*}}, C_{j})\);
- \(M(j,i^{*})=M(i^{*},j)\)
- end for
- \(q=q-1\)
- end while 输出:
簇划分 \(C=\{C_{1}, C_{2}, \ldots, C_{k}\}\),
METHOD : Method Complete linkage clustering :
clusters <- hclust(dist(iris[, 3:4]))
plot(clusters)
clusterCut <- cutree(clusters, 3)
table(clusterCut, iris$Species)
##
## clusterCut setosa versicolor virginica
## 1 50 0 0
## 2 0 21 50
## 3 0 29 0
METHOD : Method Mean linkage clustering :
clusters <- hclust(dist(iris[, 3:4]), method = 'average')
plot(clusters)
clusterCut <- cutree(clusters, 3)
table(clusterCut, iris$Species)
##
## clusterCut setosa versicolor virginica
## 1 50 0 0
## 2 0 45 1
## 3 0 5 49
library(ggplot2)
ggplot(iris, aes(Petal.Length, Petal.Width, color = iris$Species)) +
geom_point(alpha = 0.4, size = 3.5) +
geom_point(col = clusterCut) +
scale_color_manual(values = c('black', 'red', 'green'))