【发布时间】:2012-07-30 13:52:59
【问题描述】:
我有一个包含独特蛋白质对的文件,即阳性数据集。我们称之为infile。
下面是 infile 内容的示例:
Q9VRA8 A1ZBB4
Q03043 Q9VX24
B6VQA0 Q7KML2
条目是制表符分隔的。
随机数据集,我们称之为outfile,必须包含单个蛋白质的组合,它们不能以以任何顺序匹配 infile 的内容。例如,对于上面的第一行,随机输出文件不能包含以下对:
Q9VRA8 A1ZBB4
A1ZBB4 Q9VRA8
此外,生成的阴性数据集必须包含与阳性数据集完全相同数量的蛋白质对。 为了解决这个问题,我尝试了以下方法:
# Read original file
data = list(infile.readlines())
ltotal = len(data)
lwritten = 0
# Split original file in words
with open (infilename, 'rt') as infile:
pairs = set(frozenset(line.split()) for line in infile)
words = list(itertools.chain.from_iterable(pairs))
random.shuffle(words)
# Obtain pairs of words
with open(outfilename, 'wt') as outfile:
for pair in itertools.izip(*[iter(words)] * 2):
if frozenset(pair) not in pairs and lwritten != ltotal:
outfile.write("%s\t%s\n" % pair)
lwritten += 1
这行得通。而infile共有856471行,outfile得到不同范围的蛋白质对,最少713000。
如何解决这个问题,以便生成的对数与 infile 完全相同? 此外,我无法解决反向配对顺序问题。对这两个问题有什么想法吗?
提前致谢。
【问题讨论】:
-
你能重复数值吗?每个文件中每种蛋白质的总数是否必须匹配?
-
哦,对不起,错过了这一点。是的,我可以重复个别条目。但是我不能有重复的对。所有组合必须是唯一的。不,蛋白质的总数不必与每个文件匹配。虽然应该有一些平衡,或者当我使用 SVM 时会产生一些偏差。
-
我的印象是您正在为 SVM 生成“背景”(某种零假设)分布。你为什么要否决这个人工数据集中已经出现的配对?
-
在 SVM 中,您需要正数据集和负数据集来训练算法。如果你只使用一个正数据集,那么当你在测试数据中使用它时,算法将会被过度训练和偏颇。
-
在没有否决的情况下构建负数据集有一个明确的统计解释——任何一对的乘积只是项目概率的乘积。我很想知道是什么建模假设导致您想要删除与您观察到的实例重叠的负面实例。