一、什么是 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
-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... *:该簇的代表序列(* 标记),长度 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.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.
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐