数量生态学笔记||非层次聚类

上回说到数量生态学笔记||层次聚类,在聚类算法中层次聚类是比较长常用的。它的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。在另一类聚类中并不需要分层次,仅对一组对象简单分组,尽量使组内对象之间比组间对象之间的相似度更高。

本小节介绍两种非层次聚类算法,k-均值划分(k-means);围绕中心点划分(PAM)。此处需要注意的是,不同纲量的变量在进行非层次聚类之前应该进行标准化,因为方差的纲量等于变量纲量的平方,如果不标准化,方差无意义。

k-均值划分

k-均值划分使用数据局部结构构建聚类簇:通过确认数据高密度区构建分类组。K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。

算法过程:

  • 选定 K 个中心 μk的初值。这个过程通常是针对具体的问题有一些启发式的选取方法,或者大多数情况下采用随机选取的办法。因为k-means并不能保证全局最优,而是否能收敛到全局最优解其实和初值的选取有很大的关系,所以有时候我们会多次选取初值跑 k-means,并取其中最好的一次结果。
  • 将每个数据点归类到离它最近的那个中心点所代表的 cluster 中。
    用公式


计算出每个 cluster 的新的中心点。

  • 重复第二步,一直到迭代了最大的步数或者前后的 J 的值相差小于一个阈值为止。

[k-means百科]https://baike.baidu.com/item/K-means/4934806)
深入理解K-Means聚类算法

k-均值划分是一种线性方法,因此不适用于含有很多零值的原始数据。遇到这样的数据,我们可以先对其进行预转化。为了与之前聚类分析的对象保持一致,可以使用之前已经范数标准化后的物种数据作为案例。

首先,载入数据:

# 加载所需的程序包
library(ade4)
library(vegan)  # 应该先加载ade4后加载vegan以避免冲突
library(gclus)
library(cluster)
library(RColorBrewer)
library(labdsv)
library(mvpart)
library(MVPARTwrap) # MVPARTwrap这个程序包必须从本地zip文件安装
# 导入CSV格式的数据

rm(list = ls())
setwd("D:\\Users\\Administrator\\Desktop\\RStudio\\数量生态学\\DATA")

spe <- read.csv("DoubsSpe.csv", row.names=1)
env <- read.csv("DoubsEnv.csv", row.names=1)
spa <- read.csv("DoubsSpa.csv", row.names=1)
# 删除无物种数据的样方8
spe <- spe[-8,]
env <- env[-8,]
spa <- spa[-8,]
# 物种多度数据:先计算样方之间的弦距离矩阵,然后进行单连接聚合聚类
# **************************************************************
spe.norm <- decostand(spe, "normalize")
spe.ch <- vegdist(spe.norm, "euc")
spe.ch.single <- hclust(spe.ch, method="single")

为了与之前的Ward聚类结果比较,设定k=4组进行k-均值划分,并将其结果与ward结果进行比较。

# 预转化后物种数据k-均值划分
# ****************************
spe.kmeans <- kmeans(spe.norm, centers=4, nstart=100)
#注意:即使给定的nstart相同,每次运行上述命令,所产生的结果也不一定
#完全相同,因为每次运算设定的初始结构是随机的。
# 比较当前分4组的分类结果与之前Ward聚类的结果。
table(spe.kmeans$cluster, spebc.ward.g)
   spebc.ward.g
     1  2  3  4
  1 11  1  0  0
  2  0  0  0  3
  3  0  6  0  0
  4  0  0  8  0
 #这两个聚类结果是否非常相似?哪个(或哪些)对象有差别?
 spe.kmeans$cluster
 1  2  3  4  5  6  7  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
 1  1  1  1  3  1  1  3  1  1  1  1  1  1  3  3  3  3  4  4  4  2  2  2  4  4  4  4  4 
 spebc.ward.g
 1  2  3  4  5  6  7  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
 1  1  1  1  2  1  1  2  1  1  1  1  1  2  2  2  2  2  3  3  3  4  4  4  3  3  3  3  3  
#这两个聚类结果是否非常相似?哪个(或哪些)对象有差别?

对于那些无法从原始数据转化后进行欧式距离计算的距离指数(如bray-curtis),必须先将原始的距离矩阵通过主坐标分析(PCoA)获得一个n行的数据表格,然后在进行k-均值划分。

# k-均值划分,2组到10组
# ************************
spe.KM.cascade <- cascadeKM(spe.norm, inf.gr=2, sup.gr=10, iter=100, 
  criterion="ssi")
plot(spe.KM.cascade, sortg=TRUE,border="white")
#该图显示每个对象在每种分类组数下的归属(图上每行代表一种组数)。图
#内的表格有不同的颜色,每行两种颜色,代表分两组k=2,三种颜色代表k=3,#依此类推。右图代表不同k值条件下的中止标准的统计量。此系列中,到底
#多少组数是最佳方案?如果倾向于较大的组数,哪个是最佳方案呢?

函数casecadeKM()也提供数据结果。其中result给出每种组数k条件下的tess统计量和准则的值,其中partition包含每个组类所含对象的信息。

summary(spe.KM.cascade)
spe.KM.cascade$results
#这里,最小SSE值用于确定在给定组数k下的最佳方案,而calinski和ssi
#指标用于确定最佳k值,两个指标解决不同的问题。
spe.KM.cascade$partition
#记住不同的组数k={2,3,…,10},每次都是独立运行。因此图4.15从下到上
#结构互相独立,与层次聚类树的嵌套结构不同。
# 按照k-均值划分结果重新排列样方
spe[order(spe.kmeans$cluster),]
# 使用函数vegemite()重新排列样方-物种矩阵
ord.KM <- vegemite(spe, spe.kmeans$cluster)
spe[ord.KM$sites, ord.KM$species]
围绕中心点划分(PAM)

围绕中心点划分是从所有的数据观测点寻找k个代表性的对象或形心点,这些代表性的对象应该反映数据的主体结构。k-均值是最小二乘法,pam不是,pam的输入数据可以是原始数据也可以是相异矩阵,并且允许通过轮廓宽度确定最佳分类数。

下面我们利用轮廓宽度图比较k-均值法和pam法的分组结果。

# 形心点划分(PAM)
# 基于弦距离矩阵进行计算
# ***********************
# 聚类簇数量的选择
asw <- numeric(nrow(spe))
# 循环计算2至28组分类数下平均轮廓宽度
# asw对象名称取自"average silhouette width"
for (k in 2:(nrow(spe)-1)) 
    asw[k] <- pam(spe.ch, k, diss=TRUE)$silinfo$avg.width
k.best <- which.max(asw) 
cat("", "Silhouette-optimal number of clusters k =", k.best, "\n", 
    "with an average silhouette width of", max(asw), "\n")

plot(1:nrow(spe), asw, type="h", main="Choice of the number of clusters", 
    xlab="k (number of groups)", ylab="Average silhouette width")
axis(1, k.best, paste("optimum",k.best,sep="\n"), col="red", font=2,
    col.axis="red")
points(k.best, max(asw), pch=16, col="red", cex=1.5)
#当k=2时,PAM具有最佳的方案(asw=0.3841),这并不是我们期望的结果。
#如果选择常用的4组分法,从轮廓宽度角度分析结果并不好(asw=0.2736)。
#尽管如此,我们还是需要分析PAM分4组的情况。
# PAM分4组情况

# PAM分4组情况
spe.ch.pam <- pam(spe.ch, k=4, diss=TRUE)
summary(spe.ch.pam)
spe.ch.pam.g <- spe.ch.pam$clustering
spe.ch.pam$silinfo$widths
# 将当前的分类结果与之前Ward聚类和k-均值划分进行比较
table(spe.ch.pam.g, spebc.ward.g)
table(spe.ch.pam.g, spe.kmeans$cluster)
#PAM结果与Ward聚类和k-均值划分结果显著不同
# k=4组下k-均值法和PAM法轮廓宽带图
par(mfrow=c(1,2))
plot(silhouette(spe.kmeans$cluster,spe.ch), main="轮廓宽度图:k-均值法", 
  cex.names=0.8, col= spe.kmeans$cluster+1,border="white")
plot(silhouette(spe.ch.pam), main="轮廓宽度图:PAM", cex.names=0.8, 
    col=spe.ch.pam$silinfo$widths+1,border="white")
#基于此图,可以分辨PAM和k-均值法哪个有更好的平均轮廓值。请将当前
#结果与Ward聚类比较轮廓宽带图。

上述例子表明,即便是目标相同且属于同一大类的聚类方法也可能产生完全不同的结果。我们应该根据哪种方法能够提供更多有用的信息或者能够更好地被环境变量解释来选择合适的聚类方法。

# 绘制4组k-均值样方分组结果沿Doubs河的分布地图
# ***********************************************
plot(spa, asp=1, type="n", main="Four k-means groups", 
    xlab="x coordinate (km)", ylab="y coordinate (km)")
lines(spa, col="light blue")
text(50, 10, "Upstream", cex=1.2, col="red")
text(25, 115, "Downstream", cex=1.2, col="red")
grKM <- spe.kmeans$cluster
k <- length(levels(factor(grKM)))
for (i in 1:k) {
   points(spa[grKM==i,1], spa[grKM==i,2], pch=i+20, cex=3, col=i+1, bg=i+1)
   }
text(spa, row.names(spa), cex=0.8, col="white", font=2)
legend("bottomright", paste("Group",1:k), pch=(1:k)+20, col=2:(k+1), 
  pt.bg=2:(k+1), pt.cex=2, bty="n")
  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容