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.
相关推荐
vortex52 小时前
XFCE 桌面环境组件详解:从面板到剪贴板管理
linux·xfce·桌面环境
程序员猫哥_2 小时前
AI建站避坑指南:外贸人最关心的10个问题与客观解答
数据挖掘
Highcharts.js2 小时前
数据处理新革命产品发布:Highcharts Orbit 公测-开启图表数据分析的新维度
信息可视化·数据挖掘·数据分析·highcharts
淡海水2 小时前
【AI模型】模型量化技术详解
人工智能·算法·机器学习
勇闯逆流河3 小时前
【Linux】linux进程控制(进程池的详解与实现)
linux·运维·服务器
zhangfeng11333 小时前
部署到服务器上 宝塔系统 使用宝塔在线编辑器 FTP 批量上传 Git 部署 打包上传 codebudyy 编程程序开发
服务器·git·编辑器
WJ.Polar4 小时前
Scapy基本应用
linux·运维·网络·python
lljss20204 小时前
1. NameServer 域名服务器---NS
linux·服务器·前端
萧行之4 小时前
Ubuntu+Windows双系统:解决GRUB不显示Windows启动项、一闪而过问题
linux·windows·ubuntu