PH525x series - Clustering and heatmaps

写在前面的话

emmmmm,得有小半个月没有写学习笔记了,最近真是多事之秋,先是我养的猫咪得了尿闭,后是我的姥爷去世,还有工资一直拖欠不发。这其间五味杂陈自不必不多说,总之直到最近才找回了以前的生活节奏。按照进度,接下来要学习机器学习的相关章节了,今天的笔记是关于聚类与热图的。

聚类

  • 层次聚类(Hierarchical clustering)

书中对层次聚类的描述言简意赅:“With the distance between each pair of samples computed,...Each sample is assigned to its own group and then the algorithm continues iteratively, joining the two most similar clusters at each step, and continuing until there is just one group

简单的说,就是先计算所有样本之间的距离,然后距离最近的两个样本合并为一类(当做一个新的样本对待),再计算所有样本之间的距离并合并,这样反复迭代直到最后所有样本合并为一类停止。

这一过程涉及两个关键问题:(1)样本之间的距离如何计算?(2)归为一类的样本与其他样本或一类样本之间的距离如何计算?

首先,层次聚类是使用欧氏距离来计算样本之间的距离的(以二维数据为例):

D = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}

至于两个组合数据点间的距离如何计算则有3种方式:
(1)以两个组合之间最近的两个样本之间的距离作为两个组合之间的距离,也就是Single Linkage
(2)以两个组合之间最远的两个样本之间的距离作为两个组合之间的距离,即Complete Linkage
(3)先计算两个组合数据点中的每个点与其他所有数据点的距离,然后以所有距离的均值作为两个组合之间的距离,即Average Linkage

显然最后一种方法更为合理一些,上面我描述的其实应该叫做“自下而上”的层次聚类,“自上而下”就和这一过程相反,先是把所有样本视为一类,然后不断排除异己,直到每一个样本单独被分为一类。

在R中,我们可以使用hclust()函数进行层次聚类分析:

library(tissuesGeneExpression)
library(rafalib)
data(tissuesGeneExpression)
#第一步先计算样本之间的距离
d <- dist( t(e) )
#聚类
mypar()
hc <- hclust(d)
#绘图
myplclust(hc, labels=tissue, lab.col=as.fumeric(tissue), cex=0.5)
202001061714.png

如果我们想从上图中知道两个簇之间的距离,仅需要找到那两簇样本被分开的节点,该节点对应的高度就是距离。有一个问题就是,层次聚类它只能画个系统发育树,并不能指定最后被分成几簇。所以,如果想划分样本的话,还需要“cut the tree”,比如说我们在height等于120处横着来一刀:

myplclust(hc, labels=tissue, lab.col=as.fumeric(tissue),cex=0.5)
abline(h=120)
202001061725.png
hclusters <- cutree(hc,h=120)
table(true=tissue,cluster=hclusters)

#             cluster
#true           1  2  3  4  5  6  7  8  9 10 11 12 13 14
#  cerebellum   0  0  0  0 31  0  0  0  2  0  0  5  0  0
#  colon        0  0  0  0  0  0 34  0  0  0  0  0  0  0
#  endometrium  0  0  0  0  0  0  0  0  0  0 15  0  0  0
#  hippocampus  0  0 12 19  0  0  0  0  0  0  0  0  0  0
#  kidney       9 18  0  0  0 10  0  0  2  0  0  0  0  0
#  liver        0  0  0  0  0  0  0 24  0  2  0  0  0  0
#  placenta     0  0  0  0  0  0  0  0  0  0  0  0  2  4

cutree还可以指定cluster的数目进行分组:

hclusters <- cutree(hc,k=8)
table(true=tissue,cluster=hclusters)

#             cluster
#true           1  2  3  4  5  6  7  8
#  cerebellum   0  0 31  0  0  2  5  0
#  colon        0  0  0 34  0  0  0  0
#  endometrium 15  0  0  0  0  0  0  0
#  hippocampus  0 12 19  0  0  0  0  0
#  kidney      37  0  0  0  0  2  0  0
#  liver        0  0  0  0 24  2  0  0
#  placenta     0  0  0  0  0  0  0  6
  • K-means聚类

这个聚类方法关键词是k,就是你首先要选定k个样本点作为k个簇的初始中心。然后计算每一个样本点与那k个中心点的距离,把它归入距离最小的中心所在的簇。等到所有的样本点归类完毕,重新计算k个簇的中心;重复以上过程直至样本点归入的簇不再变动。

在R中可以用kmeans()函数实现k-means聚类:

set.seed(1)
km <- kmeans(t(e),centers=7)
mds <-  cmdscale(d)
mypar(1,2)
plot(mds[,1],mds[,2])
plot(mds[,1],mds[,2],col=km$cluster,pch=16)
202001061751.png

可以看到,k-means的聚类效果还是不错的,而且这一结果与层次聚类的结果很相似:

table(true=tissue,cluster=km$cluster)

#             cluster
#true           1  2  3  4  5  6  7
#  cerebellum   0  0  0  5  2  0 31
#  colon        0 34  0  0  0  0  0
#  endometrium 15  0  0  0  0  0  0
#  hippocampus  0  0  0 31  0  0  0
#  kidney       7  0 30  0  2  0  0
#  liver        0  0  0  0  2 24  0
#  placenta     0  6  0  0  0  0  0

热图

在这一趴,作者就是举例介绍了下绘制热图的R函数heatmap.2(),说是这一函数个性化的参数会比较多些:

##加载所需要的包
library(RColorBrewer)
library(rafalib)
library(gplots)
library(genefilter)

#挑选方差最大的前40个基因画热图
rv <- rowVars(e)
idx <- order(-rv)[1:40]
#设置颜色
hmcol <- colorRampPalette(brewer.pal(9,"GnBu"))(100)
cols <- palette(brewer.pal(8,"Dark2"))[as.fumeric(tissue)]
#画图
heatmap.2(e[idx,],labCol=tissue,
                    trace="none",
                    ColSideColors=cols,
                    col=hmcol)
202001071013.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容

  • 上午陪伴家人看病,等抓药等得好心痛;下午去看房,晒太阳晒得心好痛;晚上搜索房源,各种奇葩户型惊的人好痛心;晚上和P...
    aKiwi阅读 272评论 0 1
  • 坐在荧幕前看着影片中白衣翻飞的场景时,心中似乎也总有些词语在闪烁着翻腾着。 很明显,《白蛇:缘起》在质量上成功了。...
    小秋小秋阅读 151评论 0 0
  • 无话可讲。
    初夏的flower阅读 72评论 0 0