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 160003.2 常用参数详解
| 参数 | 含义 | 说明 |
|---|---|---|
-i | 输入 fasta 文件 | 必填 |
-o | 输出 fasta 文件前缀 | 必填,会生成.fasta和.fasta.clstr两个文件 |
-c | 序列同一性阈值 | 0.9 = 90%,蛋白质常用 0.3~0.9 |
-n | word 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.7 | 5 |
| ≥ 0.6 | 4 |
| ≥ 0.5 | 3 |
| < 0.5 | 2 |
四、输出文件解析
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... *:该簇的代表序列(*标记),长度 234aa1 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.4?PPI 预测中常用 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.
