EDA365电子论坛网

标题: 关于SVM神经网络中svmtrain函数的一个小问题 [打印本页]

作者: zzz.dan    时间: 2021-3-12 13:48
标题: 关于SVM神经网络中svmtrain函数的一个小问题
close all;
7 n5 D' o1 I; q6 y1 r2 b: Gclear;8 i9 |8 f2 b' p' [( \+ o
clc;
& C! ], D) V1 w3 Fformat compact;
2 D7 i1 q5 B/ _; O
+ s* y5 {" r6 G2 V1 v: Y5 o% 载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量
7 Q! d2 s6 F7 F0 fload chapter12_wine.mat;
8 o9 s( ^' Y+ b9 s9 B( j9 t/ ~# n8 m' h) L
% 画出测试数据的box可视化图5 |1 \$ a8 L8 b0 M. F$ d: D
figure;
4 P" t7 u) o) ~' zboxplot(wine,'orientation','horizontal','labels',categories);
) Q' c; J* R; \) @5 ttitle('wine数据的box可视化图','FontSize',12);. q0 f0 `. V& \4 l( _  X
xlabel('属性值','FontSize',12);
- `5 i: C1 {  o' Y8 Dgrid on;' m: O( o, J( C: P& T* W4 I" I
7 z2 s5 P. A* `
% 画出测试数据的分维可视化图; a6 a$ T1 r5 m) c# H, C
figure
! W" x' E" v& U) Psubplot(3,5,1);2 Y" u0 E9 i1 G8 @8 j" @
hold on
- K; T) Z. r7 ]9 gfor run = 1:178
  Q4 B3 X. [7 F    plot(run,wine_labels(run),'*');
' ?9 z) ?, ]9 U' p/ T- ?6 r6 Xend0 h* j) L4 E4 ]3 x) G
xlabel('样本','FontSize',10);* T- i) \( X' G* M$ j. T- r3 h  Y
ylabel('类别标签','FontSize',10);2 G2 }6 e* Q+ c6 ]
title('class','FontSize',10);
$ ?* N# t, G* `! X, F3 v" |$ S( F1 pfor run = 2:14  O$ g, y7 `7 {9 g+ C
    subplot(3,5,run);
6 ~3 S% c1 s/ F& C$ L, r# f; l    hold on;& D5 @1 k# c' ]4 e
    str = ['attrib ',num2str(run-1)];
& `, U- c9 D& ~- g! B( k    for i = 1:178% }* O- e0 _5 B
        plot(i,wine(i,run-1),'*');
% f0 L6 s) s& N+ i2 ]    end
& b: @) W; m7 x' n    xlabel('样本','FontSize',10);
! N# }& A8 }2 p( L! a, ?    ylabel('属性值','FontSize',10);' U& t' y; J. C+ f/ ]4 [
    title(str,'FontSize',10);; ~( E! |/ z# u& v6 ?4 \
end
- t4 _: ^) M* l7 E5 o+ }# }& E- F1 j, L" ?4 c- _$ |' p
% 选定训练集和测试集
2 w5 c  c0 j" U- p* r. C8 s: H% F- ~5 v" }( T
% 将第一类的1-30,第二类的60-95,第三类的131-153做为训练集; [" a% f$ r; I) L/ o
train_wine = [wine(1:30,;wine(60:95,;wine(131:153,];
3 u: \4 f' s; C% 相应的训练集的标签也要分离出来
. X! H# e* E' _9 xtrain_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];
- E, a) p- d8 M7 W4 h% 将第一类的31-59,第二类的96-130,第三类的154-178做为测试集/ ?: `  O0 x0 l7 H5 a
test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];
" H* ^; R7 t9 B* V4 i) }; T3 r% 相应的测试集的标签也要分离出来
! c4 v2 R7 i! p; V0 ftest_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];7 E& D2 }0 k* m/ I
! M7 J0 e5 K. m$ k0 L
[mtrain,ntrain] = size(train_wine);
( i0 O0 l" n& h/ P5 y% S* p[mtest,ntest] = size(test_wine);( P/ t8 @. J5 E/ B9 Q

. P6 i# n/ d' D# A8 ^dataset = [train_wine;test_wine];
/ W% e/ l1 u9 _4 Q$ H% mapminmax为MATLAB自带的归一化函数
+ a- A  x' q2 |2 t& w( W4 l$ N+ @[dataset_scale,ps] = mapminmax(dataset',0,1);
$ B6 q$ A# u" y* j+ Edataset_scale = dataset_scale';
& i' U1 [- l' O# p5 g9 M4 o/ a3 h
train_wine = dataset_scale(1:mtrain,:);5 T& j1 R0 x; n- Z- X6 y
test_wine = dataset_scale( (mtrain+1)mtrain+mtest),: );
& g8 l' j# j, W. I! {8 M%SVM网络训练# ^  z' R/ Z' Z: j* \
model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1');
: A5 ?. `$ j. k5 S6 C%SVM网络预测
1 I$ _% f  W  y) [( E[predict_label, accuracy] = svmpredict(test_wine_labels, test_wine, model);2 \' s4 P" p& E& D: ^1 [2 W
- X. X$ u9 e: ?& v$ \
% 测试集的实际分类和预测分类图% 通过图可以看出只有一个测试样本是被错分的figure;hold on;plot(test_wine_labels,'o');
2 {3 X( F6 d4 t* ^% L! K  {8 Aplot(predict_label,'r*');xlabel('测试集样本','FontSize',12);
! ~6 {+ I' n" C* |ylabel('类别标签','FontSize',12);legend('实际测试集分类','预测测试集分类');
4 @/ D; c! |: T- ~( m4 t# Q9 Ytitle('测试集的实际分类和预测分类图','FontSize',12);grid on;
4 M( D) ?# ?% x0 K2 O5 a& N, W7 ~$ o+ H2 d$ R, `( x
3 R( Y; {  O( [3 ?
【运行出现的问题】3 E; s; [4 w- D  C# ], \; G
??? Error using ==> svmtrain at 172  _$ P# \, l: \  a* Z
Group must be a vector.
  r: W$ i; L1 n/ _) Z' H& g0 lError in ==> chapter12 at 601 s1 T0 F; F$ [4 t8 Z
model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1');
, _  I; b' I3 ^- P5 H% I
+ p% i! Y2 T9 y7 j

作者: zzz.dan    时间: 2021-3-12 14:36
蹲一个大神
作者: 勇往直前11    时间: 2021-3-12 15:05
在命令行下面输入:
* }! Y/ C1 n9 l- ^9 f$ ]- d
4 _0 c8 v6 C0 f( ^; Vwhos train_wine_labels8 U$ _% v* w6 \7 U' {

( W1 Q5 J4 N3 A0 lwhos train_wie* f5 z/ U, {! h. r- Y# M( n) y9 N

# b; _$ x* Q- G; B. w! ?# _这样你可以知道参数的类别,该错误信息提醒你参数必须为向量才可以。
作者: 小白的白    时间: 2021-3-12 16:03
载入测试数据wine,其中包含的数据为classnumber = 3,wine:178*13的矩阵,wine_labes:178*1的列向量; V) w+ _! M- G' f
/ b4 U$ R/ x$ r3 }2 ~3 D
因为原始数据wine是矩阵,而不是向量 所以运行whos train_wine后如下显示
' K  \' z( I1 r. t9 W>> whos train_wine
* j: E+ s1 H. r  M1 v  Name             Size            Bytes  Class     Attributes
4 e* y7 g, ?+ t- E# b4 r+ c9 \9 ^
6 y& z: R- p& c, k/ ]+ M; F- J  train_wine      89x13             9256  double   9 r2 y& F; y# k: I
! k4 K; s4 p- s5 V5 ?8 J# f5 n0 W
那么此例中的svmtrain函数就不能应用了么??必须要改原始数据吗??




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2