天天看点

PostgreSQL 遗传学应用 - 矩阵相似距离计算 (欧式距离,...XX距离)

PostgreSQL ,

生物科学中相当重要的工作之一解开遗传密码?

欧式空间计算,是其中的一个需求,很有意思吧,PostgreSQL可以用来解开遗传密码。

<a href="https://en.wikipedia.org/wiki/Euclidean_distance">https://en.wikipedia.org/wiki/Euclidean_distance</a>

<a href="https://www.math.uci.edu/~gpatrick/source/205b06/chapviii.pdf">https://www.math.uci.edu/~gpatrick/source/205b06/chapviii.pdf</a>

实际上PostgreSQL是一个扩展性非常强大的数据库,比如在文本相似计算方面,就有诸多扩展插件。

<a href="https://github.com/digoal/blog/blob/master/201705/20170524_01.md">《17种相似算法与GIN索引 - pg_similarity》</a>

<a href="https://github.com/eulerto/pg_similarity">https://github.com/eulerto/pg_similarity</a>

<a href="https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%BA%A6%E9%87%8F/1274107?fromtitle=%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB&amp;fromid=1798948">https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%BA%A6%E9%87%8F/1274107?fromtitle=%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB&amp;fromid=1798948</a>

<a href="https://github.com/digoal/blog/blob/master/201701/20170116_04.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 3 rum, smlar应用场景分析》</a>

<a href="https://github.com/digoal/blog/blob/master/201701/20170116_03.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar插件详解》</a>

<a href="https://github.com/digoal/blog/blob/master/201701/20170116_02.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 1 文本(关键词)分析理论基础 - TF(Term Frequency 词频)/IDF(Inverse Document Frequency 逆向文本频率)》</a>

在基因科学方面,也有扩展插件应用:

<a href="https://github.com/digoal/blog/blob/master/201606/20160621_01.md">《为了部落 - 如何通过PostgreSQL基因配对,产生优良下一代》</a>

在化学分析方面,也有相似的插件:

<a href="http://www.rdkit.org/">http://www.rdkit.org/</a>

某个生物科技公司,有这样的一种需求:

每张表有几十万行,几万列,全部浮点类型,任意列勾选,计算欧氏距离等需求。

因为数据库设计限制,不能支持一张表几万列,不过PostgreSQL可以将多列存成数组。

1、DNA结构如下:

比如每行代表一个物种的测序数据。

2、生成随机浮点数组的函数,可以方便的生成测试数据。

3、生成50万条测试数据,每组2万浮点数。

数据大概占用86GB空间。

可以使用plpgsql创建计算两个浮点数组的欧式距离的函数,长度可以不一样,因为可能不同物种的遗传数据不一样,有的多,有的少。

如果使用C函数,性能会更好。

例子

通过这个函数,传入要计算的数组即可计算欧式距离。

这个主要用于部分计算,例如人类和猴子,在某一段的相似性,那么需要从这两条记录中,分别取出要计算的部分,重新组成两个数组,然后计算它们两的欧氏距离。

例子:

比如选中了100个物种,计算它们的任意组合的欧氏距离。

需要一些辅助函数:

1、组合去重函数,只去掉重复行。

2、组合去重函数,去掉按列值排序后的重复行。

3、比如选中了1,2,3,4这四种物种,如何得到他们的排列组合呢?

4、创建一个函数,用于计算输入组合物种的排列组合欧式距离。

计算例子:

输入5个物种的ID,返回这5个物种的排列组合欧式距离。

PostgreSQL是一个扩展性很好的数据库,内置了丰富的数据类型。

本例,使用函数编程、数组类型两个特性,解决了生物科学中的遗传计算的场景的疑难问题(上万列,任意组合计算排列组合的欧式距离)。

同时PostgreSQL还能支持并行计算,在重计算的场景,可以提高计算响应速度。