基于LSTM对DNA功能建立分类预测模型------DEMO

基于LSTM对DNA功能建立分类预测模型

内容说明

  • matlab2020b 在线版 正常运行
  • 代码在官网的例子基础上进行修改
  • 主要目的通过NCBI上下载DNA序列对序列建立预测模型分类模型
  • 分享的代码是一个初级demo许多部分有待完善只是用做学习交流

代完善部分

  • 建立特定物种的DNA分词数据库
  • 完善分词模型的参数设计
  • 输出不同分类的标签调整为最后一层的概率分布
  • 如何将已有的知识背景更好的结合。

数据说明

  • 从NCBI下载的ATCC367的全基因组数据
  • 数据只进行了简单的预处理,与具体应用有很大差距。后续会持续更新完善。
  • 欢迎交流学习,,,长期接代码定制

主函数

%% 尝试用文本分词对dna数据训练。参考matlab官网的例子
%% 利用LSTM对不同的DNA序列进行分类
% matlab 2020b 运行
% 尚帝 1602480875@qq.com
%% 清理环境空间
clc
clear 
close all
%% 读取DNA数据与预处理
a=importdata('sequence.fasta');
c=a.Sequence;
n_num=500;
for i=1:n_num
    c_1(i,:)=c(i*120:(i+1)*120); %序列的长度
    cc(i,:)= strtrim(regexprep(c_1(i,:), '.{3}', '$0 ')); %每三个字符加一个空格
    hh(i,1)= ceil(rand(1)*4+0);%随机录入标签
end
cc_t=table(cc(1:n_num-5,:),hh(1:n_num-5,:),'VariableNames',{'Description','Category'});
%% 数据处理
data=cc_t;
data.Category = categorical(cc_t.Category);

% figure
% histogram(data.Category);
% xlabel("Class")
% ylabel("Frequency")
% title("Class Distribution")
cvp = cvpartition(data.Category,'Holdout',0.2); %选择20%作为测试集合
dataTrain = data(training(cvp),:);
dataValidation = data(test(cvp),:);
textDataTrain = dataTrain.Description;
textDataValidation = dataValidation.Description;
YTrain = dataTrain.Category;
YValidation = dataValidation.Category;
figure
wordcloud(textDataTrain);
title("Training Data")
%% 对序列进行分词 此处需要更改,
documentsTrain = cellstr(textDataTrain); %调整数据类型
documentsTrain=tokenizedDocument(documentsTrain);% 进行分词统计 官网使用的是其他函数
documentsValidation = cellstr(textDataValidation);
documentsValidation=tokenizedDocument(documentsValidation);
% documentsTrain(1:100,:) 数据展示
enc = wordEncoding(documentsTrain);% 自带分词库 需要根据需求调整
documentLengths = doclength(documentsTrain);
% figure
% histogram(documentLengths)
% title("Document Lengths")
% xlabel("Length")
% ylabel("Number of Documents")
%% 设置训练的参数
sequenceLength = 3; %词的截断长度
XTrain = doc2sequence(enc,documentsTrain,'Length',sequenceLength);
XTrain(1:5)
XValidation = doc2sequence(enc,documentsValidation,'Length',sequenceLength);
inputSize = 1;
embeddingDimension = 50;
numHiddenUnits = 80;

numWords = enc.NumWords;
numClasses = numel(categories(YTrain));
% 层结构
layers = [ ...
    sequenceInputLayer(inputSize)
    wordEmbeddingLayer(embeddingDimension,numWords)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer]
%超参
options = trainingOptions('adam', ...
    'MiniBatchSize',16, ...
    'GradientThreshold',2, ...
    'Shuffle','every-epoch', ...
    'ValidationData',{XValidation,YValidation}, ...
    'Plots','training-progress', ...
    'Verbose',false);
%训练
net = trainNetwork(XTrain,YTrain,layers,options);
%预测
reportsNew =cc(n_num-5:end,:);
documentsNew = cellstr(reportsNew);
documentsNew=tokenizedDocument(documentsNew);
XNew = doc2sequence(enc,documentsNew,'Length',sequenceLength);
%结果输出
labelsNew = classify(net,XNew)

运行结果

选择数据的文字云展示

选择数据的文字云

迭代结果

在这里插入图片描述

在这里插入图片描述

分类结果在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值