# SOM基因表达聚类分析初探

## SOM分析基本理论

SOM (Self-Organizing Feature Map,自组织特征图)是基于神经网络方式的数据矩阵和可视化方式。与其它类型的中心点聚类算法如K-means等相似，SOM也是找到一组中心点 (又称为codebook vector)，然后根据最相似原则把数据集的每个对象映射到对应的中心点。在神经网络术语中，每个神经元对应于一个中心点。

SOM强调簇中心点之间的邻近关系，相邻的簇之间相关性更强，更有利于解释结果，常用于可视化网络数据或基因表达数据。

Even though SOM is similar to K-means, there is a fundamental difference. Centroids used in SOM have a predetermined topographic ordering relationship. During the training process, SOM uses each data point to update the closest centroid and centroids that are nearby in the topographic ordering. In this way, SOM produces an ordered set of centroids for any given data set. In other words, the centroids that are close to each other in the SOM grid are more closely related to each other than to the centroids that are farther away. Because of this constraint, the centroids of a two-dimensional SOM can be viewed as lying on a two-dimensional surface that tries to fit the n-dimensional data as well as possible. The SOM centroids can also be thought of as the result of a nonlinear regression with respect to the data points. At a high level, clustering using the SOM technique consists of the steps described in Algorithm below:

1: Initialize the centroids.
2: repeat
3:     Select the next object.
4:     Determine the closest centroid to the object.
5:     Update this centroid and the centroids that are close, i.e., in a specified neighborhood.
6: until The centroids don't change much or a threshold is exceeded.
7: Assign each object to its closest centroid and return the centroids and clusters.

## SOM分析实战

### 加载或安装包

### LOAD LIBRARIES - install with:
#install.packages(c("kohonen")
library(kohonen)

### 读入数据并进行标准化

# now train the SOM using the Kohonen method
# 标准化数据
data_train_matrix <- as.matrix(t(scale(t(data))))
names(data_train_matrix) <- names(data)

untrt_N61311 untrt_N052611 untrt_N080611 untrt_N061011 trt_N61311
ENSG00000223972    1.6201852    -0.5400617    -0.5400617    -0.5400617 -0.5400617
ENSG00000227232   -1.0711639     1.0274429     0.6776751     0.8525590 -1.2460478
ENSG00000278267   -1.6476479     1.3480756     0.1497862     0.7489309 -0.4493585
ENSG00000237613    2.4748737    -0.3535534    -0.3535534    -0.3535534 -0.3535534
ENSG00000238009   -0.3535534    -0.3535534    -0.3535534    -0.3535534  2.4748737
ENSG00000268903   -0.7020086     0.9025825    -0.7020086    -0.7020086 -0.7020086
trt_N052611 trt_N080611 trt_N061011
ENSG00000223972   1.6201852  -0.5400617  -0.5400617
ENSG00000227232  -1.2460478   0.5027912   0.5027912
ENSG00000278267   0.7489309   0.1497862  -1.0485032
ENSG00000237613  -0.3535534  -0.3535534  -0.3535534
ENSG00000238009  -0.3535534  -0.3535534  -0.3535534
ENSG00000268903   0.9025825  -0.7020086   1.7048781

### 训练SOM模型

# 定义网络的大小和形状
som_grid <- somgrid(xdim = 10, ydim=10, topo="hexagonal")

# Train the SOM model!
som_model <- supersom(data_train_matrix, grid=som_grid, keep.data = TRUE)

### 可视化SOM结果

# Plot of the training progress - how the node distances have stabilised over time.
# 展示训练过程，距离随着迭代减少的趋势，判断迭代是否足够；最后趋于平稳比较好
plot(som_model, type = "changes")

### 计量每个SOM中心点包含的基因的数目

## custom palette as per kohonen package (not compulsory)
coolBlueHotRed <- function(n, alpha = 0.7) {
rainbow(n, end=4/6, alpha=alpha)[n:1]
}

# shows the number of objects mapped to the individual units.
# Empty units are depicted in gray.
plot(som_model, type = "counts", main="Node Counts", palette.name=coolBlueHotRed)

### 计量SOM中心点的内敛性和质量

# map quality
# shows the mean distance of objects mapped to a unit to
# the codebook vector of that unit.
# The smaller the distances, the better the objects are
# represented by the codebook vectors.
plot(som_model, type = "quality", main="Node Quality/Distance", palette.name=coolBlueHotRed)

### 邻居距离-查看潜在边界点

# 颜色越深表示与周边点差别越大，越是分界点
# neighbour distances
# shows the sum of the distances to all immediate neighbours.
# This kind of visualization is also known as a U-matrix plot.
# Units near a class boundary can be expected to have higher average distances to their neighbours.
# Only available for the "som" and "supersom" maps, for the moment.
plot(som_model, type="dist.neighbours", main = "SOM neighbour distances", palette.name=grey.colors)

### 查看SOM中心点的变化趋势

plot(som_model, type = "codes", codeRendering="lines")

### 获取每个SOM中心点相关的基因

table(som_model\$unit.classif)
# 只显示一部分
1   2   3   4   5   6
197 172 434 187 582 249
95  96  97  98  99 100
168 919 226 419 193 241
# code是从左至右，从下至上进行编号的
som_model_code_class = data.frame(name=rownames(data_train_matrix), code_class=som_model\$unit.classif)
name code_class
1 ENSG00000223972         81
2 ENSG00000227232         37
3 ENSG00000278267         93
4 ENSG00000237613         51
5 ENSG00000238009         11
6 ENSG00000268903          4

### SOM结果进一步聚类

# 选择合适的聚类数目
# show the WCSS metric for kmeans for different clustering sizes.
# Can be used as a "rough" indicator of the ideal number of clusters
mydata <- as.matrix(as.data.frame(som_model\$codes))
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata, centers=i)\$withinss)
par(mar=c(5.1,4.1,4.1,2.1))
plot(1:15, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares", main="Within cluster sum of squares (WCSS)")
# Form clusters on grid
## use hierarchical clustering to cluster the codebook vectors
som_cluster <- cutree(hclust(dist(mydata)), 6)
# Colour palette definition
cluster_palette <- function(x, alpha = 0.6) {
n = length(unique(x)) * 2
rainbow(n, start=2/6, end=6/6, alpha=alpha)[seq(n,0,-2)]
}

cluster_palette_init = cluster_palette(som_cluster)
bgcol = cluster_palette_init[som_cluster]

#show the same plot with the codes instead of just colours
plot(som_model, type="codes", bgcol = bgcol, main = "Clusters", codeRendering="lines")

### SOM获取基因所在的新类

som_model_code_class_cluster = som_model_code_class
som_model_code_class_cluster\$cluster = som_cluster[som_model_code_class\$code_class]
name code_class cluster
1 ENSG00000223972         81       2
2 ENSG00000227232         37       8
3 ENSG00000278267         93       8
4 ENSG00000237613         51       7
5 ENSG00000238009         11       4
6 ENSG00000268903          4       3

### 映射某个属性到SOM图

# 此处选择一个样本作为示例，可以关联很多信息，
# 比如基因通路，只要在矩阵后增加新的属性就可以。
color_by_var = names(data_train_matrix)[1]
color_by = data_train_matrix[,color_by_var]
unit_colors <- aggregate(color_by, by=list(som_model\$unit.classif), FUN=mean, simplify=TRUE)
plot(som_model, type = "property", property=unit_colors[,2], main=color_by_var, palette.name=coolBlueHotRed)

0 条评论

• ### 基因表达聚类分析之初探SOM - 自组织特征图

SOM (Self-Organizing Feature Map,自组织特征图)是基于神经网络方式的数据矩阵和可视化方式。与其它类型的中心点聚类算法如K-mea...

• ### 不是原配也可以-对接非原生配体

Docking非原生配体 在前面的例子中，AutoDock Vina能把配体构象调整到几乎原生的构象，验证了这一预测方法的准确度。下面，我们尝试docking另...

• ### 分子对接简明教程 （三）

Docking非原生配体 在前面的例子中，AutoDock Vina能把配体构象调整到几乎原生的构象，验证了这一预测方法的准确度。下面，我们尝试docking另...

• ### 代码环复杂度的计算公式

Why calculated as 3? See the directed graph for this simple report below:

• ### codeforces 767A Snacktower(模拟)

A. Snacktower time limit per test:2 seconds memory limit per test:256 megabytes ...

• ### [001] 7个简单步骤搞定Data Science的“课后作业”！

Congratulations, you passed the initial interview and have moved on to the data ...

• ### Connecting language and knowledge with heterogeneous representations for neural relation extraction

版权声明：本文为博主原创文章，未经博主允许不得转载。 https://blog.csdn.net/JN_rainbow/article/details/...

• ### 中央局部图像混合对比表示学习(CS CV)

近年来，非监督表征学习的研究取得了显著的进展，尤其是对比学习的研究成果，它把每一幅图像及其增强部分看作一个独立的类，而不考虑图像之间的语义相似性。提出了一种新的...

Railroad Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (...

• ### 使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名

2018-07-21 14:35