به این صورت جدا کردم :
myfun:
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X))(1:ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
و برنامه randmat :
celldata={}
j=1
X=rand(163,43);
for i=[5:5:35,43]
[a,b]=myfun(X,i);
celldata{j}={a,b};
j=j+1;
end
اجرا که میکنم این پیغام رو میده :
??? Error: File: myfun.m Line: 5 Column: 12
()-indexing must appear last in an index expression.
Error in ==> randmat at 5
[a,b]=myfun(X,i);
متغیر k اشتباه گذاشته بودم
این را امتحان کنید
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X));
i0=i0(1:ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),i0);
b=X(i2(99:163),i0);
end
مرسی. اجرا شد فعلاً
حال من اگه بخوام ماتریس a از dataset2 رو فراخونی کنم باید چیکار کنم؟
چون این یه قسمتی از برنامه ی من هست و باید برنامه ای که با anfis نوشتم رو توی این حلقه ی for قرار بدم.
به این صورت که dataset1 رو ببره توی anfis بعنوان ماتریس های آموزش و تست اجرا کنه. بعد dataset2 رو ببره توی anfis احرا کنه و الی آخر.
آیا اینکار رو انجام میده؟
اصلا لازم نبود a,b را در سلول ذخیره کنید توی همون حلقه for ازش استفاده می کردید
در هر صورت برای استخراج a و b از داخل سلول این را بنویسید
for i=1:numel(celldata)
a=celldata{i}{1}
b=celldata{i}{2}
end
مرسی مهندس. عالی بود.نمیشه برای ماتریس های a,b هر dataset اندیس گذاشت و توی workspace نشون داد؟a1,b1a2,b2a3,b3...
بله. سلول نمایش داده میشه. خب حالا اینو بعدن درست میکنم.
الآن یه سوالی که برام پیش اومد اینه که من اگه بخوام یه ستونی اضافه کنم در ستون چهل و چهارم ، بعنوان خروجی شبکه که فقط صفر و یک هستن و متمایز از ستونهای دیگه هست. اگه اینو اضافه کنم ، چیکار باید بکنم که این ستون رو جزء ستونهای تصادفی انتخاب نکنه؟ولی سطرها که تغییر میکنه اون المانی که در ستون 44 هست به همراه سطر تغییر کنه؟
آخرین ویرایش به وسیله coronaa : شنبه 20 اردیبهشت 1393 در 18:52 عصر
فهمیدم منظورتون چیه. یعنی متغیر پاسخ در ستون آخر باشه
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X)-1);
i0=i0(1:ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),[i0 cols(X)]);
b=X(i2(99:163),[i0 cols(X)]);
end
منهدس از اینکه هر dataset با دو ماتریس a,b در سلولی ذخیره میشه خوبه. ولی من میخوام توی خروجی هر بار که این حلقه تکرار میشه بنویسه dataset1 با 5 تا ستون
dataset2 با 10 تا ستون و ...
datasetn با mتا ستون.
نمیشه اینطوری توی خروجی نشون داد؟
function [a,b]= myfun(X,ncols)
cols=@(xx) size(xx,2);
i0=0;i1=0;
while( numel(i1)~=163)
i0=randperm(cols(X)-1);
i0=i0(1:ncols);
[ii,i1,jj]=unique(X(:,i0),'rows');
end
i2=randperm(163);
a=X(i2(1:98),[i0 cols(X)]);
b=X(i2(99:163),[i0 cols(X)]);
end
celldata={};
j=1;
X=[rand(163,43),rand(163,1)<.5];
for i=[5:5:35,43]
[a,b]=myfun(X,i);
disp(sprintf("dataset with %d columns",i));
celldata{j}={a,b};
j=j+1;
end
عالی بود. مرسی.
من اینو با دیتای X که بصورت رندوم ساخته میشه اجرا کردم و جواب میده. به همراه همون برنامه anfis که داخلش گذاشتم.
ولی با دیتای واقعی خودم که اجرا میکنم برای dataset7 با 35 ستون، در مورد Rank ماتریس یه warning میده. به این صورت :
Warning: Rank deficient, rank = 35, tol = 1.0695e-008.
> In genfis3>computemfparams at 227
In genfis3 at 160
In pro at 31
Warning: Some input values are outside of the specified input range.
> In evalfis at 76
In pro at 76
منظورش چیه؟ ینی باید یه شرط برای Rank ماتریس بذارم که بگم کمتر از مقدار ستونها نباشه؟ و اگه بود دوباره یه ماتریس تصادفی a,b درست کن؟
حالا این روشی که شما می گید خوبه ولی فکر کنم باید قبلا داده ها را ابتدا نرمال یا استاندارد کنید. یعنی میانگین صفر و واریانس 1 داشته باشه
فکر کنم دیگه rank اون کم نشه
r=rand(163,43);
X=[(r.-mean(r))./std(r),rand(163,1)<.5];
نه منظورم کاهش ابعاد نیست
فرض کنید ماتریسی که شما از قبل دارید ماتریس r باشه
این جور باید تبدیلش کنید
اگه خروجی نباید نرمالیزه بشه من باید ورودی و خروجی رو از هم جدا کنم.
میخوام ورودی و خروجی ماتریس رو اینطوری فراخونی کنم ولی خطا میده؟
میخوام بگم برای in همه سطرها و از ستون A تا AR
و برای out همه سطرها و فقط ستون AS
in = xlsread('C:\Users\Desktop\tip\data.2.xlsx',1,'A:AR ');
out = xlsread('C:\Users\Desktop\tip\data.2.xlsx',1,'AS') ;
در ضمن دستوری که شما برای نرمالیزه دادین خطا میده. اینجاش :
-mean(r)
منفی واسه چیه؟
آخرین ویرایش به وسیله coronaa : دوشنبه 22 اردیبهشت 1393 در 14:03 عصر
یه سوال برام پیش اومد!
اگه ماتریس رو نرمالیزه کنیم ماهیتش تغییری نمیکنه؟ خب دیگه اینا اعداد واقعی نمیشن که یه المانهای دیگه قرار میگیره!
سوال دیگه:
این خط رو برای چی تعریف کردین؟
cols=@(xx) size(xx,2);
نمیدونم داده های شما چه طوریه. اگه بتونید فایلها را آپلود کنید
فرمول نرمال سازی :
یعنی میانگین داده ها را از هر عددی کم می کنیم و نتیجه بدست اومده را تقسیم بر انحراف معیار دده ها می کنیم
اینها روی خروجی اعمال نمیشه
r=rand(163,43);
r1=(r.-mean(r))./std(r);
X=[r1,rand(163,1)<.5];
2 تا سوال :
1- اگه بخوام دو تا ماتریس مثلن a , b با ابعاد 3 در 2 و 3 در 3 رو در یک ماتریس قرار بدم چطوریه؟
به این صورت :
M=[a b]
هم با پانتز اجرا کردم هم با کروشه ولی نمیشد!
ـــــــــــــــــــــــــ ـــــــــــــــــــــــــ ـــــــــ
2- من توی هر بار dataset که تشکیل میشه یه مقدار sensivity بدست میارم. حالا اگه بخوام تمام این sensivity که در هر دوره بدست میاد رو با هم جمع کنم و میانگین بگیرم چیکار باید بکنم؟
توی همون حلقه ی برنامه گذاشتم ولی فقط sensivity مرحله آخر رو به من میده. با مراحل قبل جمع نمیکنه!
این یکی را امتحان کنید من در octave تست می کردم
r=rand(163,43);
r1=bsxfun(@rdivide,bsxfun(@minus,r,mean(r)),std(r) );
X=[r1,rand(163,1)<.5];
سوال اول: طبیعتا باید این جور جواب بده
a=rand(3,3);
b=rand(3,2);
M=[a b]
سوال دوم
sumsen=0;
for i=[5:5:35,43]
sumsen=sumsen+sensivity;
end
disp(sumsen/8)
دستور bsxfun باعث میشه عملیات به صورت عضو به عضو برای هر ماتریس اجرا بشه مثل علامت *. به جای علامت *
نرم افزار octave هم یه چیزیه شبیه matlab در عوض open source هست. اما فکر کنم anfis را نداره
با دیتای خودم این خطا رو میده :
??? Error using ==> evalfismex
Illegal parameters in fisGaussianMF() --> sigma = 0
Error in ==> evalfis at 84
[output,IRR,ORR,ARR] = evalfismex(input, fis, numofpoints);
Error in ==> pro at 67
TrainOutputs=evalfis(TrainInputs,fis);
بعضی از ورودی ها با هم همبستگی صد در صد دارند که باید یکیشون حذف بشه
من پیشنهاد می کنم اونهایی که با هم بیشتر از 90 درصد همبستگی دارند حذف بشن
همچنین استاندارد کردن فقط روی داده های train باید اعمال بشه و داده های check باید با استفاده از میانگین و انحراف معیار داده های تمرینی ابتدا تبدیل و سپس در مدل استفاده بشن
همبستگی بین ستون ها منظورمه نه بین سطرها که برنامه نوشتم یعنی بین ورودی ها نباید همبستگی باشه
آخرین ویرایش به وسیله rahnema1 : سه شنبه 23 اردیبهشت 1393 در 19:06 عصر
آها فهمیدم. دیتای خودم رو باید بجاش بذارم. با دستور xlsread
برنامه رو اجرا کردم ولی دوباره این پیغام رو میده :
??? Undefined function or method 'columns' for input arguments of type 'double'.
Error in ==> pro at 10
cc=abs(tril(corr(in)-eye(columns(in))));
ظاهراً columns باید دو تا آرگومان داشته باشه :
columns
Return database table column names
Syntax
l = columns(dbmeta, 'cata')
به جای 1- بذاارید [1-] ببینیم چی میشه
متلب شما عدد منفی را برای sortrows قبول نمی کنه این یکی فکر کنم درست بشه
hh1=sortrows([h' u],1);
hh1=hh1(rows(hh1):-1:1,:);