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 安装(推荐)

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... *:该簇的代表序列(* 标记),长度 234aa
  • 1 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.
相关推荐
小小张说故事21 分钟前
LightGBM 入门指南:更快的梯度提升树,Python 实战
后端·python·机器学习
aixingkong92138 分钟前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
Omics Pro1 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
IT毕设梦工厂1 小时前
计算机毕业设计选题推荐:基于大数据的二手车数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·python·数据挖掘·数据分析·课程设计·数据分析数据可视化
雯宝3 小时前
mnt_init 函数
linux
SJZR3 小时前
图解归一化
人工智能·机器学习
计算机源码社4 小时前
【27届大数据毕设】基于机器学习与数据挖掘的电影评分预测与可视化大屏 基于Spark内存计算的电影译名流向与主题词云可视化分析
大数据·hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计
律宏阔9 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔9 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴9 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox