我想构建一个神经网络,用于在Python中对DNA序列中的剪接点进行分类。现在,我只是将数据放在字符串中(例如,“GTAACTGC”)。
我想知道以一种我可以用神经网络处理的方式对其进行编码的最佳方法。我的第一个想法是将每个字母分配给一个整数值,但这感觉非常天真。另一个想法是每个地方都有四个二进制指示符,分别对应A,T,G或C.我不确定它的效果如何。
解决此问题的最佳方法是什么?以前,我刚刚使用过数值,但之前从未使用像DNA序列这样的字符串。
编辑:现在,我将只关注映射。对于阅读此内容的人,请尝试查看this paper;它确实帮了我一些指示。
答案 0 :(得分:0)
为什么不学习每个基数的数字表示?
这是Neural Machine Translation中的一个常见问题,我们试图将“词”编码为具有(天真)数字的含义。核心思想是不同的单词不应该用简单的数字表示,而应该用学习的密集向量表示。查找此向量表示的过程称为embedding。
在这种情况下,彼此关系更密切的碱基可能在n维空间中具有彼此更接近的向量表示(其中n是向量的大小)。这是一个简单的概念,第一次难以可视化。您选择的嵌入大小(超参数)可能很小,因为您只嵌入了四个参数中的一个(尝试大小为2-5)。
作为一些大小为4的嵌入映射的示例(数值与此示例无关):
G -> [1.0, 0.2, 0.1, 0.2]
A -> [0.2, 0.5, 0.7, 0.1]
T -> [0.1, 0.2, 1.0, 0.5]
C -> [0.4, 0.4, 0.5, 0.8]
生成和优化嵌入的确切技术本身就是一个主题;希望这个概念对你有用。
<强>替代强>
如果你想避免嵌入(因为你的“词汇”限于4),你可以为每个基础分配标量值。如果这样做,您应该规范化 -1和1之间的映射。
答案 1 :(得分:0)
基于您提到的二进制指示器构建的想法是编码1024x1024(例如)图像,该图像是位图,通常表示1048576位。对于图像中的每一行,您可以成对查看位置或位,并按如下方式进行编码:
0 0 -> G
0 1 -> A
1 0 -> T
1 1 -> C
每行应产生512个数据值,或每个图像产生524288个数据。
对于神经网络,我认为你可以加入卷积神经网络或CNN。另一个想法可能是在编码时避免图像的外边缘,以便在过程中使用的任何内核将在活动(中央)数据区域上具有完全覆盖。也许这不是最显着的变化,但也许值得比较直接编码到图像的边缘和角落区域的数据映射。