DNA序列分类:K-mer和One-hot编码特征比较

本代码展示了使用Python和KNN分类器对DNA序列进行分类的两种方法,并比较了K-mer和One-hot编码两种特征提取方法的性能。

1. 导入必要的库

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

2. 读取FASTA文件

# 从FASTA文件中读取DNA序列
def read_fasta_file(filename):
    sequences = []
    labels = []
    with open(filename) as f:
        sequence = ''
        for line in f:
            line = line.rstrip()
            if line.startswith('>'):
                labels.append(line[1:])
                if sequence != '':
                    sequences.append(sequence)
                sequence = ''
            else:
                sequence += line
        sequences.append(sequence)
    return sequences, labels

3. 特征提取

3.1 K-mer特征提取

# 将DNA序列转化为K-mer特征
def get_kmer_features(sequences, k):
    features = []
    for sequence in sequences:
        kmer_dict = {}
        seq_len = len(sequence)
        for i in range(seq_len - k + 1):
            kmer = sequence[i:i+k]
            if kmer not in kmer_dict:
                kmer_dict[kmer] = 0
            kmer_dict[kmer] += 1
        feature_vector = []
        for kmer in sorted(kmer_dict.keys()):
            feature_vector.append(kmer_dict[kmer])
        features.append(feature_vector)
    return np.array(features)

3.2 One-hot编码特征提取

# 将DNA序列转化为One-hot编码特征
def get_onehot_features(sequences):
    feature_dict = {'A': [1, 0, 0, 0], 'C': [0, 1, 0, 0], 'G': [0, 0, 1, 0], 'T': [0, 0, 0, 1]}
    features = []
    for sequence in sequences:
        feature_vector = []
        for base in sequence:
            feature_vector += feature_dict[base]
        features.append(feature_vector)
    return np.array(features)

4. 训练和测试

4.1 使用K-mer特征

# 读取FASTA文件
sequences, labels = read_fasta_file('sequences.fasta')
# 转换为特征向量并分为训练集和测试集
k = 6
features = get_kmer_features(sequences, k)
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
# 训练KNN分类器并计算不同K值下的分类准确率
for k in [1, 3, 5, 7, 9]:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print('K = {}, accuracy = {:.2f}%!'.format(k, accuracy * 100))

4.2 使用One-hot编码特征

# 读取FASTA文件
sequences, labels = read_fasta_file('sequences.fasta')
# 转换为特征向量并分为训练集和测试集
features = get_onehot_features(sequences)
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
# 训练KNN分类器并计算不同K值下的分类准确率
for k in [1, 3, 5, 7, 9]:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print('K = {}, accuracy = {:.2f}%!'.format(k, accuracy * 100))

5. 结果分析

通过比较两种特征提取方法在不同K值下的分类准确率,可以分析得出哪种方法更适合用于DNA序列分类。

注:

  • 该代码示例使用了一个名为'sequences.fasta'的FASTA文件,需要根据实际情况修改文件名。
  • 可以尝试调整K值和训练集/测试集比例,观察对分类准确率的影响。
  • 可以使用其他机器学习算法来代替KNN分类器,例如支持向量机(SVM)或随机森林。
DNA序列分类:K-mer和One-hot编码特征比较

原文地址: https://www.cveoy.top/t/topic/lEhA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录