一、什么是 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 安装(推荐)
bash
conda install -c bioconda cd-hit
验证是否安装成功:
cd-hit --help
方式2:apt 安装(Ubuntu,需 sudo)
bash
sudo apt install cd-hit
方式3:源码编译(无 sudo、无 conda)
bash
# 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 |
-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 文件
python
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,保证同簇蛋白只出现在同一个集合里。
python
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 运行命令
bash
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.