2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码

题目背景:目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条,聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大地恢复原始序列的信息,但需要注意 由于DNA测序后序列众多,如何高效地进行聚类与比对则是在满足准确率基础上的另一大难点。

数据说明:

train_reference.txt”是某次合成的目标序列,其中第一行为序号,第二行

为序列内容。

通过真实合成、测序后读取到的测序序列文件为“train_reads.txt”,我们已经对测序序列进行了分类,该文件第一行为目标序列的序号,第二行为序列内容。

基于赛题提供的数据,自主查阅资料,选择合适的方法完成如下任务:

任务1观察数据集“train_reads.txt”、“train_reference.txt”,针对这次合成任务,进行错误率(插入、删除、替换、断链)、拷贝数方面的分析。其中错误率定义为某个碱基发生错误的概率,需要对不同类型的错误率分别进行分析。拷贝数定义为原始序列复制的数量

·数据读取与查看

首先需要根据题目给出的数据信息,对任务1中提到的两个数据集train_reads.txt”、“train_reference.txt进行读取与查看。

这里我们采用python语言,Jupiter notebook编程:

import pandas as pd
import numpy as np
#1#读取数据
df_reference = pd.read_csv('train_reference.txt', delimiter=' ',header=None)
df_reference.columns = ['序号', '序列内容'] # 替换列名
df_reference

df_train=pd.read_csv('train_reads.txt',delimiter=' ',header=None)
df_train.columns = ['序号', '序列内容'] # 替换列名
df_train

·拷贝数分析

由于拷贝数的统计计算较为简单,我们首先对拷贝数进行统计分析。

根据题意,拷贝数定义为原始序列复制的数量,所以我们只需要计算每个序列对应的复制次数。

代码如下:

#拷贝数分析
df_copies=df_train['序号'].value_counts().sort_index()
df_copies
#可视化
import matplotlib.pyplot as plt
# 绘制柱状图
plt.bar(df_copies.index, df_copies.values)
plt.xlabel('Order')
plt.ylabel('Count')
plt.title('Order Counts')
plt.show()

从可视化结果可以直观地看出,绝大多数序列被复制的次数都在100-140之间,但是具体的复制数目参差不齐。

·错误率分析

错误率共有四种类型:(插入、删除、替换、断链)

针对每种类型,需要我们进行人工定义相应的错误率计算方式:

  1. 插入错误(记为1类错误)
  1. 删除错误(记为2类错误)
  2. 替换错误(记为3类错误)
  3. 断链(记为4类错误)

  4. 该类错误比较特殊,在 DNA 复制过程中,"断链"通常指的是 DNA 双螺旋的某一条链在复制时发生了断裂,形成一个或多个暂时的单链断裂。这个过程可能是由于复制过程中的各种因素引起的。

    比较直观的观测方法是查看复制链的长度,如果序列长度比原定目标长度少了25%及以上,可以认为发生了断链。

    如发生断链,4类错误率记为100%(1),否则记为0。

要统计从字符串 B 修改到字符串 A 所涉及的添加、删除和替换的字符个数,可以使用编辑距离(Levenshtein 距离)的概念。编辑距离是衡量两个字符串相似程度的一种方法,包括插入、删除和替换的操作。

在 Python 中,可以使用第三方库 python-Levenshtein 来计算编辑距离。

import Levenshtein
#实现代码请戳完整版获取

任务 2:设计开发一种模型用于对测序后的序列“train_reads.txt”进行聚类,

并根据“train_reads.txt”的标签验证模型准确性。模型主要从两方面评估效果:

  1. 聚类后准确性(包括簇的数量以及簇内纯度)、(2)聚类速度(以分钟为单位)

思路提示:标签即为文件第一行——目标序列的序号,在该任务中,我们将假设序号未知,尝试通过聚类的方法来标记各复制得到的序列可能对应哪个目标序列。

测序后的序列进行聚类,聚类的依据即为与序列之间的相似性。

聚类是一种将相似的数据点分组的方法。在字符串的情境下,可以使用字符串之间的相似度来聚类。以下是一个示例,使用 KMeans 聚类算法进行字符串的聚类:

#代码见完整版

任务 3:“test_reads.txt”是我们在另一种合成环境下合成的测序文件(与“train_reads.txt”的目标序列不相同),请用任务 2 所开发的模型对其进行聚类,给出聚类耗时以及“test_reads.txt”的目标序列数量,给出拷贝数分布图。

由于test数据不清楚分几类合适,需要进行初步的分类步长探索。这里通过设置合理的取样步长采用遍历方法,每次遍历直接套用任务2中设计好的模型(即k-means聚类方法)即可。

对于分类探索,根据实际问题背景,对每个目标序列进行的拷贝数目应该大致相同。

任务 4:聚类后能否通过比对恢复原始信息也是极为关键的,设计开发一种用于同簇序列的比对模型,该模型可以针对同簇的DNA序列进行比对并输出最有可能正确的目标序列。 请使用该工具对任务 3 中“test_reads.txt”的聚类后序列进行比对,并输出“test_reads.txt”最有可能的目标序列,并分析“test_reads.txt”的错误率。(请用一个“test_ref.txt”的文件记录“test_reads.txt”的目标序列。

观察已知数据,不难发现目标序列长度为60.

思路1:针对每个簇内的复制序列,通过相似度计算找出其中最可能与目标序列接近程度最大的序列。依据其他序列修正为长度60作为预测目标序列。

思路2:将每个簇内的复制序列进行长度切割,分别找出各片段的高频序列,将其拼接得到预测的目标序列。

思路3:直接计算公共相同片段(前缀、后缀等),将其适当拼接。

为了构造一个新字符串,使其尽可能与已知的10个字符串都具有很大的相似度,你可以考虑找到这些字符串之间的最长公共子串(Longest Common Substring)。以下是一个示例,使用动态规划来找到最长公共子串,并构造新字符串:

def longest_common_substring(str1, str2):

    m, n = len(str1), len(str2)

    dp = [[0] * (n + 1) for _ in range(m + 1)]

    max_len = 0

    end_index = 0

    for i in range(1, m + 1):

        for j in range(1, n + 1):

            if str1[i - 1] == str2[j - 1]:

                dp[i][j] = dp[i - 1][j - 1] + 1

                if dp[i][j] > max_len:

                    max_len = dp[i][j]

                    end_index = i - 1

            else:

                dp[i][j] = 0

    return str1[end_index - max_len + 1:end_index + 1]

def construct_string(known_strings):

    common_substring = known_strings[0]

    for i in range(1, len(known_strings)):

        common_substring = longest_common_substring(common_substring, known_strings[i])

    # 构造新字符串,将最长公共子串重复若干次

    constructed_string = common_substring * 5  # 假设构造的字符串长度为5倍最长公共子串长度

    return constructed_string

# 示例

known_strings = ["apple", "apricot", "appetizer", "apology", "apex", "applause", "apricot", "april", "apocalypse", "apostrophe"]

constructed_string = construct_string(known_strings)

print(f"构造的字符串: {constructed_string}")

在这个示例中,longest_common_substring 函数用于找到两个字符串的最长公共子串,然后 construct_string 函数使用这个方法找到所有字符串的最长公共子串,并将其重复若干次以构造新字符串。请注意,具体的重复次数和其他参数可能需要根据实际情况进行调整。

在获得预测的目标序列后,继续采用task1中的方法进行错误率分析即可。

完整获取请戳↓

baiduwangpan:https://pan.baidu.com/s/1BKsSgjSSnHu4433O7jf06w?pwd=ggt9 提取码:ggt9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/232041.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue页面传值:Props属性与$emit事件的应用介绍

一、vue页面传值 在Vue页面中传值有多种方式,简单介绍以下两种 通过props属性传递值:父组件在子组件上定义props属性,子组件通过props接收父组件传递的值。通过$emit触发事件传递值:子组件通过$emit方法触发一个自定义事件&#…

Linux第18步_安装“Ubuntu系统下的C语言编译器GCC”

Ubuntu系统没有提供C/C的编译环境,因此还需要手动安装build-essential软件包,它包含了 GNU 编辑器,GNU 调试器,和其他编译软件所必需的开发库和工具。本节用于重点介绍安装“Ubuntu系统下的C语言编译器GC&a…

Hierarchical Clusting模型

介绍: Hierarchical Clustering 是一种常用的聚类方法,它通过构建一个层次化的聚类树(或者称为聚类图),将数据点逐步合并组成不同的聚类簇。 Hierarchical Clustering 的主要思想是将相似的数据点归为一类&#xff0c…

竞赛保研 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度…

作业三详解

作业3: 在作业1的基础上,整合修改、删除功能,可实现如下功能 1.进入新增页面,页面填入新增数据,提交表单,然后跳转到查询列表页面,列表页面显示所有记录(多一条新增的数据&#xff…

Eureka服务注册与发现中心

简介 Spring Cloud封装了Netflix 公司开发的Eureka模块来实现服务治理 在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现…

vue简单实现滚动条

背景:产品提了一个需求在一个详情页,一个form表单元素太多了,需要滚动到最下面才能点击提交按钮,很不方便。他的方案是,加一个滚动条,这样可以直接拉到最下面。 优化:1、支持滚动条,…

Beauty algorithm(三)腮红

查阅资料了解到腮红位于苹果肌处,同样使用关键点确定目标区域,然后对该区域进行渲染达到美妆效果。考虑到如果使用简单的RGB是很难做到特效,本篇采用模板方式进行区域融合。 一、skills 前瞻 1、png图像读取 cv::imread(imgPath, cv::IMREAD_UNCHANGED) IMREAD_UNCHANGE…

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

Swift爬虫使用代理IP采集唯品会商品详情

目录 一、准备工作 二、代理IP的选择与使用 三、使用Swift编写唯品会商品爬虫 四、数据解析与处理 五、注意事项与优化建议 六、总结 一、准备工作 在开始编写爬虫之前&#xff0c;需要准备一些工具和库&#xff0c;以确保数据抓取的顺利进行。以下是所需的工具和库&…

spring Security源码讲解-WebSecurityConfigurerAdapter

使用security我们最常见的代码&#xff1a; Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().permitAll();http.authorizeRequests().antMatcher…

虚幻UE 材质-边界混合之PDO像素深度偏移量

2024年的第一天&#xff01;&#xff01;&#xff01;大家新年快乐&#xff01;&#xff01;&#xff01; 可能是长大了才知道 当你过得一般 你的亲朋好友对你真正态度只可能是没有表露出来的冷嘲热讽了 希望大家新的一年平安、幸福、 永远活力满满地追求自己所想做的、爱做的&…

​三子棋(c语言)

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…

集合基础知识点

集合基础 1. 集合的由来 当 Java 程序中需要存放数据的时候&#xff0c;通常会定义变量来实现数据的存储&#xff0c;但是&#xff0c;当需要存储大量数据的时候该怎么办呢&#xff1f;这时首先想到的是数组&#xff0c;但是&#xff01;数组只能存放同一类型的数据&#xff…

Linux 编译安装 Nginx

目录 一、前言二、四种安装方式介绍三、本文安装方式&#xff1a;源码安装3.1、安装依赖库3.2、开始安装 Nginx3.3、Nginx 相关操作3.4、把 Nginx 注册成系统服务 四、结尾 一、前言 Nginx 是一款轻量级的 Web 服务器、[反向代理]服务器&#xff0c;由于它的内存占用少&#xf…

RabbitMQ(七)ACK 消息确认机制

目录 一、简介1.1 背景1.2 定义1.3 如何查看确认/未确认的消息数&#xff1f; 二、消息确认机制的分类2.1 消息发送确认1&#xff09;ConfirmCallback方法2&#xff09;ReturnCallback方法3&#xff09;代码实现方式一&#xff1a;统一配置a.配置类a.生产者c.消费者d.测试结果 …

淘宝京东1688商品详情API接口,搜索商品列表接口

前言 在实际工作中&#xff0c;我们需要经常跟第三方平台打交道&#xff0c;可能会对接第三方平台API接口&#xff0c;或者提供API接口给第三方平台调用。 那么问题来了&#xff0c;如果设计一个优雅的API接口&#xff0c;能够满足&#xff1a;安全性、可重复调用、稳定性、好…

嵌入式-C语言-ASCII码(字符)转换二进制和十六进制

一&#xff1a;ASCII码是什么&#xff1f; 问&#xff1a;ASCII码是什么&#xff1f; 答&#xff1a;ASCII码&#xff08;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码&#xff09;是一种用于表示字符的标准编码系统。它使用7位或8位…

poium测试库之JavaScript API封装原理

为什么要封装JavaScript的API&#xff1f; 因为有些场景下Selenium提供的API并不能满足我们需求。比如&#xff0c;滑动浏览滚动条&#xff0c;控制元素的显示/隐藏&#xff0c;日历控件的操作等&#xff0c;都可以通过JavaScrip实现&#xff0c;而且Selenium为我们提供了 exe…