当前位置: 首页 > news >正文

CD-HIT 详解:序列去冗余、安装使用与聚类结果解析

一、什么是 CD-HIT?

CD-HIT(Cluster Database at High Identity with Tolerance)是一种广泛使用的生物信息学工具,主要用于快速聚类生物序列数据,如蛋白质或核酸序列,以减少数据冗余和简化数据分析 。其基本原理涉及比较序列之间的相似性,将高度相似的序列分组到同一个聚类中,从而减少数据集的复杂性。

核心思想

CD-HIT 通过贪心算法 + 局部敏感哈希(LSH)快速将相似序列聚类:

  • 代表序列(representative):每个簇选一条序列作为代表
  • 成员序列(member):与代表序列相似度 ≥ 阈值的序列归入同一簇

网页版:CD-HIT: Cluster Database at High Identity with Tolerance

Github源码:GitHub - weizhongli/cdhit · GitHub

为什么 PPI 预测需要 CD-HIT?

在蛋白质-蛋白质相互作用(PPI)预测中,如果训练集和测试集存在高度相似的蛋白,模型可以靠"记住"序列而非学习互作模式,导致评估结果虚高

使用 CD-HIT 按序列相似度聚类后再划分数据集,可以保证测试集蛋白与训练集序列相似度低于阈值,评估更严格、更可信。

二、安装 CD-HIT

方式1:conda 安装(推荐)

conda install -c bioconda cd-hit

验证是否安装成功:

cd-hit --help

方式2:apt 安装(Ubuntu,需 sudo)

sudo apt install cd-hit

方式3:源码编译(无 sudo、无 conda)

# 1. 下载 wget https://github.com/weizhongli/cdhit/releases/download/V4.8.1/cd-hit-v4.8.1-2019-0228.tar.gz # 2. 解压编译 tar -xzf cd-hit-v4.8.1-2019-0228.tar.gz cd cd-hit-v4.8.1-2019-0228 make # 3. 加入 PATH echo 'export PATH=$PATH:/your/path/cd-hit-v4.8.1-2019-0228' >> ~/.bashrc source ~/.bashrc

三、CD-HIT 基本使用

3.1 核心命令

cd-hit -i input.fasta -o output.fasta -c 0.9 -n 5 -T 8 -M 16000

3.2 常用参数详解

参数含义说明
-i输入 fasta 文件必填
-o输出 fasta 文件前缀必填,会生成.fasta.fasta.clstr两个文件
-c序列同一性阈值0.9 = 90%,蛋白质常用 0.3~0.9
-nword size-c联动,见下表
-T线程数-T 0表示用所有 CPU
-M内存限制(MB)-M 16000= 16GB
-d描述行长度默认 20,设为 0 保留完整 header
-G全局序列比对默认 local,设为 1 用 global

3.3-c-n的对应关系

序列同一性阈值word size (-n)
≥ 0.75
≥ 0.64
≥ 0.53
< 0.52

四、输出文件解析

CD-HIT 运行后生成两个文件:

output.fasta ← 每个簇的代表序列 output.fasta.clstr ← 聚类明细(重点!)

4.1.clstr文件格式

>Cluster 0 0 234aa, >P12345... * 1 230aa, >Q67890... at 95.2% 2 229aa, >A11111... at 92.8% >Cluster 1 0 512aa, >B22222... * 1 510aa, >C33333... at 88.4%

每行含义:

  • >Cluster N:第 N 个簇
  • 0 234aa, >P12345... *:该簇的代表序列(*标记),长度 234aa
  • 1 230aa, >Q67890... at 95.2%:成员序列,与代表序列相似度 95.2%

4.2 Python 解析.clstr文件

def parse_clstr(clstr_path): """ 解析 CD-HIT .clstr 文件 返回: {protein_id: cluster_id} """ protein2cluster = {} cluster_id = None with open(clstr_path) as f: for line in f: line = line.strip() if line.startswith('>Cluster'): cluster_id = int(line.split()[1]) elif line: # 格式: 0 234aa, >P12345... * # 或: 1 230aa, >Q67890... at 95.2% pid = line.split('>')[1].split('...')[0] protein2cluster[pid] = cluster_id return protein2cluster # 使用示例 p2c = parse_clstr('output.fasta.clstr') print(f"总蛋白数: {len(p2c)}") print(f"簇数: {len(set(p2c.values()))}")

五、PPI 预测中的实战应用

问题背景

PPI 预测的训练样本是蛋白对 (A, B)。如果直接随机划分,测试集里可能出现与训练集蛋白序列相似度 > 90% 的蛋白,导致数据泄露。

解决方案:按 CD-HIT 簇划分数据集

核心思路:先对所有蛋白做 CD-HIT 聚类,再按簇划分 train/val/test,保证同簇蛋白只出现在同一个集合里。

import pandas as pd from sklearn.model_selection import GroupShuffleSplit # 1. 解析聚类结果 p2c = parse_clstr('CORUM_cdhit40.fasta.clstr') # 2. 加载 PPI 数据 df = pd.read_excel('CORUM_1.xlsx') # 列: UNIPROTID_A, UNIPROTID_B, Label # 3. 为每对 PPI 分配组 ID(取两个蛋白所在簇的较小值) def get_pair_group(row): ca = p2c.get(row['UNIPROTID_A'], -1) cb = p2c.get(row['UNIPROTID_B'], -1) if ca == -1 or cb == -1: return -1 return min(ca, cb) df['group'] = df.apply(get_pair_group, axis=1) df = df[df['group'] != -1].reset_index(drop=True) # 4. 按组划分(同簇蛋白不会跨集合) gss = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42) train_idx, temp_idx = next(gss.split(df, groups=df['group'])) df_train = df.iloc[train_idx] df_temp = df.iloc[temp_idx] gss2 = GroupShuffleSplit(n_splits=1, test_size=0.5, random_state=42) val_idx, test_idx = next(gss2.split(df_temp, groups=df_temp['group'])) df_val = df_temp.iloc[val_idx] df_test = df_temp.iloc[test_idx] # 5. 验证:训练集蛋白不应出现在测试集 train_prots = set(df_train['UNIPROTID_A']) | set(df_train['UNIPROTID_B']) test_prots = set(df_test['UNIPROTID_A']) | set(df_test['UNIPROTID_B']) overlap = train_prots & test_prots print(f"Train/Test 蛋白重叠数: {len(overlap)}") # 期望接近 0 # 6. 保存 df_train.drop(columns=['group']).to_excel('train_cdhit.xlsx', index=False) df_val.drop(columns=['group']).to_excel('val_cdhit.xlsx', index=False) df_test.drop(columns=['group']).to_excel('test_cdhit.xlsx', index=False)

完整 CD-HIT 运行命令

cd-hit \ -i /path/to/CORUM.fasta \ -o /path/to/CORUM_cdhit40.fasta \ -c 0.4 \ -n 2 \ -T 8 \ -M 16000

为什么用-c 0.4PPI 预测中常用 40% 作为严格阈值,保证测试集与训练集的序列差异足够大。若只需去除高度冗余,可用-c 0.9


六、总结

场景推荐-c阈值
去除高度冗余(构建非冗余库)0.9 ~ 1.0
一般去相似(发表论文要求)0.5 ~ 0.7
PPI 严格评估(防止数据泄露)0.3 ~ 0.4

CD-HIT 是生物信息学中最常用的序列去冗余工具,掌握它对 PPI 预测、蛋白分类、基因家族分析等任务都很有帮助。


参考资料:

  • 官方 GitHub:https://github.com/weizhongli/cdhit
  • 论文:Li, W. & Godzik, A. (2006). Cd-hit: a fast program for clustering and comparing large sets of protein or nucleotide sequences.Bioinformatics, 22(13), 1658-1659.
http://www.jsqmd.com/news/755370/

相关文章:

  • 大学生出租 QQ 需警惕的 10 大风险
  • START框架:融合空间与文本的图表理解技术解析
  • Python 算法基础篇之列表
  • 别只会用默认视图了!ORCAD属性过滤器深度玩法:为不同角色定制专属显示方案
  • 量化数据-个股资金流历史
  • YOLOv11革新:RFAConv空间注意力机制助力目标检测精度飞跃
  • 别再直接用了!实测SAM在CT/MRI/病理图上的分割效果,附保姆级微调实战(PyTorch)
  • SAP PP模块在电池厂的真实落地:从八大工序到月末调差,一个实施顾问的踩坑与填坑实录
  • 基于FPGA的数字解调系统中同步技术的设计及实现Costas算法【附代码】
  • 告别Optane后,国产SCM存储卡Xlenstor2 X2900P实测:真能平替吗?
  • 命令行工具集设计:模块化、配置化与工程化实践
  • 当大模型遇见快马:体验从需求到成品的AI辅助开发完整闭环
  • 从SENet到CBAM:手把手拆解注意力机制如何让CV模型更‘聪明’(原理、代码与避坑指南)
  • 别再为ES数据迁移发愁了!对比Kinaba、reindex和elasticdump,我最终选择了它(离线迁移实战)
  • 企业AI落地最大瓶颈不是算法,而是.NET 9中缺失的这1个NuGet包:Microsoft.ML.OnnxTransformer v9.0.0-preview3深度逆向解析与补丁方案
  • 告别重复劳动:用快马AI智能生成脚本,极速提升数据集处理效率
  • Transformer计算效率优化:SQA稀疏注意力机制详解
  • 别再死记硬背二分模板了!用‘买饮料’和‘砍树’两道题,带你彻底搞懂二分答案的Check函数怎么写
  • LoRWeB技术:基于LoRA的视觉类比编辑实践指南
  • SenCache:扩散模型推理加速技术解析与应用
  • 新手避坑指南:用PyCharm创建Flask项目时,90%的人都会踩的3个环境配置坑
  • 【图像去噪】基于matlab医疗图像的小波压缩与自适应去噪传输系统(含PSNR SSIM)【含Matlab源码 15400期】含报告
  • 【计算机毕业设计】基于springboot的贸易行业crm系统+LW
  • Spatial-SSRL-4B:40亿参数模型的空间理解突破
  • 射频芯片量产测试第一步:手把手教你搞定Open/Short和Leakage测试(附参数设置避坑指南)
  • DS4Windows终极指南:让PlayStation手柄在Windows上完美工作的完整教程
  • 【图像去噪】基于matlab分数双树复小波变换图像去噪【含Matlab源码 15389期】
  • 人-AI-环境系统中的“比较优势”理论
  • Galactic-AI:分层强化学习框架如何解决长期稀疏奖励任务
  • PHP 8.9扩展模块Fuzzing实战:用libFuzzer注入217万次异常输入后提炼出的4类内存越界加固模板代码