一、SVM,rbf内核,交叉验证
function [ classfication ] = SVM2_2( train,test )
%使用植物电信号数据进行二分类实验(45*30),其中,每一行代表一个样本,
%共有45行,每一个样本包含30个特征,即30列。且1-18,19-450行的数据为同一类,分别为dk(抗盐),LD(盐敏感)
data=xlsread('C:\Users\ihor\Desktop\30个特征参数.xlsx'); % 下载数据
meas=data(:,1:30); %选取出数据前45行,前30列:特征
species=data(:,31); %选取出数据前45行,最后1列:类别
X=meas;
Y=nominal(ismember(species,1));
P=cvpartition(Y,'holdout',0.2); %交叉验证,测试集为20%
%使用训练数据,进行SVM模型训练
svmModel = svmtrain(X(P.training,:),Y(P.training),'kernel_function','rbf','showplot',false);
%使用测试数据,测试分类效果
C = svmclassify(svmModel,X(P.test,:),'showplot',false);
%分类错误率
errRate = sum(Y(P.test)~= C)/P.TestSize
end
错误率30%~44%
下一步考虑特征降维。
t-SNE降维:
维数 | 错误率 |
2 | 0.89 |
3 | 0.44 |
4 | 0/0.11/0.22/0.44/0.33 |
5 | 0.44 |
6 | 0.33 |
7 | 0.22/0.11/0.56/0.33 |
8 | 0.44 |
9 | 0.33 |
10 | 0.44 |
11 | 0.33 |
12 | 0.33 |
13 | 0.44 |
14 | 0.44 |
15 | 0.44 |
16 | 0.44 |
17 | 0.44 |
20 | 0.33 |
21 | 0.33 |
29 | 0.33 |
30 | 0.44 |
二、BP神经网络
训练集:测试集=7:3
%读取训练数据
trainData = xlsread('C:\Users\ihor\Desktop\trainData.xlsx');
f=trainData(:,1:30); %选取出数据30行,前30列:特征
class=trainData(:,31); %选取出数据30行,最后1列:类别
%特征值归一化
[input,minI,maxI] = premnmx( f') ;
%构造输出矩阵
s = length( class ) ;
output = zeros( s , 2 ) ;
for i = 1 : s
output( i , class( i ) ) = 1 ;
end
%创建神经网络
net = newff( minmax(input) , [10 2] , { 'logsig' 'purelin' } , 'traingdx' ) ;
%设置训练参数
net.trainparam.show = 50 ;
net.trainparam.epochs = 500 ;
net.trainparam.goal = 0.01 ;
net.trainParam.lr = 0.01 ;
%开始训练
net = train( net, input , output' ) ;
%读取测试数据
testData = xlsread('C:\Users\ihor\Desktop\testData.xlsx');
t=testData(:,1:30); %选取出数据15行,前30列:特征
c=testData(:,31); %选取出数据15行,最后1列:类别
%测试数据归一化
testInput = tramnmx ( t' , minI, maxI ) ;
%仿真
Y = sim( net , testInput )
%统计识别正确率
[s1 , s2] = size( Y ) ;
hitNum = 0 ;
for i = 1 : s2
[m , Index] = max( Y( : , i ) ) ;
if( Index == c(i) )
hitNum = hitNum + 1 ;
end
end
sprintf('识别率是 %3.3f%%',100 * hitNum / s2 )
神经元个数 | 激活函数 | 训练函数 | 训练次数show | 最大训练次数epochs | 性能目标goal | 学习速率lr | 识别率 |
10 | logisig、purelin | traingdx | 50 | 500 | 0.01 | 0.01 | 53.33%~60% |
三、朴素贝叶斯
%2018.4.16
%读取训练、测试集
Data_train = xlsread('C:\Users\ihor\Desktop\trainData.xlsx');
Data_prediction = xlsread('C:\Users\ihor\Desktop\testData.xlsx');
%训练集特征、类别
training_data = Data_train(:,1:30);
training_label = Data_train(:,31);
%测试集特征、类别
prediction_data = Data_prediction(:,1:30);
prediction_label = Data_prediction(:,31);
%朴素贝叶斯分类
nb=NaiveBayes.fit(training_data,training_label);
predict_label1=predict(nb,prediction_data);
%准确率
training_accuracy=length(find(predict_label1==prediction_label))/length(prediction_label)
不降维分类的准确率有53.33%