Fails when using sequentialfs in MATLAB? - matlab
I am trying to use sequentialfs on a logistic regression in order to determine the variables to include. I have tried to modify the answer from here Sequential feature selection Matlab in order to make it work, but the handle part is tricky to me!
I am using
[b, dev, stats] = glmfit(X_train,y_train,'binomial','link','logit')
in order to fit a model, and then I use
y_hat = glmval(b,X_test,'logit');
to evaluate the model output. I have tried to make a handle
f = #(X_test, y_test)...
(sum(y_test ~= round(glmval(b,X_test,'logit'))))
Which just says that I have "Too many input arguments", when I use
sequentialfs(f,X,y)
Can anyone help identify the relevant variables? A data set is below, where all variables will be deemed relevant, but the real problem is of a much larger scale which leads to overparametrization of the model.
X=
0,0305780001742986 0,0293310740486058 0,0289653631914407 0,0313646568650811 0,0308948854477814 0,0298740323895053
0,0221062699789144 0,0213746063391538 0,0196872068542263 0,0209915418572080 0,0206064713419377 0,0198587113064423
0,0275588428138312 0,0273957214651399 0,0291622596392042 0,0313729847567230 0,0314439993783026 0,0307137185244424
0,0262451954064372 0,0230629198767100 0,0251192876802874 0,0243459679829053 0,0235752627390268 0,0245208219450122
0,0232074343987232 0,0272778269415268 0,0288725913067116 0,0274565324127577 0,0283032894902223 0,0287391056368953
0,0237589488887855 0,0251929947662669 0,0209989755767701 0,0146662148369109 0,0193830305676060 0,0198900627308170
0,0275142606053146 0,0311683593689258 0,0287109246912083 0,0307544961383919 0,0293964246310913 0,0291758079280418
0,0284337063240141 0,0249820611584738 0,0261664330153102 0,0270312804219022 0,0269178494606530 0,0273467522864029
0,0279150521116060 0,0314021886143824 0,0291020356476994 0,0278247389567505 0,0294200854382611 0,0306460336509255
0,0270622115094110 0,0317795784913586 0,0278283619288299 0,0307757941373800 0,0292513615541838 0,0283900407512898
0,0270275432108930 0,0330384417745352 0,0323886885104962 0,0330255939800101 0,0329789138848656 0,0333091935226094
0,0263417729025468 0,0243442097895390 0,0253328659546050 0,0270828343149025 0,0262845355278762 0,0257915212526289
0,0247503544929709 0,0282150822748136 0,0282408722769508 0,0306907484707723 0,0284025718962319 0,0280291257508206
0,0282116130443164 0,0259317921438547 0,0316179116969559 0,0300579055064814 0,0315134680888256 0,0299693403497154
0,0221040769734790 0,0232354360252008 0,0231588261739581 0,0240414200785524 0,0209509517094598 0,0223174875964419
0,0264965936690525 0,0312918915850473 0,0297480867085914 0,0349060220702562 0,0307640365732823 0,0299291946182921
0,0283027112468824 0,0288419304885060 0,0275801208398665 0,0239401671924088 0,0263296648119700 0,0260497226349653
0,0298063469363023 0,0253535298515575 0,0245113899712628 0,0158158669753461 0,0228044538675689 0,0221885556611738
0,0276409442724517 0,0283430130710139 0,0303893043659674 0,0314511518633802 0,0315673022208602 0,0302375851656905
0,0270849987059202 0,0312381323489334 0,0301662309393833 0,0290482017036615 0,0299207348490636 0,0295746114571195
0,0225683074444599 0,0297455473987182 0,0241145950178924 0,0233857691372279 0,0259911200866772 0,0248345888658664
0,0267870191916224 0,0254332496269710 0,0270915983261551 0,0263567311441536 0,0267470932454238 0,0279742674970829
0,0271933786309775 0,0274722435013798 0,0249484244285920 0,0301299698898670 0,0255527349811283 0,0263901147510067
0,0262114755708772 0,0168593285634855 0,0205147916736994 0,0227484518393022 0,0187327306255277 0,0197581601499656
0,0314796048983783 0,0281771847088388 0,0318159664952504 0,0325586660052902 0,0315277330661507 0,0324593871738733
0,0265694239044569 0,0239306067986609 0,0263341531447523 0,0277011505766640 0,0274385429019891 0,0258861916796922
0,0248731179403750 0,0253801474063385 0,0258606627949811 0,0234446644496543 0,0262626821946271 0,0265908368467206
0,0268335079060221 0,0327877888534457 0,0292050848084788 0,0286811931594028 0,0288058286572012 0,0297311873407772
0,0289655102183149 0,0297912585631799 0,0289955796469846 0,0301374575223736 0,0286017508461882 0,0294957275181626
0,0291599221376467 0,0284752300175276 0,0294302899166185 0,0291600417637315 0,0304544724881292 0,0299842921064845
0,0306574107981617 0,0282562949634004 0,0290757741762068 0,0266759231631069 0,0276079132984815 0,0283490628634946
0,0251419690541645 0,0190208495552799 0,0219740565645893 0,0229700198654972 0,0231913971059666 0,0218104715761714
0,0279646047804379 0,0213712975401601 0,0266486742241442 0,0282351537040943 0,0256010069497723 0,0254151479565295
0,0291819765619095 0,0274841050997730 0,0277287252877124 0,0253910521460239 0,0270103968729900 0,0280719282161061
0,0267034888169756 0,0230641558482702 0,0254891453796317 0,0246876229024146 0,0232209026694445 0,0255548967304529
0,0282525579813869 0,0275995431014968 0,0263616638576222 0,0282844384170093 0,0262147272435204 0,0257109782177451
0,0293098464976821 0,0323503780295293 0,0266630772869637 0,0228075737924046 0,0263296732877124 0,0254313353506367
y=
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
The function you use for sequentialfs should take in four variables. Yours only accepts two:
criterion = fun(XTRAIN,ytrain,XTEST,ytest)
This is because, even though you give only two variables, X and y, sequentialfs splits these into a training and testing subset (straight from the docs):
Starting from an empty feature set, sequentialfs creates candidate
feature subsets by sequentially adding each of the features not yet
selected. For each candidate feature subset, sequentialfs performs
10-fold cross-validation by repeatedly calling fun with different
training subsets of X and y, XTRAIN and ytrain, and test subsets of X
and y, XTEST and ytest
So the function passed for sequentialfs must take both the training and test subsets, e.g.:
function criterion = my_function(X_train,y_train,X_test,y_test)
[b, dev, stats] = glmfit(X_train,y_train,'binomial','link','logit')
y_hat = glmval(b,X_test,'logit');
criterion = sum(y_test ~= round(y_hat));
end
If this function is on your path you can pass it as #my_function, you don't have to make an anonymous function to get a handle.
Related
Having trouble in using nlinfit function in MATLAB
Kindly please help me with the problem as I need to use nlinfit function for fitting unknown parameters but it is showing some error. Although yesterday I was getting some values for parameters to be fitted but now if I am running it is having some issue for the function output to be used in fitted with NaN answer for last iteration only. X data is a concatenated matrix of three columns as independent variable and yk is dependent variable, taua is a matrix of initial guesses of number of parameters to be fitted. function [yk]=activity_coefficientE(taua,x) T=523; alpha12=0.3; alpha13=0.3; alpha21=0.3; alpha23=0.3; alpha31=0.3; alpha32=0.3; alpha18=0.2; alpha81=0.2; alpha28=0.2; alpha82=0.2; alpha38=0.2; alpha83=0.3; alpha19=0.2; alpha91=0.2; alpha29=0.2; alpha92=0.2; alpha39=0.2; alpha93=0.2; alpha110=0.2;alpha101=0.2;alpha210=0.2;alpha102=0.2;alpha310=0.2;alpha103=0.2; alpha113=0.2;alpha131=0.2;alpha213=0.2;alpha132=0.2;alpha313=0.2;alpha133=0.2; alpha114=0.2;alpha141=0.2;alpha214=0.2;alpha142=0.2;alpha314=0.2;alpha143=0.2; alpha115=0.2;alpha151=0.2;alpha215=0.2;alpha152=0.2;alpha315=0.2;alpha153=0.2; alpha117=0.2;alpha171=0.2;alpha217=0.2;alpha172=0.2;alpha317=0.2;alpha173=0.2; alpha118=0.2;alpha181=0.2;alpha218=0.2;alpha182=0.2;alpha318=0.2;alpha183=0.2; alpha810=0.2;alpha915=0.2;alpha1314=0.2;alpha108=0.2;alpha159=0.2;alpha1413=0.2; alpha1718=0.2;alpha1817=0.2; tau12=0; tau13=0; tau21=0; tau23=0; tau31=0; tau32=0; %taua=randi([-5,5],1,112) tau18=taua(1)+taua(57)/T; tau81=taua(2)+taua(58)/T; tau28=taua(3)+taua(59)/T; tau82=taua(4)+taua(60)/T; tau38=taua(5)+taua(61)/T; tau83=taua(6)+taua(62)/T; tau19=taua(7)+taua(63)/T; tau91=taua(8)+taua(64)/T; tau29=taua(9)+taua(65)/T; tau92=taua(10)+taua(66)/T; tau39=taua(11)+taua(67)/T; tau93=taua(12)+taua(68)/T; tau110=taua(13)+taua(69)/T; tau101=taua(14)+taua(70)/T; tau210=taua(15)+taua(71)/T; tau102=taua(16)+taua(72)/T; tau310=taua(17)+taua(73)/T; tau103=taua(18)+taua(74)/T; tau113=taua(19)+taua(75)/T; tau131=taua(20)+taua(76)/T; tau213=taua(21)+taua(77)/T; tau132=taua(22)+taua(78)/T; tau313=taua(23)+taua(79)/T; tau133=taua(24)+taua(80)/T; tau114=taua(25)+taua(81)/T; tau141=taua(26)+taua(82)/T; tau214=taua(27)+taua(83)/T; tau142=taua(28)+taua(84)/T; tau314=taua(29)+taua(85)/T; tau143=taua(30)+taua(86)/T; tau115=taua(31)+taua(87)/T; tau151=taua(32)+taua(88)/T; tau215=taua(33)+taua(89)/T; tau152=taua(34)+taua(90)/T; tau315=taua(35)+taua(91)/T; tau153=taua(36)+taua(92)/T; tau117=taua(37)+taua(93)/T; tau171=taua(38)+taua(94)/T; tau217=taua(39)+taua(95)/T; tau172=taua(40)+taua(96)/T; tau317=taua(41)+taua(97)/T; tau173=taua(42)+taua(98)/T; tau118=taua(43)+taua(99)/T; tau181=taua(44)+taua(100)/T; tau218=taua(45)+taua(101)/T; tau182=taua(46)+taua(102)/T; tau318=taua(47)+taua(103)/T; tau183=taua(48)+taua(104)/T; tau810=taua(49)+taua(105)/T; tau108=taua(50)+taua(106)/T; tau915=taua(51)+taua(107)/T; tau159=taua(52)+taua(108)/T; tau1314=taua(53)+taua(109)/T; tau1413=taua(54)+taua(110)/T; tau1718=taua(55)+taua(111)/T; tau1817=taua(56)+taua(112)/T; G12=exp(-(tau12*alpha12)); G21=exp(-(tau21*alpha21)); G13=exp(-(tau13*alpha13)); G31=exp(-(tau31*alpha31)); G23=exp(-(tau23*alpha23)); G32=exp(-(tau32*alpha32)); G18=exp(-(tau18*alpha18)); G81=exp(-(tau81*alpha81)); G28=exp(-(tau28*alpha28)); G82=exp(-(tau82*alpha82)); G38=exp(-(tau38*alpha83)); G83=exp(-(tau83*alpha83)); G19=exp(-(tau19*alpha19)); G91=exp(-(tau91*alpha91)); G29=exp(-(tau29*alpha29)); G92=exp(-(tau92*alpha92)); G39=exp(-(tau39*alpha39)); G93=exp(-(tau93*alpha93)); G110=exp(-(tau110*alpha110)); G101=exp(-(tau101*alpha101)); G210=exp(-(tau210*alpha210)); G102=exp(-(tau102*alpha102)); G310=exp(-(tau310*alpha310)); G103=exp(-(tau103*alpha103)); G113=exp(-(tau113*alpha113)); G131=exp(-(tau131*alpha131)); G213=exp(-(tau213*alpha213)); G132=exp(-(tau132*alpha132)); G313=exp(-(tau313*alpha313)); G133=exp(-(tau133*alpha133)); G114=exp(-(tau114*alpha114)); G141=exp(-(tau141*alpha141)); G214=exp(-(tau214*alpha214)); G142=exp(-(tau142*alpha142)); G314=exp(-(tau314*alpha314)); G143=exp(-(tau143*alpha143)); G115=exp(-(tau115*alpha115)); G151=exp(-(tau151*alpha151)); G215=exp(-(tau215*alpha215)); G152=exp(-(tau152*alpha152)); G315=exp(-(tau315*alpha315)); G153=exp(-(tau153*alpha153)); G117=exp(-(tau117*alpha117)); G171=exp(-(tau171*alpha171)); G217=exp(-(tau217*alpha217)); G172=exp(-(tau172*alpha172)); G317=exp(-(tau317*alpha317)); G173=exp(-(tau173*alpha173)); G118=exp(-(tau118*alpha118)); G181=exp(-(tau181*alpha181)); G218=exp(-(tau218*alpha218)); G182=exp(-(tau182*alpha182)); G318=exp(-(tau318*alpha318)); G183=exp(-(tau183*alpha183)); G810=exp(-(tau810*alpha810)); G108=exp(-(tau108*alpha108)); G915=exp(-(tau915*alpha915)); G159=exp(-(tau159*alpha159)); G1314=exp(-(tau1314*alpha1314)); G1413=exp(-(tau1413*alpha1413)); G1718=exp(-(tau1718*alpha1718)); G1817=exp(-(tau1817*alpha1817)); %calculating mole fractions of ionic species x1=x(:,1); x2=x(:,2); x3=x(:,3); %x1=[0.1577 0.1492 0.1462 0.1366 0.1299 0.1180 0.0863 0.0761 0.0550 ]; %x2=[0.8278 0.7945 0.7678 0.7450 0.6979 0.6309 0.4611 0.4114 0.2952 ]; %x3=[0.0145 0.0563 0.0860 0.1184 0.1722 0.2511 0.4526 0.5125 0.6498 ]; A=[0.0674243 0.0773881 0.0843400 0.0865343 0.0899223 0.0882858 0.0715087 0.0643867 0.0483658]; B=[0.0141081 0.0479814 0.0643151 0.0737477 0.0820756 0.0838701 0.0701576 0.0634457 0.0479639]; C=[0.0565665 0.0450072 0.0387724 0.0313828 0.02506094 0.0186280 0.0092734 0.0073438 0.0041595 ]; D=[0.0336447 0.0267694 0.0230611 0.0186659 0.0149058 0.0110795 0.0055157 0.0043679 0.0024739 ]; E=[0.0008148 0.0008756 0.00087131 0.0008794 0.0008711 0.0008441 0.0007384 0.0006997 0.0005980 ]; N=length(A); x1n=zeros(N,1);x2n=zeros(N,1);x3n=zeros(N,1); X1=zeros(N,1);X2=zeros(N,1);X3=zeros(N,1);X4=zeros(N,1);X5=zeros(N,1);X6=zeros(N,1);X7=zeros(N,1); X12=zeros(N,1);X16=zeros(N,1); for i=1:N x1n(i)=(x1(i)-A(i)-D(i)-2*E(i)-C(i)+3*B(i)) x2n(i)=(x2(i)-A(i)-C(i)-D(i)) x3n(i)=(x3(i)-B(i)) X1(i)=(x1n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X2(i)=(x2n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X3(i)=(x3n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X4(i)=(A(i)+D(i)+E(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X5(i)=(C(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X6(i)=(A(i)-B(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X7(i)=(B(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X12(i)=(E(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) X16(i)=(C(i)+D(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))) end yc4=X4./(X4+X5); yc5=X5./(X4+X5); yc6=X6./(X6+X7+X12+X16); yc7=X7./(X6+X7+X12+X16); yc12=X12./(X6+X7+X12+X16); yc16=X16./(X6+X7+X12+X16); alpha14=yc6.*alpha18+yc7.*alpha19+yc12.*alpha113+yc16.*alpha117; %alpha41=alpha14; alpha24=yc6.*alpha28+yc7.*alpha29+yc12.*alpha213+yc16.*alpha217; %alpha42=alpha24; alpha34=yc6.*alpha38+yc7.*alpha39+yc12.*alpha313+yc16.*alpha317; %alpha43=alpha34; alpha15=yc6.*alpha110+yc7.*alpha115+yc12.*alpha114+yc16.*alpha118; %alpha51=alpha15; alpha25=yc6.*alpha210+yc7.*alpha215+yc12.*alpha214+yc16.*alpha218; %alpha52=alpha25; alpha35=yc6.*alpha310+yc7.*alpha315+yc12.*alpha314+yc16.*alpha318; %alpha53=alpha35; alpha16=yc4.*alpha81+yc5.*alpha101; %alpha61=alpha16; alpha26=yc4.*alpha82+yc5.*alpha102; %alpha62=alpha26; alpha36=yc4.*alpha83+yc5.*alpha103; %alpha63=alpha36; alpha17=yc4.*alpha91+yc5.*alpha151; %alpha71=alpha17; alpha27=yc4.*alpha92+yc5.*alpha152; %alpha72=alpha27; alpha37=yc4.*alpha93+yc5.*alpha153; %alpha73=alpha37; alpha112=yc4.*alpha131+yc5.*alpha141; %alpha121=alpha112; alpha212=yc4.*alpha132+yc5.*alpha142; %alpha122=alpha212; alpha312=yc4.*alpha133+yc5.*alpha143; %alpha123=alpha312; alpha116=yc4.*alpha171+yc5.*alpha181; %alpha161=alpha116; alpha216=yc4.*alpha172+yc5.*alpha182; %alpha162=alpha216; alpha316=yc4.*alpha173+yc5.*alpha183; %alpha163=alpha316; alpha46=yc5.*alpha810; %alpha64=alpha46; alpha47=yc5.*alpha915; %alpha74=alpha47; alpha412=yc5.*alpha1314; %alpha124=alpha412; alpha416=yc5.*alpha1718; %alpha164=alpha416; alpha56=yc4.*alpha108; %alpha65=alpha56; alpha57=yc4.*alpha159; %alpha75=alpha57; alpha512=yc4.*alpha1413; %alpha125=alpha512; alpha516=yc4.*alpha1817; %alpha165=alpha516; G14=yc6.*G18+yc7.*G19+yc12.*G113+yc16.*G117; %G41=G14; G24=yc6.*G28+yc7.*G29+yc12.*G213+yc16.*G217; %G42=G24; G34=yc6.*G38+yc7.*G39+yc12.*G313+yc16.*G317; %G43=G34; G15=yc6.*G110+yc7.*G115+yc12.*G114+yc16.*G118; %G51=G15; G25=yc6.*G210+yc7.*G215+yc12.*G214+yc16.*G218; %G52=G25; G35=yc6.*G310+yc7.*G315+yc12.*G314+yc16.*G318; %G53=G35; G16=yc4.*G81+yc5.*G101; %G61=G16; G26=yc4.*G82+yc5.*G102; %G62=G26; G36=yc4.*G83+yc5.*G103; %G63=G36; G17=yc4.*G91+yc5.*G151; %G71=G17; G27=yc4.*G92+yc5.*G152; %G72=G27; G37=yc4.*G93+yc5.*G153; %G73=G37; G112=yc4.*G131+yc5.*G141; %G121=G112; G212=yc4.*G132+yc5.*G142; %G122=G212; G312=yc4.*G133+yc5.*G143; %G123=G312; G116=yc4.*G171+yc5.*G181; %G161=G116; G216=yc4.*G172+yc5.*G182; %G162=G216; G316=yc4.*G173+yc5.*G183; %G163=G316; G46=yc5.*G810; %G64=G46; G47=yc5.*G915; %G74=G47; G412=yc5.*G1314; %G124=G412; G416=yc5.*G1718; %G164=G416; G56=yc4.*G108; %G65=G56; G57=yc4.*G159; %G75=G57; G512=yc4.*G1413; %G125=G512; G516=yc4.*G1817; %G165=G516; tau14=-log(G14)./alpha14; %tau41=tau14; tau24=-log(G24)./alpha24; %tau42=tau24; tau34=-log(G34)./alpha34; %tau43=tau34; tau15=-log(G15)./alpha15; %tau51=tau15; tau25=-log(G25)./alpha25; %tau52=tau25; tau35=-log(G35)./alpha35; %tau53=tau35; tau16=-log(G16)./alpha16; %tau61=tau16; tau26=-log(G26)./alpha26; %tau62=tau26; tau36=-log(G36)./alpha36; %tau63=tau36; tau17=-log(G17)./alpha17; %tau71=tau17; tau27=-log(G27)./alpha27; %tau72=tau27; tau37=-log(G37)./alpha37; %tau73=tau37; tau112=-log(G112)./alpha112; %tau121=tau112; tau212=-log(G212)./alpha212; %tau122=tau212; tau312=-log(G312)./alpha312; %tau123=tau312; tau116=-log(G116)./alpha116; %tau161=tau116; tau216=-log(G216)./alpha216; %tau162=tau216; tau316=-log(G316)./alpha316; %tau163=tau316; tau46=-log(G46)./alpha46; %tau64=tau46; tau47=-log(G47)./alpha47; %tau74=tau47; tau412=-log(G412)./alpha412; %tau124=tau412; tau416=-log(G416)./alpha416; %tau164=tau416; tau56=-log(G56)./alpha56; %tau65=tau56; tau57=-log(G57)./alpha57; %tau75=tau57; tau512=-log(G512)./alpha512; %tau125=tau512; tau516=-log(G516)./alpha516; %tau165=tau516; ln_y1_1=G12.*X2.*tau12+ G31.*X3.*tau13+ G14.*X4.*tau14+G15.*X5.*tau15+G16.*X6.*tau16+G17.*X7.*tau17+G112.*X12.*tau112+G116.*X16.*tau116; ln_y1_2=G12.*X2+ G13.*X3+ G14.*X4+G15.*X5+G16.*X6+G17.*X7+G112.*X12+G116.*X16; ln_y2_1=G21.*X1.*tau12+ G32.*X3.*tau32+ G24.*X4.*tau24+G25.*X5.*tau25+G26.*X6.*tau26+G27.*X7.*tau27+G212.*X12.*tau212+G216.*X16.*tau216; ln_y2_2=G12.*X1+ G23.*X3+G24.*X4+G25.*X5+G26.*X6+G27.*X7+G212.*X12+G216.*X16; ln_y3_1=G13.*X1.*tau13+ G23.*X3.*tau23+ G34.*X4.*tau34+G35.*X5.*tau35+G36.*X6.*tau36+G37.*X7.*tau37+G312.*X12.*tau312+G316.*X16.*tau316; ln_y3_2=G13.*X1+ G23.*X3+ G34.*X4+G35.*X5+G36.*X6+G37.*X7+G312.*X12+G316.*X16; ln_y4_1=G14.*X1.*tau14+G24.*X2.*tau24+G34.*X3.*tau34+G46.*X6.*tau46+G47.*X7.*tau47+G412.*X12.*tau412+G416.*X16.*tau416; ln_y4_2=G14.*X1+G24.*X2+G34.*X3+G46.*X6+G47.*X7+G412.*X12+G416.*X16; ln_y5_1=G15.*X1.*tau15+G25.*X2.*tau25+G35.*X3.*tau35+G56.*X6.*tau56+G57.*X7.*tau57+G512.*X12.*tau512+G516.*X16.*tau516; ln_y5_2=G15.*X1+G25.*X2+G35.*X3+G56.*X6+G57.*X7+G512.*X12+G516.*X16; ln_y6_1=G16.*X1.*tau16+G26.*X2.*tau26+G36.*X3.*tau36+G46.*X4.*tau46+G56.*X5.*tau56; ln_y6_2=G16.*X1+G26.*X2+G36.*X3+G46.*X4+G56.*X5; ln_y7_1=G17.*X1.*tau17+G27.*X2.*tau27+G37.*X3.*tau37+G47.*X4.*tau47+G57.*X5.*tau57; ln_y7_2=G17.*X1+G27.*X2+G37.*X3+G47.*X4+G57.*X5; ln_y12_1=G112.*X1.*tau112+G212.*X2.*tau212+G312.*X3.*tau312+G412.*X4.*tau412+G512.*X5.*tau512; ln_y12_2=G112.*X1+G212.*X2+G312.*X3+G412.*X4+G512.*X5; ln_y16_1=G116.*X1.*tau116+G216.*X2.*tau216+G316.*X3.*tau316+G416.*X4.*tau416+G516.*X5.*tau516; ln_y16_2=G116.*X1+G216.*X2+G316.*X3+G416.*X4+G516.*X5; ln_y1_3=(((X2.*G12)./ln_y2_2).*(tau12-(ln_y2_1)./(ln_y2_2)))+(((X3.*G13)./ln_y3_2).*(tau13-(ln_y3_1)./(ln_y3_2))); ln_y1_4=(((X6.*G16)./ln_y6_2).*(tau16- (ln_y6_1./ln_y6_2))) + (((X7.*G17)./ln_y7_2).*(tau17- (ln_y7_1./ln_y7_2)))+(((X12.*G12)./ln_y12_2).*(tau112- (ln_y12_1./ln_y12_2)))+(((X16.*G16)./ln_y16_2).*(tau116- (ln_y16_1./ln_y16_2))); ln_y1_5=(((X4.*G14)./ln_y4_2).*(tau14- (ln_y4_1./ln_y4_2))) + (((X5.*G15)./ln_y5_2).*(tau15- (ln_y5_1./ln_y5_2))); yk=exp((ln_y1_1./ln_y1_2) + ln_y1_3 + ln_y1_4+ ln_y1_5) % activity coefficient for H2O end ........................................ Another function where above function to be called..... % calling the function act_coeff to estimate the binary interaction parameters for i=1:112 filename = 'EagelsDATA.xlsx'; %reading VLE data from excel file Data = xlsread(filename); x(:,1) = Data([10:15 17:19],16); x(:,2) = Data([10:15 17:19],1); x(:,3)= Data([10:15 17:19],2); taua=(randi([-5,5],1,112)); yk=[0.0606 (values calculated from above function and will be used for fitting) 0.4327 0.6545 0.9417 1.2570 1.6881 1.9108 1.7777 1.3821] % taua =[ -2 3 4 -3 -4 1 4 -2 4 -4 -1 4 5 -3 3 2 -5 3 -4 % 1 4 1 5 -1 -1 -3 2 -3 4 3 4 2 5 4 -2 4 3 -1 % 1 0 -5 -5 -5 -3 4 2 1 4 0 2 -3 -4 5 0 -3 2 5 % 1 0 5 1 -3 5 4 1 5 2 3 2 0 -5 -4 -2 1 -2 5 %-5 5 -2 -2 4 1 -1 3 -1 1 5 -1 0 -1 4 5 5 1 4 % 1 0 4 -4 4 0 -1 -2 -5 -3 -4 -5 % -5 0 -2 0 -5] (random values for which yk was calculted from the command taua= randi([-5,5],1,112)) try % try-catch used to continue the loop without stopping on encountering an error [taua1]= nlinfit(x,yk,#activity_coefficientE,taua) catch exception continue end end I am not able to attach excel sheet here so data from excel sheet is as: x =[0.1577 0.1492 0.1462 0.1366 0.1299 0.1180 0.0863 0.0761 0.0550; column 1 0.8278 0.7945 0.7678 0.7450 0.6979 0.6309 0.4611 0.4114 0.2952 ; column 2 0.0145 0.0563 0.0860 0.1184 0.1722 0.2511 0.4526 0.5125 0.6498 ]; column 3
I found 3 major problems with what you did. Problem #1 - errors The reason you get the error is because your function "activity_coefficientE" can sometimes return NaN or inf values. My suggestion is to look for these values and set the value of "yk" to a large value so that the optimizer in "nlinfit" will stay away from coefficients that produce infinite or NaN values. This is the code at the bottom of the function so that you avoid crashes: if any(~isfinite(yk)) yk = 10 * ones(size(yk)); end Problem #2 - random initial guesses The trouble with using random numbers for your initial conditions is that every time you run it you get a different answer, so sometimes it works and sometimes it doesn't. If you set the random number generator seed, you can get the same random numbers each time you run the script. If you change you seed, you can get a different set of random numbers. I shortened your main script to this, where I try 100 different random seeds (and store the results of each attempt) to see what answers result: for i=1:100 rng(i) taua = randi([-5,5],1,112); taua1(i, :) = nlinfit(x,yk,#activity_coefficientE,taua); end Each row of "taua1" is a set of 111 coefficients. Problem #3 - Trying to fit 9 points with 112 coefficients Every time nlinfit is called, you get this warning: Warning: Rank deficient because you have more coefficients (112) that you are asking nlinfit to find than data points you are fitting (9). It's like trying to find the 2nd order equation that best fits 2 points, there are an infinite number of solutions. When curve fitting you should have more data points than coefficients to make sure you're not fitting noise. You need more data points in "yk" and "x" and/or fewer coefficients to fit. I've done a lot of curve fitting and I've never seen an equation with 112 coefficients, so I am thinking that you are not solving the problem correctly. Perhaps the 112 coefficients aren't really independent or there are 112 data points and 9 coefficients that you want to find. For completeness, here is my edited version of the activity_coefficientE.m function that I created to work on this solution. In general, I never see Matlab code with this many variables with similar names. Much of this code could be greatly simplified by using vector operations. Most of my changes involve formatting, adding semicolons, and the checks for non-finite values at the end. function yk=activity_coefficientE(taua,x) T=523; alpha12=0.3; alpha13=0.3; alpha21=0.3; alpha23=0.3; alpha31=0.3; alpha32=0.3; alpha18=0.2; alpha81=0.2; alpha28=0.2; alpha82=0.2; alpha38=0.2; alpha83=0.3; alpha19=0.2; alpha91=0.2; alpha29=0.2; alpha92=0.2; alpha39=0.2; alpha93=0.2; alpha110=0.2;alpha101=0.2;alpha210=0.2;alpha102=0.2;alpha310=0.2;alpha103=0.2; alpha113=0.2;alpha131=0.2;alpha213=0.2;alpha132=0.2;alpha313=0.2;alpha133=0.2; alpha114=0.2;alpha141=0.2;alpha214=0.2;alpha142=0.2;alpha314=0.2;alpha143=0.2; alpha115=0.2;alpha151=0.2;alpha215=0.2;alpha152=0.2;alpha315=0.2;alpha153=0.2; alpha117=0.2;alpha171=0.2;alpha217=0.2;alpha172=0.2;alpha317=0.2;alpha173=0.2; alpha118=0.2;alpha181=0.2;alpha218=0.2;alpha182=0.2;alpha318=0.2;alpha183=0.2; alpha810=0.2;alpha915=0.2;alpha1314=0.2;alpha108=0.2;alpha159=0.2;alpha1413=0.2; alpha1718=0.2;alpha1817=0.2; tau12=0; tau13=0; tau21=0; tau23=0; tau31=0; tau32=0; tau18=taua(1)+taua(57)/T; tau81=taua(2)+taua(58)/T; tau28=taua(3)+taua(59)/T; tau82=taua(4)+taua(60)/T; tau38=taua(5)+taua(61)/T; tau83=taua(6)+taua(62)/T; tau19=taua(7)+taua(63)/T; tau91=taua(8)+taua(64)/T; tau29=taua(9)+taua(65)/T; tau92=taua(10)+taua(66)/T; tau39=taua(11)+taua(67)/T; tau93=taua(12)+taua(68)/T; tau110=taua(13)+taua(69)/T; tau101=taua(14)+taua(70)/T; tau210=taua(15)+taua(71)/T; tau102=taua(16)+taua(72)/T; tau310=taua(17)+taua(73)/T; tau103=taua(18)+taua(74)/T; tau113=taua(19)+taua(75)/T; tau131=taua(20)+taua(76)/T; tau213=taua(21)+taua(77)/T; tau132=taua(22)+taua(78)/T; tau313=taua(23)+taua(79)/T; tau133=taua(24)+taua(80)/T; tau114=taua(25)+taua(81)/T; tau141=taua(26)+taua(82)/T; tau214=taua(27)+taua(83)/T; tau142=taua(28)+taua(84)/T; tau314=taua(29)+taua(85)/T; tau143=taua(30)+taua(86)/T; tau115=taua(31)+taua(87)/T; tau151=taua(32)+taua(88)/T; tau215=taua(33)+taua(89)/T; tau152=taua(34)+taua(90)/T; tau315=taua(35)+taua(91)/T; tau153=taua(36)+taua(92)/T; tau117=taua(37)+taua(93)/T; tau171=taua(38)+taua(94)/T; tau217=taua(39)+taua(95)/T; tau172=taua(40)+taua(96)/T; tau317=taua(41)+taua(97)/T; tau173=taua(42)+taua(98)/T; tau118=taua(43)+taua(99)/T; tau181=taua(44)+taua(100)/T; tau218=taua(45)+taua(101)/T; tau182=taua(46)+taua(102)/T; tau318=taua(47)+taua(103)/T; tau183=taua(48)+taua(104)/T; tau810=taua(49)+taua(105)/T; tau108=taua(50)+taua(106)/T; tau915=taua(51)+taua(107)/T; tau159=taua(52)+taua(108)/T; tau1314=taua(53)+taua(109)/T; tau1413=taua(54)+taua(110)/T; tau1718=taua(55)+taua(111)/T; tau1817=taua(56)+taua(112)/T; G12=exp(-(tau12*alpha12)); G21=exp(-(tau21*alpha21)); G13=exp(-(tau13*alpha13)); G31=exp(-(tau31*alpha31)); G23=exp(-(tau23*alpha23)); G32=exp(-(tau32*alpha32)); G18=exp(-(tau18*alpha18)); G81=exp(-(tau81*alpha81)); G28=exp(-(tau28*alpha28)); G82=exp(-(tau82*alpha82)); G38=exp(-(tau38*alpha83)); G83=exp(-(tau83*alpha83)); G19=exp(-(tau19*alpha19)); G91=exp(-(tau91*alpha91)); G29=exp(-(tau29*alpha29)); G92=exp(-(tau92*alpha92)); G39=exp(-(tau39*alpha39)); G93=exp(-(tau93*alpha93)); G110=exp(-(tau110*alpha110)); G101=exp(-(tau101*alpha101)); G210=exp(-(tau210*alpha210)); G102=exp(-(tau102*alpha102)); G310=exp(-(tau310*alpha310)); G103=exp(-(tau103*alpha103)); G113=exp(-(tau113*alpha113)); G131=exp(-(tau131*alpha131)); G213=exp(-(tau213*alpha213)); G132=exp(-(tau132*alpha132)); G313=exp(-(tau313*alpha313)); G133=exp(-(tau133*alpha133)); G114=exp(-(tau114*alpha114)); G141=exp(-(tau141*alpha141)); G214=exp(-(tau214*alpha214)); G142=exp(-(tau142*alpha142)); G314=exp(-(tau314*alpha314)); G143=exp(-(tau143*alpha143)); G115=exp(-(tau115*alpha115)); G151=exp(-(tau151*alpha151)); G215=exp(-(tau215*alpha215)); G152=exp(-(tau152*alpha152)); G315=exp(-(tau315*alpha315)); G153=exp(-(tau153*alpha153)); G117=exp(-(tau117*alpha117)); G171=exp(-(tau171*alpha171)); G217=exp(-(tau217*alpha217)); G172=exp(-(tau172*alpha172)); G317=exp(-(tau317*alpha317)); G173=exp(-(tau173*alpha173)); G118=exp(-(tau118*alpha118)); G181=exp(-(tau181*alpha181)); G218=exp(-(tau218*alpha218)); G182=exp(-(tau182*alpha182)); G318=exp(-(tau318*alpha318)); G183=exp(-(tau183*alpha183)); G810=exp(-(tau810*alpha810)); G108=exp(-(tau108*alpha108)); G915=exp(-(tau915*alpha915)); G159=exp(-(tau159*alpha159)); G1314=exp(-(tau1314*alpha1314)); G1413=exp(-(tau1413*alpha1413)); G1718=exp(-(tau1718*alpha1718)); G1817=exp(-(tau1817*alpha1817)); %calculating mole fractions of ionic species x1=x(:,1); x2=x(:,2); x3=x(:,3); A=[0.0674243 0.0773881 0.0843400 0.0865343 0.0899223 0.0882858 0.0715087 0.0643867 0.0483658]; B=[0.0141081 0.0479814 0.0643151 0.0737477 0.0820756 0.0838701 0.0701576 0.0634457 0.0479639]; C=[0.0565665 0.0450072 0.0387724 0.0313828 0.02506094 0.0186280 0.0092734 0.0073438 0.0041595 ]; D=[0.0336447 0.0267694 0.0230611 0.0186659 0.0149058 0.0110795 0.0055157 0.0043679 0.0024739 ]; E=[0.0008148 0.0008756 0.00087131 0.0008794 0.0008711 0.0008441 0.0007384 0.0006997 0.0005980 ]; N=length(A); x1n=zeros(N,1);x2n=zeros(N,1);x3n=zeros(N,1); X1=zeros(N,1);X2=zeros(N,1);X3=zeros(N,1);X4=zeros(N,1);X5=zeros(N,1);X6=zeros(N,1);X7=zeros(N,1); X12=zeros(N,1);X16=zeros(N,1); for i=1:N x1n(i)=(x1(i)-A(i)-D(i)-2*E(i)-C(i)+3*B(i)); x2n(i)=(x2(i)-A(i)-C(i)-D(i)); x3n(i)=(x3(i)-B(i)); X1(i)=(x1n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X2(i)=(x2n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X3(i)=(x3n(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X4(i)=(A(i)+D(i)+E(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X5(i)=(C(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X6(i)=(A(i)-B(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X7(i)=(B(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X12(i)=(E(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); X16(i)=(C(i)+D(i)/(x1n(i)+x2n(i)+x3n(i)+2*A(i)+4*B(i)+2*C(i)+2*D(i)+2*E(i))); end yc4=X4./(X4+X5); yc5=X5./(X4+X5); yc6=X6./(X6+X7+X12+X16); yc7=X7./(X6+X7+X12+X16); yc12=X12./(X6+X7+X12+X16); yc16=X16./(X6+X7+X12+X16); alpha14=yc6.*alpha18+yc7.*alpha19+yc12.*alpha113+yc16.*alpha117; alpha24=yc6.*alpha28+yc7.*alpha29+yc12.*alpha213+yc16.*alpha217; alpha34=yc6.*alpha38+yc7.*alpha39+yc12.*alpha313+yc16.*alpha317; alpha15=yc6.*alpha110+yc7.*alpha115+yc12.*alpha114+yc16.*alpha118; alpha25=yc6.*alpha210+yc7.*alpha215+yc12.*alpha214+yc16.*alpha218; alpha35=yc6.*alpha310+yc7.*alpha315+yc12.*alpha314+yc16.*alpha318; alpha16=yc4.*alpha81+yc5.*alpha101; alpha26=yc4.*alpha82+yc5.*alpha102; alpha36=yc4.*alpha83+yc5.*alpha103; alpha17=yc4.*alpha91+yc5.*alpha151; alpha27=yc4.*alpha92+yc5.*alpha152; alpha37=yc4.*alpha93+yc5.*alpha153; alpha112=yc4.*alpha131+yc5.*alpha141; alpha212=yc4.*alpha132+yc5.*alpha142; alpha312=yc4.*alpha133+yc5.*alpha143; alpha116=yc4.*alpha171+yc5.*alpha181; alpha216=yc4.*alpha172+yc5.*alpha182; alpha316=yc4.*alpha173+yc5.*alpha183; alpha46=yc5.*alpha810; alpha47=yc5.*alpha915; alpha412=yc5.*alpha1314; alpha416=yc5.*alpha1718; alpha56=yc4.*alpha108; alpha57=yc4.*alpha159; alpha512=yc4.*alpha1413; alpha516=yc4.*alpha1817; G14=yc6.*G18+yc7.*G19+yc12.*G113+yc16.*G117; G24=yc6.*G28+yc7.*G29+yc12.*G213+yc16.*G217; G34=yc6.*G38+yc7.*G39+yc12.*G313+yc16.*G317; G15=yc6.*G110+yc7.*G115+yc12.*G114+yc16.*G118; G25=yc6.*G210+yc7.*G215+yc12.*G214+yc16.*G218; G35=yc6.*G310+yc7.*G315+yc12.*G314+yc16.*G318; G16=yc4.*G81+yc5.*G101; G26=yc4.*G82+yc5.*G102; G36=yc4.*G83+yc5.*G103; G17=yc4.*G91+yc5.*G151; G27=yc4.*G92+yc5.*G152; G37=yc4.*G93+yc5.*G153; G112=yc4.*G131+yc5.*G141; G212=yc4.*G132+yc5.*G142; G312=yc4.*G133+yc5.*G143; G116=yc4.*G171+yc5.*G181; G216=yc4.*G172+yc5.*G182; G316=yc4.*G173+yc5.*G183; G46=yc5.*G810; G47=yc5.*G915; G412=yc5.*G1314; G416=yc5.*G1718; G56=yc4.*G108; G57=yc4.*G159; G512=yc4.*G1413; G516=yc4.*G1817; tau14=-log(G14)./alpha14; tau24=-log(G24)./alpha24; tau34=-log(G34)./alpha34; tau15=-log(G15)./alpha15; tau25=-log(G25)./alpha25; tau35=-log(G35)./alpha35; tau16=-log(G16)./alpha16; tau26=-log(G26)./alpha26; tau36=-log(G36)./alpha36; tau17=-log(G17)./alpha17; tau27=-log(G27)./alpha27; tau37=-log(G37)./alpha37; tau112=-log(G112)./alpha112; tau212=-log(G212)./alpha212; tau312=-log(G312)./alpha312; tau116=-log(G116)./alpha116; tau216=-log(G216)./alpha216; tau316=-log(G316)./alpha316; tau46=-log(G46)./alpha46; tau47=-log(G47)./alpha47; tau412=-log(G412)./alpha412; tau416=-log(G416)./alpha416; tau56=-log(G56)./alpha56; tau57=-log(G57)./alpha57; tau512=-log(G512)./alpha512; tau516=-log(G516)./alpha516; ln_y1_1=G12.*X2.*tau12+ G31.*X3.*tau13+ G14.*X4.*tau14+G15.*X5.*tau15+G16.*X6.*tau16+G17.*X7.*tau17+G112.*X12.*tau112+G116.*X16.*tau116; ln_y1_2=G12.*X2+ G13.*X3+ G14.*X4+G15.*X5+G16.*X6+G17.*X7+G112.*X12+G116.*X16; ln_y2_1=G21.*X1.*tau12+ G32.*X3.*tau32+ G24.*X4.*tau24+G25.*X5.*tau25+G26.*X6.*tau26+G27.*X7.*tau27+G212.*X12.*tau212+G216.*X16.*tau216; ln_y2_2=G12.*X1+ G23.*X3+G24.*X4+G25.*X5+G26.*X6+G27.*X7+G212.*X12+G216.*X16; ln_y3_1=G13.*X1.*tau13+ G23.*X3.*tau23+ G34.*X4.*tau34+G35.*X5.*tau35+G36.*X6.*tau36+G37.*X7.*tau37+G312.*X12.*tau312+G316.*X16.*tau316; ln_y3_2=G13.*X1+ G23.*X3+ G34.*X4+G35.*X5+G36.*X6+G37.*X7+G312.*X12+G316.*X16; ln_y4_1=G14.*X1.*tau14+G24.*X2.*tau24+G34.*X3.*tau34+G46.*X6.*tau46+G47.*X7.*tau47+G412.*X12.*tau412+G416.*X16.*tau416; ln_y4_2=G14.*X1+G24.*X2+G34.*X3+G46.*X6+G47.*X7+G412.*X12+G416.*X16; ln_y5_1=G15.*X1.*tau15+G25.*X2.*tau25+G35.*X3.*tau35+G56.*X6.*tau56+G57.*X7.*tau57+G512.*X12.*tau512+G516.*X16.*tau516; ln_y5_2=G15.*X1+G25.*X2+G35.*X3+G56.*X6+G57.*X7+G512.*X12+G516.*X16; ln_y6_1=G16.*X1.*tau16+G26.*X2.*tau26+G36.*X3.*tau36+G46.*X4.*tau46+G56.*X5.*tau56; ln_y6_2=G16.*X1+G26.*X2+G36.*X3+G46.*X4+G56.*X5; ln_y7_1=G17.*X1.*tau17+G27.*X2.*tau27+G37.*X3.*tau37+G47.*X4.*tau47+G57.*X5.*tau57; ln_y7_2=G17.*X1+G27.*X2+G37.*X3+G47.*X4+G57.*X5; ln_y12_1=G112.*X1.*tau112+G212.*X2.*tau212+G312.*X3.*tau312+G412.*X4.*tau412+G512.*X5.*tau512; ln_y12_2=G112.*X1+G212.*X2+G312.*X3+G412.*X4+G512.*X5; ln_y16_1=G116.*X1.*tau116+G216.*X2.*tau216+G316.*X3.*tau316+G416.*X4.*tau416+G516.*X5.*tau516; ln_y16_2=G116.*X1+G216.*X2+G316.*X3+G416.*X4+G516.*X5; ln_y1_3=(((X2.*G12)./ln_y2_2).*(tau12-(ln_y2_1)./(ln_y2_2)))+(((X3.*G13)./ln_y3_2).*(tau13-(ln_y3_1)./(ln_y3_2))); ln_y1_4=(((X6.*G16)./ln_y6_2).*(tau16- (ln_y6_1./ln_y6_2))) + (((X7.*G17)./ln_y7_2).*(tau17- (ln_y7_1./ln_y7_2)))+(((X12.*G12)./ln_y12_2).*(tau112- (ln_y12_1./ln_y12_2)))+(((X16.*G16)./ln_y16_2).*(tau116- (ln_y16_1./ln_y16_2))); ln_y1_5=(((X4.*G14)./ln_y4_2).*(tau14- (ln_y4_1./ln_y4_2))) + (((X5.*G15)./ln_y5_2).*(tau15- (ln_y5_1./ln_y5_2))); yk=exp((ln_y1_1./ln_y1_2) + ln_y1_3 + ln_y1_4+ ln_y1_5)'; % activity coefficient for H2O if any(~isfinite(yk)) yk = 10 * ones(size(yk)); end
"Heap exhausted, game over" message in wxMaxima - Does ccl will work for me?
everyone, I'm trying to do some calculations and plot the results, but it seems that these are too heavy for Maxima. When I try to calculate N1 and N2 the program crashes when parameter j is too high or when I try to plot them, the program displays the following error message: "Heap exhausted, game over." What should I do? I've seen some people saying to try to compile Maxima with ccl, but I don't know how to do it or if it will work. I usually receive error messages like: Message from maxima's stderr stream: Heap exhausted during garbage collection: 0 bytes available, 16 requested. Gen Boxed Unboxed LgBox LgUnbox Pin Alloc Waste Trig WP GCs Mem-age 0 0 0 0 0 0 0 0 20971520 0 0 0,0000 1 0 0 0 0 0 0 0 20971520 0 0 0,0000 2 0 0 0 0 0 0 0 20971520 0 0 0,0000 3 16417 2 0 0 43 1075328496 707088 293986768 16419 1 0,8032 4 13432 21 0 1141 70 955593760 838624 2000000 14594 0 0,2673 5 0 0 0 0 0 0 0 2000000 0 0 0,0000 6 741 184 34 28 0 63259792 1424240 2000000 987 0 0,0000 7 0 0 0 0 0 0 0 2000000 0 0 0,0000 Total bytes allocated = 2094182048 Dynamic-space-size bytes = 2097152000 GC control variables: *GC-INHIBIT* = true *GC-PENDING* = true *STOP-FOR-GC-PENDING* = false fatal error encountered in SBCL pid 13884(tid 0000000001236360): Heap exhausted, game over. Here goes the code: enter code here a: 80$; b: 6*a$; h1: 80$; t: 2$; j: 5$; carga: 250$; sig: -carga/2$; n: 2*q*%pi/b$; m: i*%pi/a$; i: 2*p-1$; i1: 2*p1-1$; /*i1: p1$;*/ Φ: a/b$; τ: cosh(x) - (x/sinh(x))$; σ: sinh(x) - (x/cosh(x))$; Ψ: sinh(x)/τ$; Χ: cosh(x)/σ$; Λ0: 1/(((i/2)^2+Φ^2*q^2)^2)$; Λ1: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ0, p, 1, j)$; Λ2: sum(((q1^3*subst([x=(q1*%pi*Φ)],Χ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ1, q1, 1, j)$; Λ3: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ2, p, 1, j)$; Λ4: sum(((q1^3*subst([x=(q1*%pi*Φ)],Χ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ3, q1, 1, j)$; Λ5: sum((((i/2)^3*subst([x=(i*%pi/(2*Φ))],Ψ))/(((i/2)^2+Φ^2*q1^2)^2))*Λ4, p, 1, j)$; Ζ0: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ0, q, 1, j)$; Ζ2: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ2, q, 1, j)$; Ζ4: sum(((q^3*subst([x=(q*%pi*Φ)],Χ))/(((i1/2)^2+Φ^2*q^2)^2))*Λ4, q, 1, j)$; E: 200000$; ν: 0.3$; λ: (ν*E)/((1+ν)*(1-2*ν))$; μ: E/(2*(1+ν))$; a0: float(1/(b/2)*integrate(0, y, -(b/2), -h1/2)+1/b*integrate(sig, y, -h1/2, h1/2)+1/(b/2)*integrate(0, y, h1/2, (b/2)))$; aq: float(1/(b/2)*integrate(0*cos(q*y*%pi/(b/2)), y, -(b/2), - h1/2)+1/(b/2)*integrate(sig*cos(q*y*%pi/(b/2)), y, -h1/2, h1/2)+1/(b/2)*integrate(0*cos(q*y*%pi/(b/2)), y, h1/2, (b/2)))$; aq1: float(1/(b/2)*integrate(0*cos(q1*y*%pi/(b/2)), y, -(b/2), - h1/2)+1/(b/2)*integrate(sig*cos(q1*y*%pi/(b/2)), y, -h1/2, h1/2)+1/(b/2)*integrate(0*cos(q1*y*%pi/(b/2)), y, h1/2, (b/2)))$; Bq: aq/((λ+μ)*subst([x=q*%pi*Φ],σ))+((16*Φ^4*q^2*(-1)^q)/((λ+μ)*%pi^2*subst([x=q*%pi*Φ],σ)))*sum(q1*aq1*(-1) ^q1*subst([x=q1*%pi*Φ],Χ)*(Λ1+(16*Φ^4/(%pi^2))*Λ3+((16*Φ^4/(%pi^2))^2)*Λ5), q1, 1, j)+(8*λ*Φ^3*q^2*(-1)^q*a0)/((λ+μ)*(λ+2*μ)*(%pi^3)*subst([x=q*%pi*Φ],σ))*sum(subst([x=i*%pi/(2*Φ)],Ψ)/(i/ 2)*(Λ0+(16*Φ^4/(%pi^2))*Λ2+((16*Φ^4/(%pi^2))^2)*Λ4), p, 1, j)$; βp: -(2*λ*a0*(-1)^((i-1)/2))/((λ+μ)*(λ+2*μ)*(i/2)^2*%pi^2*subst([x=i*%pi/(2*Φ)],τ))-((32*λ*Φ^4*(i/2)^2*a0*(-1)^((i-1)/2))/((λ+μ)*(λ+2*μ)*%pi^2*subst([x=i*%pi/(2*Φ)],τ)))*sum(((subst([x=i1*%pi/(2*Φ)],Ψ))/(i1/2))*(Ζ0+Ζ2*((16*Φ^4)/%pi^2)+Ζ4*(((16*Φ^4)/%pi^2)^2)),p1,1,j)-((4*Φ*(i/2)^2*(-1)^((i-1)/2))/((λ+μ)*%pi*subst([x=i*%pi/(2*Φ)],τ)))*sum(q*aq*(-1)^q*subst([x=q*%pi*Φ],Χ)*(Λ0+Λ2*(16*Φ^4/%pi^2)+Λ4*(16*Φ^4/%pi^2)^2),q,1,j)$; N1: (2*a0/a)*x+(λ+μ)*sum(Bq*((1+((n*a*sinh(n*a/2))/(2*cosh(n*a/2))))*sinh(n*x)-n*x*cosh(n*x))*cos(n*y),q,1,j)+(λ+μ)*sum(βp*((1-((m*b*cosh(m*b/2))/(2*sinh(m*b/2))))*cosh(m*y)+m*y*sinh(m*y))*sin(m*x),p,1,j)$; N2: ((2*λ*a0)/(a*(λ+2*μ)))*x+(λ+μ)*sum(Bq*((1-((n*a*sinh(n*a/2))/(2*cosh(n*a/2))))*sinh(n*x)+n*x*cosh(n*x))*cos(n*y),q,1,j)+(λ+μ)*sum(βp*((1+((m*b*cosh(m*b/2))/(2*sinh(m*b/2))))*cosh(m*y)-m*y*sinh(m*y))*sin(m*x),p,1,j); wxplot3d(N1, [x,-a/2,a/2], [y,-b/2,b/2])$; wxplot3d(N2, [x,-a/2,a/2], [y,-b/2,b/2])$;
This is not a complete answer, since I don't know how this should work with wxMaxima: I would suggest that you ask the developers. However it's too long for a comment and I think might be useful to people, and it does answer the question of how you solve the heap-size limit for Maxima itself when using SBCL, at least when run on Linux or some other platform with a command-line. As a note, I suspect that the underlying problem is not the heap size, but that the calculation is blowing up in some horrible way: the best fix is probably to understand what's blowing up and fix that. See Robert Dodier's answer, which is probably going to be a lot more helpful. However, if heap size is the problem, this is how you deal with it for Maxima. The trick is that you can tell SBCL what the heap limit should be by passing it the --dynamic-space-size <MB> argument, and you can pas arguments through the maxima wrapper to do this. Here is a transcript of Maxima, being run on Linux, with SBCL as a back end (this is a version built from source: the packaged version will I assume be the same): $ maxima Maxima 5.43.2 http://maxima.sourceforge.net using Lisp SBCL 2.0.0 Distributed under the GNU Public License. See the file COPYING. Dedicated to the memory of William Schelter. The function bug_report() provides bug reporting information. (%i1) :lisp (sb-ext:dynamic-space-size) 1073741824 So, on this system the defaule heap limit is 1GB (this is SBCL's default limit on the platform). Now we can pass the -X <lisp options> aka --lisp-options=<lisp options> option to the maxima wrapper to pass the appropriate option through to sbcl: $ maxima -X '--dynamic-space-size 2000' Lisp options: (--dynamic-space-size 2000) Maxima 5.43.2 http://maxima.sourceforge.net using Lisp SBCL 2.0.0 Distributed under the GNU Public License. See the file COPYING. Dedicated to the memory of William Schelter. The function bug_report() provides bug reporting information. (%i1) :lisp (sb-ext:dynamic-space-size) 2097152000 As you can see this has doubled the heap size. If someone knows the answer for wxMaxima then please do add an edit to this answer: I can't experiment it because all my Linux VMs are headless.
Also not a complete answer here, but some more notes and pointers which I hope will help. To make the problem easier for Maxima to digest, use only exact numbers (integers and ratios), and avoid float and numer. (Plotting functions will apply float and numer automatically.) I changed 0.3 to 3/10 and cut out the calls to float. Also, try setting j to a smaller number (I tried j equal to 1) to try to work all the way through the problem before increasing it to 5 again. Also, replace all sum and integrate with 'sum and 'integrate (i.e. noun expressions instead of verb expressions). Take a look at the summands and integrands to see if they look right. You can evaluate the sums and/or integrals or both via ev(expr, sum) or ev(expr, integrate) or ev(expr, nouns) to evaluate 'sum, 'integrate, or all noun expressions, respectively. With j equal to 1, I get the following expression for N1: (2500000*((-(13*cosh(%pi/6) *((8503056*cosh(%pi/6)^2*sinh(3*%pi)^2) /(9765625*%pi^4 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2) +(52488*cosh(%pi/6)*sinh(3*%pi)) /(15625*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))) +324/25)) /(120000*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))) +(13*sinh(3*%pi) *((2754990144*cosh(%pi/6)^3*sinh(3*%pi)^2) /(244140625*%pi^4 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^3 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2) +(17006112*cosh(%pi/6)^2*sinh(3*%pi)) /(390625*%pi^2 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))) +(104976*cosh(%pi/6)) /(625*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))))) /(22680000*%pi^2*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2) +13/(35000*%pi^2*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)))) *sin((%pi*(2*p-1)*x)/80) *((%pi*(2*p-1)*y*sinh((%pi*(2*p-1)*y)/80))/80 +(1-(3*%pi*(2*p-1)*cosh(3*%pi*(2*p-1))) /sinh(3*%pi*(2*p-1))) *cosh((%pi*(2*p-1)*y)/80))) /13 +(2500000*((-(13*cosh(%pi/6) *((344373768*cosh(%pi/6)^2*sinh(3*%pi)^3) /(244140625*%pi^4 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) ^2 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi)) ^3) +(2125764*cosh(%pi/6)*sinh(3*%pi)^2) /(390625*%pi^2 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2) +(13122*sinh(3*%pi)) /(625*(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))))) /(1620000*%pi^3*(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2)) +(13*sinh(3*%pi) *((8503056*cosh(%pi/6)^2*sinh(3*%pi)^2) /(9765625*%pi^4 *(sinh(%pi/6)-%pi/(6*cosh(%pi/6)))^2 *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))^2) +(52488*cosh(%pi/6)*sinh(3*%pi)) /(15625*%pi^2*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))) +324/25)) /(3780000*%pi^3*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))) *(cosh(3*%pi)-(3*%pi)/sinh(3*%pi))) -13/(20000*%pi*(sinh(%pi/6)-%pi/(6*cosh(%pi/6))))) *(((%pi*sinh(%pi/6))/(6*cosh(%pi/6))+1) *sinh((%pi*x)/240) -(%pi*x*cosh((%pi*x)/240))/240)*cos((%pi*y)/240)) /13-(25*x)/48$ Now in order to plot that, it should be a function of x and y only. However listofvars reports that it contains x, y, and p. Hmm. I see that βp has a summation over p1 but it contains Ζ0, which contains Λ0, which contains p. Is the summation over p1 supposed to be over p? Is the summand supposed to contain p1 instead of p? Likewise it appears that N2, after evaluating the sums and integrals with j equal to 1, contains p. Maybe you need to rework the formulas somewhat? I don't know what the correct form might be.
about torch.nn.CrossEntropyLoss parameter shape
i'm learning pytorch, and taking the anpr project,which is based tensorflow (https://github.com/matthewearl/deep-anpr, http://matthewearl.github.io/2016/05/06/cnn-anpr/) as a exercise, transplant it to pytorch platform. there is a problem,i'm using nn.CrossEntropyLoss() as loss function: criterion=nn.CrossEntropyLoss() the output.data of model is: - 1.00000e-02 * - 2.5552 2.7582 2.5368 ... 5.6184 1.2288 -0.0076 - 0.7033 1.3167 -1.0966 ... 4.7249 1.3217 1.8367 - 0.7592 1.4777 1.8095 ... 0.8733 1.2417 1.1521 - 0.1040 -0.7054 -3.4862 ... 4.7703 2.9595 1.4263 - [torch.FloatTensor of size 4x253] and targets.data is: - 1 0 0 ... 0 0 0 - 1 0 0 ... 0 0 0 - 1 0 0 ... 0 0 0 - 1 0 0 ... 0 0 0 - [torch.DoubleTensor of size 4x253] when i call: loss=criterion(output,targets) error occured,information is: TypeError: FloatClassNLLCriterion_updateOutput received an invalid combination of arguments - got (int, torch.FloatTensor, **torch.DoubleTensor**, torch.FloatTensor, bool, NoneType, torch.FloatTensor), but expected (int state, torch.FloatTensor input, **torch.LongTensor** target, torch.FloatTensor output, bool sizeAverage, [torch.FloatTensor weights or None], torch.FloatTensor total_weight) 'expected torch.LongTensor'......'got torch.DoubleTensor',but if i convert the targets into LongTensor: torch.LongTensor(numpy.array(targets.data.numpy(),numpy.long)) call loss=criterion(output,targets), the error is: RuntimeError: multi-target not supported at /data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20 my last exercise is mnist, a example from pytorch,i made a bit modification,batch_size is 4,the loss function: loss = F.nll_loss(outputs, labels) outputs.data: - -2.3220 -2.1229 -2.3395 -2.3391 -2.5270 -2.3269 -2.1055 -2.2321 -2.4943 -2.2996 -2.3653 -2.2034 -2.4437 -2.2708 -2.5114 -2.3286 -2.1921 -2.1771 -2.3343 -2.2533 -2.2809 -2.2119 -2.3872 -2.2190 -2.4610 -2.2946 -2.2053 -2.3192 -2.3674 -2.3100 -2.3715 -2.1455 -2.4199 -2.4177 -2.4565 -2.2812 -2.2467 -2.1144 -2.3321 -2.3009 [torch.FloatTensor of size 4x10] labels.data: - 8 - 6 - 0 - 1 - [torch.LongTensor of size 4] the labels, for a input image,must be a single element, in upper example, there is 253 numbers, and in 'mnist',there is only one number, the shape of outputs is difference from labels. i review the tensorflow manual, tf.nn.softmax_cross_entropy_with_logits, 'Logits and labels must have the sameshape [batch_size, num_classes] and the same dtype (either float32 or float64).' does pytorch support the same function in tensorflow? many thks
You can convert the targets that you have to a categorical representation. In the example that you provide, you would have 1 0 0 0.. 0 if the class is 0, 0 1 0 0 ... if the class is 1, 0 0 1 0 0 0... if the class is 2 etc. One quick way that I can think of is first convert the target Tensor to a numpy array, then convert it from one hot to a categorical array, and convert it back to a pytorch Tensor. Something like this: targetnp=targets.numpy() idxs=np.where(targetnp>0)[1] new_targets=torch.LongTensor(idxs) loss=criterion(output,new_targets)
CrossEntropyLoss is equivalent to tf.nn.softmax_cross_entropy_with_logits. The input to CrossEntropyLoss is a categorical vector of shape [batch_size]. Use .view() to change the tensor shapes. labels = labels.view(-1) output = output.view(labels.size(0), -1) loss = criterion(output, loss) calling .view(x, y, -1) causes the tensor to use the remaining datapoints to fill the -1 dimension and will cause an error if there is not enough to make a full dimension labels.size(0) gives the size of the 0th dimension of the label tensor Additional to convert between tensor types you can call the type on the tensor, for example 'labels = labels.long()` Second Additional If you unpack the data from a variable like so output.data then you will lose the gradients for that output and be unable to backprop when the time comes
How to Have Vector Inequality in Matlab's Assert?
Code NA = 1.33; naValues = NA+pi/180:pi/180:(NA+pi/2); assert( (naValues > NA), 'naValues not bigger than NA'); where I also tried unsuccessfully floor(sum(naValues > NA))/90 in the place of the inequality that is trying assert( [logical], msg). Output Error using assert The condition input argument must be a scalar logical. How can you use a vector inequality in Matlab's assert?
Use all or any , but in general I would columnize the value you pass. This way it will always be robust to matrix and N-d arrays in addition to vectors. Observe: >> matrixValues = reshape(naValues,10,9) matrixValues = Columns 1 through 7 1.34745329251994 1.52198621771938 1.69651914291881 1.87105206811824 2.04558499331768 2.22011791851711 2.39465084371654 1.36490658503989 1.53943951023932 1.71397243543875 1.88850536063819 2.06303828583762 2.23757121103705 2.41210413623648 1.38235987755983 1.55689280275926 1.7314257279587 1.90595865315813 2.08049157835756 2.25502450355699 2.42955742875643 1.39981317007977 1.57434609527921 1.74887902047864 1.92341194567807 2.09794487087751 2.27247779607694 2.44701072127637 1.41726646259972 1.59179938779915 1.76633231299858 1.94086523819802 2.11539816339745 2.28993108859688 2.46446401379631 1.43471975511966 1.60925268031909 1.78378560551853 1.95831853071796 2.13285145591739 2.30738438111682 2.48191730631626 1.4521730476396 1.62670597283904 1.80123889803847 1.9757718232379 2.15030474843733 2.32483767363677 2.4993705988362 1.46962634015955 1.64415926535898 1.81869219055841 1.99322511575785 2.16775804095728 2.34229096615671 2.51682389135614 1.48707963267949 1.66161255787892 1.83614548307836 2.01067840827779 2.18521133347722 2.35974425867665 2.53427718387609 1.50453292519943 1.67906585039887 1.8535987755983 2.02813170079773 2.20266462599716 2.3771975511966 2.55173047639603 Columns 8 through 9 2.56918376891597 2.74371669411541 2.58663706143592 2.76116998663535 2.60409035395586 2.77862327915529 2.6215436464758 2.79607657167524 2.63899693899575 2.81352986419518 2.65645023151569 2.83098315671512 2.67390352403563 2.84843644923507 2.69135681655558 2.86588974175501 2.70881010907552 2.88334303427495 2.72626340159546 2.9007963267949 >> all(matrixValues) ans = 1 1 1 1 1 1 1 1 1 >> all(matrixValues(:)) ans = 1 >>
If you want all the naValues to be bigger than NA then you can make you vector comparison a scalar (required by assert) using the all function like this: assert(all(naValues > NA)), 'naValues not bigger than NA');
Libsvm Classification MATLAB
I used 1~200 data as trainning data, 201~220 as testing data format likes: 3 class(class 1,class 2, class 3) and 20 features 2 1:100 2:96 3:88 4:94 5:96 6:94 7:72 8:68 9:69 10:70 11:76 12:70 13:73 14:71 15:74 16:76 17:78 18:81 19:76 20:76 2 1:96 2:100 3:88 4:88 5:90 6:98 7:71 8:66 9:63 10:74 11:75 12:66 13:71 14:68 15:74 16:78 17:78 18:85 19:77 20:76 2 1:88 2:88 3:100 4:96 5:91 6:89 7:70 8:70 9:68 10:74 11:76 12:71 13:73 14:74 15:79 16:77 17:73 18:80 19:78 20:78 2 1:94 2:87 3:96 4:100 5:92 6:88 7:76 8:73 9:71 10:70 11:74 12:67 13:71 14:71 15:76 16:77 17:71 18:80 19:73 20:73 2 1:96 2:90 3:91 4:93 5:100 6:92 7:74 8:67 9:67 10:75 11:75 12:67 13:74 14:73 15:77 16:77 17:75 18:82 19:76 20:74 2 1:93 2:98 3:90 4:88 5:92 6:100 7:73 8:66 9:65 10:73 11:78 12:69 13:73 14:72 15:75 16:74 17:75 18:83 19:79 20:77 3 1:73 2:71 3:73 4:76 5:74 6:73 7:100 8:79 9:79 10:71 11:65 12:58 13:67 14:73 15:74 16:72 17:60 18:63 19:64 20:60 3 1:68 2:66 3:70 4:73 5:68 6:67 7:78 8:100 9:85 10:77 11:57 12:57 13:58 14:62 15:68 16:64 17:59 18:57 19:57 20:59 3 1:69 2:64 3:70 4:72 5:69 6:65 7:78 8:85 9:100 10:70 11:56 12:63 13:62 14:61 15:64 16:69 17:56 18:55 19:55 20:51 3 1:71 2:74 3:74 4:70 5:76 6:73 7:71 8:73 9:71 10:100 11:58 12:58 13:59 14:60 15:58 16:65 17:57 18:57 19:63 20:57 1 1:77 2:75 3:76 4:73 5:75 6:79 7:66 8:56 9:56 10:59 11:100 12:77 13:84 14:79 15:82 16:80 17:82 18:82 19:81 20:82 1 1:70 2:66 3:71 4:67 5:67 6:70 7:63 8:57 9:62 10:58 11:77 12:100 13:84 14:75 15:76 16:78 17:73 18:72 19:87 20:80 1 1:73 2:72 3:73 4:71 5:74 6:74 7:68 8:58 9:61 10:59 11:84 12:84 13:100 14:86 15:88 16:91 17:81 18:81 19:84 20:86 1 1:71 2:69 3:75 4:71 5:73 6:73 7:74 8:61 9:61 10:60 11:79 12:75 13:86 14:100 15:90 16:88 17:74 18:79 19:81 20:82 1 1:74 2:74 3:80 4:76 5:78 6:76 7:73 8:66 9:64 10:59 11:81 12:76 13:88 14:90 15:100 16:93 17:74 18:83 19:81 20:85 1 1:76 2:77 3:77 4:76 5:78 6:75 7:73 8:64 9:68 10:65 11:80 12:78 13:91 14:88 15:93 16:100 17:79 18:79 19:82 20:83 1 1:78 2:78 3:73 4:71 5:75 6:75 7:61 8:58 9:57 10:56 11:82 12:73 13:81 14:74 15:74 16:80 17:100 18:85 19:80 20:85 1 1:81 2:85 3:79 4:80 5:82 6:82 7:63 8:56 9:55 10:57 11:82 12:72 13:81 14:79 15:83 16:79 17:85 18:100 19:83 20:79 1 1:76 2:77 3:78 4:75 5:76 6:79 7:65 8:57 9:57 10:63 11:81 12:87 13:84 14:81 15:81 16:82 17:80 18:83 19:100 20:87 1 1:76 2:76 3:78 4:73 5:75 6:78 7:60 8:59 9:51 10:57 11:82 12:80 13:86 14:82 15:85 16:83 17:85 18:79 19:87 20:100 Then, I write code to classify them: % read the data set [image_label, image_features] = libsvmread(fullfile('D:\...')); [N D] = size(image_features); % Determine the train and test index trainIndex = zeros(N,1); trainIndex(1:200) = 1; testIndex = zeros(N,1); testIndex(201:N) = 1; trainData = image_features(trainIndex==1,:); trainLabel = image_label(trainIndex==1,:); testData = image_features(testIndex==1,:); testLabel = image_label(testIndex==1,:); % Train the SVM model = svmtrain(trainLabel, trainData, '-c 1 -g 0.05 -b 1'); % Use the SVM model to classify the data [predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1'); But the final result for predict_label are all class 1, so the accuracy is 50%, which that it cannot get the correct predict label for class 2 and 3. Is there something wrong from the format of data, or the code that I implemented? Please help me, thanks very much.
To elaborate a bit more about the problem, there are at least three problems here: You just check one values of parameters C (c) and Gamma (g) - behaviour of SVM is heavily dependant on the good choice of these parameters, so it is a common approach to use a grid search using cross validation testing for selecting the best ones. Data scale also plays an important role here, if some of the dimensions are much bigger then the rest, you will bias the whole classifier, in order to deal with it there are at least two basic approaches: 1. Scale linearly each dimension to some interval (like [0,1] or [-1,1]) or normalize the data by transformation through Sigma^(-1/2) where Sigma is a data covariance matrix Label imbalance - SVM works best when you have exactly the same amount of points in each class. Once it is not true, you should use the class weighting scheme in order to get valid results. After fixing these three issues you should get reasonable results.
My guess is that you'd want to tune your parameters. Make a loop over your -c and -g values (typically logarithimically, eg -c 10^(-3:5) ) and pick the one that is best. That said, it is advisable to normalize your data, eg. scale it such that all values are between 0 and 1.