snfpy是一个用于执行相似性网络融合的python工具箱。
snfp的Python项目详细描述
snfpy
这个包提供了相似性网络融合(SNF)的Python实现,SNF是一种将多个数据源组合成一个表示示例关系的图的技术
目录
如果你知道你要去哪里,可以跳到前面:
要求和安装
这个包需要python 3.5或更高版本。 假设您拥有正确版本的python,则可以通过打开命令终端并运行以下命令来安装此软件包:
git clone https://github.com/rmarkello/snfpy.git
cd snfpy
python setup.py install
您可以使用以下命令安装pypi的最新版本:
pip install snfpy
目的
相似网络融合是Wang et al., 2014, Nature Methods最初提出的一种技术,用于将来自不同来源的数据组合成一组共享的样本。 该过程通过为每个数据源构造这些样本的网络来工作,这些网络表示每个样本与所有其他样本的相似性,然后将这些网络融合在一起。 将该方法应用于遗传学数据的原始论文中的这个图提供了一个很好的演示:
相似网络生成和融合过程使用K-nearest neighbors过程来降低样本之间较弱关系的权重。 然而,通过融合过程,在数据源之间保持一致的弱关系。 有关SNF背后的数学的更多信息,您可以阅读original paper或查看reference documentation
用法
有~3个函数可用于构造mostsnf工作流。
为了演示,我们可以使用snfpy
分布提供的示例数据集:
>>>fromsnfimportdatasets>>>digits=datasets.load_digits()>>>digits.keys()dict_keys(['data','labels'])
digits
数据集由600个样本组成,这些样本分布在四种数据类型上,每种数据类型有76、240、216和47个特征;这些数据可以通过digits.data
:
>>>forarrindigits.data:...print(arr.shape)(600,76)(600,240)(600,216)(600,47)
数据集还附带一组标签,将样本分组为三个类别(0、1或2)之一;这些标签可以通过digits.labels
访问。
我们可以看到每组有200个样本:
importnumpyasnp>>>groups,samples=np.unique(digits.labels,return_counts=True)>>>forgrp,countinzip(groups,samples):...print('Group {:.0f}: {} samples'.format(grp,count))Group0:200samplesGroup1:200samplesGroup2:200samples
SNF的第一步是将这些数据数组转换为相似(或“相似”)网络。
为此,我们将数据数组提供给snf.make_affinity()
函数:
>>>importsnf>>>affinity_networks=snf.make_affinity(digits.data,metric='euclidean',K=20,mu=0.5)
提供给此函数的参数(metric
、K
和mu
)都在如何构造相似网络中起作用。
参数metric
控制构建网络时使用的距离函数。
然而,距离网络和相似网络是互逆的,所以我们将它们转换成另一个。
为此,我们对距离数组应用mu
加权K
-近邻内核(有关更多数学信息,请参见^{
一旦我们有了相似网络,我们就可以将它们与snf结合起来:
>>>fused_network=snf.snf(affinity_networks,K=20)
融合后的网络可以进行其他分析(比如聚类!).
如果我们想对网络进行集群,我们可以尝试使用snf.get_n_clusters()
来确定要形成的集群的“最佳”数量。
此函数返回簇的顶部two“最优”数(通过特征间隙方法估计):
>>>best,second=snf.get_n_clusters(fused_network)>>>best,second(3,4)
然后,我们可以使用光谱聚类对网络进行聚类,并将得到的标签与测试数据集提供的“真”标签进行比较:
>>>fromsklearn.clusterimportspectral_clustering>>>fromsklearn.metricsimportv_measure_score>>>labels=spectral_clustering(fused_network,n_clusters=best)>>>v_measure_score(labels,digits.labels)0.9734300455833589
这里使用的度量(v_measure_score
)范围从0到1,其中1表示派生标签和真标签之间完全重叠,0表示没有重叠。
我们发现,0.97表明snf融合网络聚类结果是高度准确的!
当然,对于其他数据集,您的里程数可能会有所不同,但这应该足以让您开始! 有关更详细的示例和其他用途,请查看我们的documentation。
如何参与
我们很高兴欢迎新的贡献者! 如果是你对参与感兴趣,你应该从阅读我们的contributing guidelines和code of conduct开始。 一旦你完成了,看看我们的issues看看是否有什么你可能喜欢的工作。 或者,如果您发现了一个bug,遇到了一个问题,或者有一个问题,请创建一个新的问题,并提供一些相关信息
致谢
此代码是在R和Matlab中实现的原始相似网络融合代码的翻译。 因此,如果您使用此代码,请(1)提供回GitHub存储库的链接以及使用的代码版本,以及(2)引用原始的相似性网络融合文件:
Wang, B., Mezlini, A. M., Demir, F., Fiume, M., Tu, Z., Brudno, M., Haibe-Kains, B., &
Goldenberg, A. (2014). Similarity network fusion for aggregating data types on a genomic scale.
Nature Methods, 11(3), 333.
许可证信息
这段代码从original SNF code部分翻译而来,因此作为LGPLv3下的派生代码发布。
完整的许可证可以在snfpy
发行版的LICENSE文件中找到。