介绍三类聚类分析算法,本篇介绍K均值聚类、层次聚类,下篇介绍图团体(graph community)聚类。
聚类分析又称群分析,它是研究样本分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法。聚类分析以相似性为基础,在一个聚类(cluster)中的样本模式之间比不在同一聚类中的样本模式之间具有更多的相似性
K均值聚类
算法描述:算法随机将每个样本分配到K聚类中的一类,然后计算每个聚类的平均值。接下来,它重新将每个样本分配到与其最接近的均值的聚类,然后再重新计算每个聚类的均值。然后不断重复这一步,直到不再需要新的分配为止。
我们通过下面的例子来学习这个算法。
例子中我们有统计了9位博主以及他们的文章数量,我们按文章的数量的相似度对这些博主进行聚类分析:
姓名 | 博客文章数量 |
---|---|
a | 20 |
b | 19 |
c | 1 |
d | 10 |
e | 15 |
f | 3 |
g | 21 |
h | 2 |
i | 13 |
K均值聚类算法的一个缺点是我们需要事先预测会有多少个聚类,也就是确定K的的取值,实际问题中,我们可以尝试K取不同的值,然后在具体问题的上下文中评价这几个聚类的效果,最后取效果最好的K值。这里,我们暂时先设置K=3.
算法过程如下:
1,随机把这些博主分成K=3三类,计算每类的平均文章数量:
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,c | (20+19+1)/3 = 13.3 |
2 | d,e,f | (10+15+3)/3 = 9.3 |
3 | g,h,i | (21+2+13)/3 = 12 |
2,遍历每一位博主,重新分配博主所在的类,使得博主的文章数与该类当前平均文章数距离最小,数值最接近。然后重新计算每类的平均文章数。
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,e,g,i | (20+19+15+21+13)/5 = 17.6 |
2 | c,d,f,h | (1+10+3+2)/4 = 4 |
3 | 0 |
3,不断重复第2步,直到不需要重新分类。
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,e,g,i | (20+19+15+21+13)/5=17.6 |
2 | d,f | (10+3)/2=6.5 |
3 | c,h | (1+2)/2=1.5 |
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,e,g,i | (20+19+15+21+13)/5=17.6 |
2 | d | 10 |
3 | c,f,h | (1+3+2)/3=2 |
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,e,g | (20+19+15+21)/4 = 18.8 |
2 | d | 10 |
3 | c,f,h,i | (1+3+2+13)/4 = 4.8 |
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,e,g | (20+19+15+21)/4 = 18.8 |
2 | d,i | (10+13)/2 = 11.5 |
3 | c,f,h | (1+3+2)/3=2 |
类号 | 类成员 | 类平均文章数量 |
---|---|---|
1 | a,b,g | (20+19+21)/3=20 |
2 | d,e,i | (10+15+13)/3 = 12.7 |
3 | c,f,h | (1+3+2)/3=2 |
4,聚类过程完成:可以发现,达到上面最后聚类状态后,每位博主的类就不再变化,每类的平均文章数量也不在出现变化。而且同一类中的博主,文章数量比较接近,不同类的博主文章数量相差较大。从聚类结果可以看出哪些博主属于比较活跃的博主,哪些是相对不活跃的博主。
补充说明:
1,读者可以按照这种方式,自己推导看看K=2的时候,算法过程是怎样的。
2,上面所描述的算法还有一些变体。最初的「种子」聚类可以通过多种方式完成。这里,我们是把所有博主随机分成K类,然后计算每类的均值。这会导致最初的均值可能会彼此接近,这会增加后面迭代的次数。(随机选初始点会增加计算量)
另一种选择种子聚类的方法是每类仅分配一个数据,然后开始将其他数据分配到与其最接近的类。这样返回的聚类是更敏感的初始种子,从而减少了高度变化的数据集中的重复性。这种方法有可能减少完成该算法所需的迭代次数,因而这些分类实现收敛的时间会变得更少。
3,K-均值聚类的一个明显限制是你必须事先设置K的取值,也就是事先预测类别数量。如何选择K值呢?目前存在一些用于评估聚类效果的方法。比如说,聚类内平方和(Within-Cluster Sum-of-Squares)可以测量每个聚类内的方差。聚类越好,整体WCSS就越低。但要知道评估的标准不止这一个。
层次聚类
我们依然使用上面的博主数据来分析层次聚类:
姓名 | 博客文章数量 |
---|---|
a | 20 |
b | 19 |
c | 1 |
d | 10 |
e | 15 |
f | 3 |
g | 21 |
h | 2 |
i | 13 |
算法过程
1,计算博主之间文章数量距离矩阵,在本案例中使用的是欧氏空间距离(Euclidean distance)
- | a(20) | b(19) | c(1) | d(10) | e(15) | f(3) | g(21) | h(2) | i(13) |
---|---|---|---|---|---|---|---|---|---|
a(20) | – | ||||||||
b(19) | 1 | – | |||||||
c(1) | 19 | 18 | – | ||||||
d(10) | 10 | 9 | 9 | – | |||||
e(15) | 5 | 4 | 14 | 5 | – | ||||
f(3) | 17 | 16 | 2 | 7 | 12 | – | |||
g(21) | 1 | 2 | 20 | 11 | 6 | 18 | – | ||
h(2) | 18 | 17 | 1 | 8 | 13 | 1 | 19 | – | |
i(13) | 7 | 6 | 12 | 3 | 2 | 10 | 8 | 11 | – |
2,将矩阵中距离最小的两个博主合并,计算两位博主的平均文章数量。两位博主合并后一起参与计算;首先我们合并a,b两位博主,他们的平均文章数量是19.5:
- | ab(19.5) | c(1) | d(10) | e(15) | f(3) | g(21) | h(2) | i(13) |
---|---|---|---|---|---|---|---|---|
ab(19.5) | – | |||||||
c(1) | 18.5 | – | ||||||
d(10) | 9.5 | 9 | – | |||||
e(15) | 4.5 | 14 | 5 | – | ||||
f(3) | 16.5 | 2 | 7 | 12 | – | |||
g(21) | 1.5 | 20 | 11 | 6 | 18 | – | ||
h(2) | 17.5 | 1 | 8 | 13 | 1 | 19 | – | |
i(13) | 6.5 | 12 | 3 | 2 | 10 | 8 | 11 | – |
3,重复第2步:
合并c,h:
- | ab(19.5) | ch(1.5) | d(10) | e(15) | f(3) | g(21) | i(13) |
---|---|---|---|---|---|---|---|
ab(19.5) | – | ||||||
ch(1.5) | 18 | – | |||||
d(10) | 9.5 | 8.5 | – | ||||
e(15) | 4.5 | 13.5 | 5 | – | |||
f(3) | 16.5 | 1.5 | 7 | 12 | – | ||
g(21) | 1.5 | 19.5 | 11 | 6 | 18 | – | |
i(13) | 6.5 | 11.5 | 3 | 2 | 10 | 8 | – |
合并ch,和f:
- | ab(19.5) | cfh(2) | d(10) | e(15) | g(21) | i(13) |
---|---|---|---|---|---|---|
ab(19.5) | – | |||||
cfh(2) | 17.5 | – | ||||
d(10) | 9.5 | 8 | – | |||
e(15) | 4.5 | 13 | 5 | – | ||
g(21) | 1.5 | 19 | 11 | 6 | – | |
i(13) | 6.5 | 11 | 3 | 2 | 8 | – |
合并ab,和g:
- | abg(20) | cfh(2) | d(10) | e(15) | i(13) |
---|---|---|---|---|---|
abg(20) | – | ||||
cfh(2) | 18 | – | |||
d(10) | 10 | 8 | – | ||
e(15) | 5 | 13 | 5 | – | |
i(13) | 7 | 11 | 3 | 2 | – |
合并e,i:
- | abg(20) | cfh(2) | d(10) | ei(14) |
---|---|---|---|---|
abg(20) | – | |||
cfh(2) | 18 | – | ||
d(10) | 10 | 8 | – | |
ei(14) | 6 | 12 | 4 | – |
合并ei,d:
- | abg(20) | cfh(2) | dei(12.7) |
---|---|---|---|
abg(20) | – | ||
cfh(2) | 18 | – | |
dei(12.7) | 7.3 | 10.7 | – |
合并abg,edi:
- | abdegi(16.3) | cfh(2) |
---|---|---|
abdegi(16.3) | – | |
cfh(2) | 14.3 | – |
最后,全部合并:
- | abcdefghi(11.5) |
---|---|
abcdefghi(11.5) | – |
我们得到一个树状的结构:
补充说明:
1,最后的树状图中每个节点由两个子节点聚合而形成,小括号内的数字表示两个子节点聚合时的距离。
2,每个节点表示一种聚合而成的类型。
3,可以通过控制聚合距离的阈值,来控制聚合的程度。阈值越小,聚合的类型越多,每个类型的内聚度越高,阈值越大,聚合的类型越少,每个类型的内聚度越低。例如我们设置阈值为1,那么最后聚合的类型为ab,ch,d,e,i;距离阈值为2时,最后聚合的类型为abg, cfh, d, ei;聚合阈值为4时候,最后聚合的类型为abg, cfh, dei,可以看到,这个结果与k-means的结果一样了。