单细胞测序与机器学习是当今最热门两个热点之一。那么单细胞加机器学习又能够碰撞出怎样的火花呢?从这期推文开始,将会通过耶鲁大学krishnaswamylab实验中的教程,和大家一起从头学习机器学习在单细胞中的应用。
什么是单细胞测序?为什么需要单细胞测序?
单细胞测序是为了捕获单个细胞遗传信息的测序技术。单细胞测序一般可以应用于测量DNA和RNA序列,DNA和RNA的表观遗传修饰,了解染色质的结果以及蛋白质之间的相互作用。
单细胞测序最重要的特性就是能够获取遗传信息的异质性。比如对于传统的RNA表达量的测序方法,其研究水平是在一个组织中多个细胞中进行的,最终得到的表达信息是多个细胞的平均值。但是实际上来说,对于多细胞生物来说,没有量过细胞是完全一样的,细胞间存在着差异性,另外这个差异性可以很大或者很小。单细胞测序能够检测出细胞间的异质性信息,使我们能够进一步挖掘表达差异中存在的差异。
单细胞的测序原理
目前比较主流的单细胞测序策略是基于barcode的单细胞识别。换句话说就是将独特的bacode加到每个细胞中,通过barcode的独特性来辨认来自哪个细胞。其建库的具体过程包括,在一个油滴之中含有单细胞悬液样品和带有barcode的水凝胶珠子会经过微流体芯片。在油滴中进行逆转录之后,每一个单细胞的cDNA文库,就带上了独一无二的barcode了。最后,我们再将所有的单细胞cDNA文库混在一起测序,获取数百上千个单细胞的信息。
机器学习
机器学习的常用方法,主要分为有监督学习(supervised learning)和无监督学习(unsupervised learning)。监督学习,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到一个最优模型(这个模型属于某个函数的集合,最优则表示在某个评价准则下是最佳的),再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现分类的目的,也就具有了对未知数据进行分类的能力。举个简单的例子,使用线性回归模型去预测数据就是属于监督学习的一种。无监督学习(也有人叫非监督学习,反正都差不多)则是另一种研究的比较多的学习方法,它与监督学习的不同之处,在于我们事先没有任何训练样本,而需要直接对数据进行建模。无监督学习里典型的例子就是PCA聚类了。
将数据展示为图形
图,在数学意义上,是节点和边的集合。有时也将图称为网络。在本次课程中,作者提到只考虑无向图。使用的主要工具包括用于分析图形的工具包 graphtools
和 pygsp
。
那为什么要将数据展示为图形呢?图形在多维空间中更容易聚类,能使用最小边缘进行切割。图形也避免了需要高维操作,它们可以仅表示为边的列表。
安装Python处理图形数据的数据包。
这里我们选用了上面提到的两款工具:
pygsp
:用于分析图上信号的轻量级工具包graphtools
:Krishnaswamy实验室的一个库,用于从数据中学习图形。专为与pygsp
兼容。
安装工具:
代码语言:javascript复制!pip install scprep graphtools
加载对应的工具包:
代码语言:javascript复制import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scprep as scprep
import graphtools as gt
from sklearn import datasets, preprocessing
生成具有简单几何形状的数据
在这里,我们将使用全部6个数据集。
- 圈子-两个圈子,一个由另一个外接
- 卫星-两个交错的半圈
- 变化的Blob-这些Blob各自具有不同的方差
- 各向异性分布的斑点-这些斑点的宽度和长度不相等
- 常规Blob-仅三个常规Blob
- 正方形-仅一个正方形
因为我们是从头开始生成的,所以我们必须更改其分布的一些参数。通常,我们可以更改:
- noise:加到每个点的噪值
- n_samples:生成的点数
- factor/ cluster_std:一些影响形状的参数
np.random.seed(0)
# ============
# Generate datasets. We choose the size to be big enough to see the scalability
# of the algorithms, but not too big to cause long running times
# ============
n_samples = 300
# Circles
noisy_circles = datasets.make_circles(n_samples=n_samples,
# Scale factor between inner and outer circle
factor=.5,
# Gaussian noise added to each point
noise=.05)
# Moons
noisy_moons = datasets.make_moons(n_samples=n_samples,
noise=.05)
# Blobs
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)
# Uniform square
no_structure = np.random.rand(n_samples, 2), None
# "Blobs_skew"
# Anisotropically distributed data (i.e. data with unequal length and width)
random_state = 170
X, y = datasets.make_blobs(n_samples=n_samples, random_state=random_state)
# Changes how x1, x2 coordinates are shifted
transformation = [[0.6, -0.6], [-0.4, 0.8]]
X_aniso = np.dot(X, transformation)
aniso = (X_aniso, y)
# blobs with varied variances
varied = datasets.make_blobs(n_samples=n_samples,
cluster_std=[1.0, 2.5, 0.5],
random_state=random_state)
generated_datasets = {'circles':noisy_circles,
'moons':noisy_moons,
'blobs_variance':varied,
'blobs_skew':aniso,
'blobs_regular':blobs,
'uniform':no_structure}
画出每个图形数据集:
代码语言:javascript复制fig, axes = plt.subplots(1,6,figsize=(12,2))
for i, dataset_name in enumerate(generated_datasets):
ax = axes[i]
data, group = generated_datasets[dataset_name]
# normalize dataset for easier parameter selection
data = preprocessing.StandardScaler().fit_transform(data)
scprep.plot.scatter2d(data, c=group,
ticks=None, ax=ax,
xlabel='x0', ylabel='x1',
title=dataset_name,
legend=False)
fig.tight_layout()
小结
今天的推文到这里就结束了,主要和大家简单介绍了单细胞和机器学习。认识了python处理图形数据的几个包和画了一些简单的图形。下一次推文的内容是学习将数据转化成图形的形式和单细胞数据的预处理,大家敬请期待。
参考资料:
krishnaswamylab中第一天的教程
https://www.krishnaswamylab.org/workshop