# مباحث متفرقه برنامه نویسی > برنامه نویسی Matlab >  ساخت ماتریس تصادفی

## coronaa

من یه ماتریس دارم به ابعاد 70 در 10 . چطوری میتونم یه ماتریس تصادفی با ابعاد 35 در 10 از این ماتریس درست کنم در صورتی که سطرهای شبیه به هم نداشته باشن؟

تشکر

----------


## rahnema1

بسته به این داره که آیا تعداد سطرهای یکتا در ماتریس اول بیشتر از 35 تا هست یا نه که اگه باشه به این صورت ماتریس c با 35 سطر تشکیل میشه

a=rand(70,10);
b=unique(a,'rows');
c=b(randperm(35),:);

----------


## coronaa

> بسته به این داره که آیا تعداد سطرهای یکتا در ماتریس اول بیشتر از 35 تا هست یا نه که اگه باشه به این صورت ماتریس c با 35 سطر تشکیل میشه
> 
> a=rand(70,10);
> b=unique(a,'rows');
> c=b(randperm(35),:);


ممنونم از کمکت.
بله همه ی سطرها و ستون ها یکتا هستن. شبیه به هم نداره. آیا باز نیازه که سطر دوم برنامه نوشته بشه؟
ببین اصل سوال من دو قسمتیه. به این صورت :
*من یه ماتریس دارم به ابعاد 70 در 12 . چطوری میتونم یه ماتریس تصادفی با ابعاد 35 در 7 از این ماتریس(اصلی) درست کنم در صورتی که سطرها و ستون های شبیه به هم نداشته باشن؟
و بقیه سطر و ستون در یک ماتریس دیگه قرار بگیرن که میشه ماتریسی به ابعاد 35 در 5
*

----------


## rahnema1

به فرض اینکه در ماتریس a تمام سطرها یکتا باشن نمیشه ضمانت داد که ماتریسی که از اون استخراج شده باشه تمام سطر هاش یکتا باشه
همچنین اینکه بخواهیم بصورت رندوم از ماتریس انتخاب کنیم منظورتون اینه که از سطرهاش به صورت رندوم انتخاب بشه یا اینکه از تمام عناصرش بتونیم رندوم انتخاب کنیم؟
اگه بخواهیم از سطرها رندوم انتخاب کنیم جواب شما میشه ماتریس b , c

a=rand(70,12);

[~,i1,~]=unique(a(:,1:7),'rows');
[~,i2,~]=unique(a(:,8:12),'rows');
i3=intersect(i1,i2);
i4=i3(randperm(35));

b=a(i4,1:7);
c=a(i4,8:12);

----------


## coronaa

> به فرض اینکه در ماتریس a تمام سطرها یکتا باشن نمیشه ضمانت داد که ماتریسی که از اون استخراج شده باشه تمام سطر هاش یکتا باشه
> همچنین اینکه بخواهیم بصورت رندوم از ماتریس انتخاب کنیم منظورتون اینه که از سطرهاش به صورت رندوم انتخاب بشه یا اینکه از تمام عناصرش بتونیم رندوم انتخاب کنیم؟
> اگه بخواهیم از سطرها رندوم انتخاب کنیم جواب شما میشه ماتریس b , c
> 
> a=rand(70,12);
> 
> [~,i1,~]=unique(a(:,1:7),'rows');
> [~,i2,~]=unique(a(:,8:12),'rows');
> i3=intersect(i1,i2);
> ...


ببین هم سطرها رو رندوم انتخاب کنه هم ستونهاش. الآن شما اینجا ستون رو به دلخواه انتخاب کردین!
مثلاً سطرهای 5 و 6 و 12 و 15 و ... تا 35 تا
و ستون های 2 و 8 و 10 و 20 و ... تا 7 تا 
اینا در یک ماتریس قرار بگیرن و بقیه ی سطرها و ستون هایی که استفاده نشدن (که شامل 35 سطر و 5 ستون هست) در ماتریس دیگه ای قرار بگیرن.
رد ضمن ، این برنامه رو که اجرا کردم این پیغام رو داد. در صورتی که پرانتز یا کروشه ای اضافه باز نشده! 
Expression or statement is incorrect--possibly unbalanced (, {, or [.

----------


## rahnema1

این یکی هم سطر و هم ستون را تصادفی انتخاب می کنه

a=rand(70,12);

i0=randperm(12);
[~,i1,~]=unique(a(:,i0(1:7)),'rows');
[~,i2,~]=unique(a(:,i0(8:12)),'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);

b=a(i5,i0(1:7));
c=a(i5,i0(8:12));

----------


## coronaa

> این یکی هم سطر و هم ستون را تصادفی انتخاب می کنه
> 
> a=rand(70,12);
> 
> i0=randperm(12);
> [~,i1,~]=unique(a(:,i0(1:7)),'rows');
> [~,i2,~]=unique(a(:,i0(8:12)),'rows');
> i3=intersect(i1,i2);
> i4=randperm(35);
> ...


 مهندس  خط چهارم این Error رو میده :Expression or statement is incorrect--possibly unbalanced (, {, or [.

----------


## rahnema1

این جور درست میشه؟

a=rand(70,12);

i0=randperm(12);
i01=i0(1:7);
i02=i0(8:12);
a1=a(:,i01);
a2=a(:,i02);
[~,i1,~]=unique(a1,'rows');
[~,i2,~]=unique(a2,'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);

b=a(i5,i01);
c=a(i5,i02);

----------


## coronaa

> این جور درست میشه؟
> 
> a=rand(70,12);
> 
> i0=randperm(12);
> i01=i0(1:7);
> i02=i0(8:12);
> a1=a(:,i01);
> a2=a(:,i02);
> ...


نه متاسفانه.
خط شماره 8 :    
[~,i1,~]=unique(a1,'rows');
اینو ارور میده. میگه پرانتز یا کروشه کم و زیاد گذاشتی. توازن نداره. روی متلب شما جواب میده؟
در ضمن. درسته که شما  ستونها رو باز رندوم کردین ولی من بعداً هی باید تعداد ستون ها رو تغییر بدم. یعنی در حلقه for قرار بدم که یه بار با 5 ستونه یه بار با 10 ستونه و ... انجام بده. اینطوری شما آزادی عمل رو از من گرفتین.
پیفام خطا رو چیکار کنم؟

----------


## rahnema1

فکر کنم نسخه متلب شما از 2009 به پایین هست که علامت ~ را قبول نمی کنه

a=rand(70,12);

i0=randperm(12);
[ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
[ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
i3=intersect(i1,i2);
i4=randperm(35);
i5=i3(i4);

b=a(i5,i0(1:7));
c=a(i5,i0(8:12));

----------


## rahnema1

> در ضمن. درسته که شما ستونها رو باز رندوم کردین ولی من بعداً هی باید تعداد ستون ها رو تغییر بدم. یعنی در حلقه for قرار بدم که یه بار با 5 ستونه یه بار با 10 ستونه و ... انجام بده. اینطوری شما آزادی عمل رو از من گرفتین


دقیقا متوجه نمیشم منظورتون چیه

----------


## coronaa

> دقیقا متوجه نمیشم منظورتون چیه


منم همین حدس رو زدم که این علامت رو نشناسه. نسخه متلب من R2009a ورژن 7.8.0 هست ولی پایینتر که نیس نشناسه.
معادلی نداره؟ NAN گذاشتم نشد!
ببین منظورم اینه که این دو ماتریسی که قراره ساخته بشه بعداً باید در یک حلقه for قرار بگیره تا 10 بار از این ماتریسا بسازه که هر بار تعداد ستون هاش تغییر میکنه.
مثلاً بار اول دوتا ماتریس ساخت با ابعاد 35 در 7 و 35 در 5
بار دوم دو ماتریس با ابعاد 35 در 4 و 35 در 8
بار سوم دو ماتریس 35 در 6 و 35 در 6
و ...
تا 10 بار انجام بده.
هر بار که میسازه سطرها و ستونها باید تصادفی انتخاب بشه و تعداد سطرها ثابت هست ولی تعداد ستونها تغییر میکنه!
اگه نتونستم منظورمو برسونم یه آدرس ایمل بده تا روی کاغذ برات پیاده سازی کنم.
مرسی از راهنمایی و کمکت.

----------


## coronaa

> فکر کنم نسخه متلب شما از 2009 به پایین هست که علامت ~ را قبول نمی کنه
> 
> a=rand(70,12);
> 
> i0=randperm(12);
> [ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
> [ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
> i3=intersect(i1,i2);
> i4=randperm(35);
> ...


مرسی. این جواب داد. میشه بگی سطر 4 و 5 و 6 چیکار میکنه؟

----------


## rahnema1

یک تابع به نام myfun درست می کنیم و تعداد ستون b را به اون می دهیم تا هم b ایجاد بشه و هم c

function [b,c]= myfun(a,bcols)
	i0=randperm(cols(a));
	[ii,i1,jj]=unique(a(:,i0(1:bcols)),'rows');
	[ii,i2,jj]=unique(a(:,i0(bcols+1:cols(a))),'rows');
	i3=intersect(i1,i2);
	i5=i3(randperm(35));
	b=a(i5,i0(1:bcols));
	c=a(i5,i0(bcols+1:cols(a)));
end
a=rand(70,12);
[b,c]=myfun(a,7);

----------


## rahnema1

[ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
دستور بالا میاد از ماتریس a یک ماتریس استخراج می کنه به این صورت که هفت تا ستون را تصادفی انتخاب می کنه و همچنین سطرهای این ماتریس هفت ستونی یکتا باشن . بعد هم میاد اندکس اون سطرهایی از ماتریس a که شامل این سطرهای جدید میشن را استخراج می کنه. یعنی i1 اندکس سطرهای استخراج شده در ماتریس a هست

[ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
این هم که در مورد ماتریس با 5 ستون اعمال میشه دقیقا مثل قبلی

i3=intersect(i1,i2);
اینجا عناصر مشترک بین دو اندکس را پیدا می کنیم چون ممکنه مثلا تعداد سطرهای یکتا در یکی زیاد تر از اون یکی باشه

----------


## coronaa

> [ii,i1,jj]=unique(a(:,i0(1:7)),'rows');
> دستور بالا میاد از ماتریس a یک ماتریس استخراج می کنه به این صورت که هفت تا ستون را تصادفی انتخاب می کنه و همچنین سطرهای این ماتریس هفت ستونی یکتا باشن . بعد هم میاد اندکس اون سطرهایی از ماتریس a که شامل این سطرهای جدید میشن را استخراج می کنه. یعنی i1 اندکس سطرهای استخراج شده در ماتریس a هست
> 
> [ii,i2,jj]=unique(a(:,i0(8:12)),'rows');
> این هم که در مورد ماتریس با 5 ستون اعمال میشه دقیقا مثل قبلی
> 
> i3=intersect(i1,i2);
> اینجا عناصر مشترک بین دو اندکس را پیدا می کنیم چون ممکنه مثلا تعداد سطرهای یکتا در یکی زیاد تر از اون یکی باشه


الآن این دو ماتریسی که تشکیل شد سطرهای شبیه به هم ندارن دیگه! نه در خودشون و نه در دیگری. درسته؟

----------


## rahnema1

اگه تعداد ستون b و c مساوی باشه ممکنه سطرهای مشابه پیدا کنن 
با این یکی مشکل برطرف میشه:

function [b,c]= myfun(a,bcols)
	cols=@(x) columns(x);
	i1=0;i3=0;
	i0=randperm(cols(a));
	if (bcols==(cols(a)-bcols))
		[ii,i1,jj]=unique([a(:,i0(1:bcols));a(:,i0(bcols+1:cols(a)))],'rows');
		i3=intersect(i1(i1<=35),i1(i1>35)-35);
	else
		[ii,i1,jj]=unique(a(:,i0(1:bcols)),'rows');
		[ii,i2,jj]=unique(a(:,i0(bcols+1:cols(a))),'rows');
		i3=intersect(i1,i2);
	end
	i5=i3(randperm(35));
	b=a(i5,i0(1:bcols));
	c=a(i5,i0(bcols+1:cols(a)));
end
a=rand(70,12);
[b,c]=myfun(a,6);

----------


## coronaa

> اگه تعداد ستون b و c مساوی باشه ممکنه سطرهای مشابه پیدا کنن 
> با این یکی مشکل برطرف میشه:


معذرت میخوام. من یه جارو اشتباه گفتم.
هر بار که این دو ماتریس رو میسازه تعداد ستونهای دو ماتریس باید برابر و شبیه هم باشه. یعنی اگه در ماتریس b از ستون های 1 و 4 و 7 و 10 استفاده شد ، باید در ماتریس c هم همین ستونها استفاده بشه. ولی سطرهای اونها متفاوته.
و این عمل باید 10 بار تکرار بشه با ستونهای مختلف.
من فکر کنم اینطوری منظور منو متوجه نمیشی!
میشه آدرس ایمیل خودتو توی پیام خصوصی برام بذاری تا من توی برگه مشخص کنم.
تشکر

----------


## rahnema1

function [a,b]= myfun(X,ncols)
	i0=0;i1=0;
	while( rows(i1)!=163)
		i0=randperm(cols(X),ncols);
		i1=unique(X(:,i0),'rows');
	end
	i2=randperm(163);
	a=X(i2(1:98),i0);
	b=X(i2(99:163),i0);
end
X=rand(163,43);
for i=[5:5:35,43]
	[a,b]=myfun(X,i);
end

----------


## coronaa

ممنونم.
روی خط سوم برنامه ، برای علامت تعجب (!) خطا میده. منظور از این علامت چیه؟ میشه بجاش =~ گذاشت؟ اینو میذارم خطا نمیده.
در ضمن ، یه پیغام دیگه در خط 11 میده. این پیغام :??? Error: File: myfun.m Line: 11 Column: 1
This statement is not inside any function.
 (It follows the END that terminates the definition of the function "myfun".)

----------


## rahnema1

=~ درسته همین را بذارید
بعد از اتمام تابع هم می تونید اون دستورات را از توی فایل بردارید و در خط فرمان اجرا کنید و یا اینکه نام فایل را تغییر بدید

----------


## coronaa

ببین من فعلاً خط 10 به بعد رو حذف کردم تا فقط یک تابع داشته باشم. بصورت زیر :function [a,b]= myfun(X,ncols) 
    i0=0;i1=0; 
    while( rows(i1)~=163) 
        i0=randperm(cols(X),ncols); 
        i1=unique(X(:,i0),'rows'); 
    end 
    i2=randperm(163); 
    a=X(i2(1:98),i0); 
    b=X(i2(99:163),i0); 
end
حالا اینو اجرا میکنم پیغام زیر رو میده :??? Undefined function or method 'rows' for input arguments of type 'double'.

Error in ==> myfun at 3
    while( rows(i1)~=163)

----------


## coronaa

شما چطوری برنامه متلب رو اینجا قرار میدی که شبیه خود محیط متلب میوفته؟
من دستورات رو اینجا میذارم سمت راست قرا میگیره!  :)

----------


## rahnema1

از این استفاده کن ببین درست میشه
کد ها را داخل تگ بذار
همون دکمه ها که روی اونها نوشته C++‎ یا vb
من داخل تگ VB میذارم

function [a,b]= myfun(X,ncols)
	i0=0;i1=0;
	while( numel(i1)~=163)
		i0=randperm(cols(X),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
X=rand(163,43);
for i=[5:5:35,43]
	[a,b]=myfun(X,i);
end

----------


## coronaa

من اینو اجرا کردم ولی میگه X رو نمیشناسه.
function [a,b]= myfun(X,ncols) 
    i0=0;i1=0; 
    while( numel(i1)~=163) 
        i0=randperm(cols(X),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 
خب وقتی X رو بعد از تابع معرفی کنیم ولی متغیر X رو توی تابع بکار ببریم اینطوری نمیشه؟

----------


## rahnema1

با متلب توی اون فولدر برید که این فایل هست
بعد این دستورها را بزنید

X=rand(163,43);
for i=[5:5:35,43]
	[a,b]=myfun(X,i);
end

----------


## coronaa

> function [a,b]= myfun(X,ncols) 
>     i0=0;i1=0; 
>     while( numel(i1)~=163) 
>         i0=randperm(cols(X),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


خط چهارم هم این پیغام رو میده. مثل rows :
??? Undefined function or method 'cols' for input arguments of type 'double'.

Error in ==> myfun at 4
        i0=randperm(cols(X),ncols);

----------


## coronaa

توی متلب شما این خطاها رو نمیده یعنی؟

----------


## rahnema1

شاید یک متغیر با نام X قبلا درست کردید
یا متلب را کلا ببندید و باز کنید یا این دستور را بزنید
clear all

----------


## coronaa

من یه فولدر ساختم که توش یه فایل به اسم myfun هست که محتواش اینه :
function [a,b]= myfun(X,ncols) 
    i0=0;i1=0; 
    while( numel(i1)~=163) 
        i0=randperm(cols(X),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 گذاشتم که محتواش اینه :
X=rand(163,43); 
for i=[5:5:35,43] 
    [a,b]=myfun(X,i) 
end
وقتی برنامه دوم رو اجرا میکنم بصورت زیر خطا میده :
??? Undefined function or method 'cols' for input arguments of type 'double'.

Error in ==> myfun at 4
        i0=randperm(cols(X),ncols);

Error in ==> randmat at 3
    [a,b]=myfun(X,i)

----------


## rahnema1

این دستور را در خط فرمان متلب کپی و پیست کنید

X=rand(163,43);
for i=[5:5:35,43]
	[a,b]=myfun(X,i);
end

----------


## coronaa

یعنی در خط چهارم برنامه myfun کلمه cols باید مثل rows ، عبارت numel قرار بگیره؟

----------


## rahnema1

عبارتی که کپی و پیست کردید اجرا شد؟

----------


## coronaa

> این دستور را در خط فرمان متلب کپی و پیست کنید
> 
> X=rand(163,43);
> for i=[5:5:35,43]
>     [a,b]=myfun(X,i);
> end


فرقی نکرد. همون خطا رو داد.
برای شما خطا نمیده؟

----------


## rahnema1

این دستور چه جوابی میده؟

X=rand(163,43);
cols(X)

----------


## coronaa

> این دستور چه جوابی میده؟
> 
> X=rand(163,43);
> cols(X)


??? Undefined function or method 'cols' for input arguments of type 'double'.

----------


## rahnema1

فکر کنم در وتلب شما دستور cols وجود نداره
این را امتحان کنید

function [a,b]= myfun(X,ncols) 
	cols=@(xx) size(xx,2);
    i0=0;i1=0; 
    while( numel(i1)~=163) 
        i0=randperm(cols(X)); 
        [ii,i1,jj]=unique(X(:,i0(1:ncols)),'rows'); 
    end 
    i2=randperm(163); 
    a=X(i2(1:98),i0); 
    b=X(i2(99:163),i0); 
end

----------


## coronaa

> فکر کنم در وتلب شما دستور cols وجود نداره
> این را امتحان کنید
> 
> function [a,b]= myfun(X,ncols) 
>     cols=@(xx) size(xx,2);
>     i0=0;i1=0; 
>     while( numel(i1)~=163) 
>         i0=randperm(cols(X)); 
>         [ii,i1,jj]=unique(X(:,i0(1:ncols)),'rows'); 
> ...


خب آقای مهندس. فعلاً اینو جواب داد و خطا نداد.
حالا این ماتریسهایی که ساخت رو نمیشه اندیس گذاشت؟ چون هر بار که درست میکنه میگه a , b !
بعد یه سوال؟
چطوری میشه تشخیص داد که هر بار که ماتریس a,b میسازه مشخص کنیم هیچ سطر مشابهی ندارن؟
یا dataset1 و dataset2 ماتریس شبیه به هم ندارن؟

----------


## coronaa

راستی ، این فقط ماتریس آخری که با 43 تا ستون داره رو ایجاد میکنه. پس ماتریس هایی با ستونهای 5 و 10 و 15 و 20 و .... چی؟
فکر کنم باید اندیس براش گذاشته بشه. درسته؟ چون اینطوری فقط آخرین ماتریس a,b رو نشون میده!

----------


## rahnema1

یه اشتباهی در کد بالا شد که درست کردم
اینکه در حلقه for مقادیر قبلی چه طور میشن بستگی به استفاده شما داره 
اما اگه می خواهید ذخیره کنید میتونید در سلول ذخیره کنید مثل این:

k=0;
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
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

مقادیر هم یکتا هستند و مشکلی نیست

----------


## coronaa

> یه اشتباهی در کد بالا شد که درست کردم
> اینکه در حلقه for مقادیر قبلی چه طور میشن بستگی به استفاده شما داره 
> اما اگه می خواهید ذخیره کنید میتونید در سلول ذخیره کنید مثل این:
> 
> k=0;
> function [a,b]= myfun(X,ncols) 
>     cols=@(xx) size(xx,2);
>     i0=0;i1=0; 
>     while( numel(i1)~=163) 
> ...


من برنامه تابع رو میخوام جدا کنم. تا خط 12 رو توی یه فایل و بقیه رو توی یه فایل دیگه بذارم؟
k=0; واسه چیه؟ کجا استفاده شد ازش؟

----------


## coronaa

به این صورت جدا کردم :
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);

----------


## rahnema1

متغیر 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

----------


## coronaa

> متغیر 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);
> ...


مرسی. اجرا شد فعلاً
حال من اگه بخوام ماتریس a از dataset2 رو فراخونی کنم باید چیکار کنم؟
چون این یه قسمتی از برنامه ی من هست و باید برنامه ای که با anfis نوشتم رو توی این حلقه ی for قرار بدم.
 به این صورت که dataset1 رو ببره توی anfis بعنوان ماتریس های  آموزش و تست اجرا کنه. بعد dataset2 رو ببره توی anfis احرا کنه و الی آخر.
آیا اینکار رو انجام میده؟

----------


## rahnema1

اصلا لازم نبود a,b را در سلول ذخیره کنید توی همون حلقه for ازش استفاده می کردید
در هر صورت برای استخراج a و b از داخل سلول این را بنویسید

for i=1:numel(celldata)
	a=celldata{i}{1}
	b=celldata{i}{2}
end

----------


## coronaa

مرسی مهندس. عالی بود.نمیشه برای ماتریس های a,b هر dataset اندیس گذاشت و توی workspace نشون داد؟a1,b1a2,b2a3,b3...

----------


## rahnema1

مگه سلول را نمیشه نشون داد؟

----------


## coronaa

> مگه سلول را نمیشه نشون داد؟


بله. سلول نمایش داده میشه. خب حالا اینو بعدن درست میکنم.
 الآن یه سوالی که برام پیش اومد اینه که من اگه بخوام یه ستونی اضافه کنم در ستون چهل و چهارم ، بعنوان خروجی شبکه که فقط صفر و یک هستن و متمایز از ستونهای دیگه هست. اگه اینو اضافه کنم ، چیکار باید بکنم که این ستون رو جزء ستونهای تصادفی انتخاب نکنه؟ولی سطرها که تغییر میکنه اون المانی که در ستون 44 هست به همراه سطر تغییر کنه؟

----------


## rahnema1

> بله. سلول نمایش داده میشه. خب حالا اینو بعدن درست میکنم.
> الآن یه سوالی که برام پیش اومد اینه که من اگه بخوام یه ستونی اضافه کنم در ستون شصت و چهارم ، بعنوان خروجی شبکه که فقط صفر و یک هستن و متمایز از ستونهای دیگه هست. اگه اینو اضافه کنم ، چیکار باید بکنم که این ستون رو جزء ستونهای تصادفی انتخاب نکنه؟ولی سطرها که تغییر میکنه اون المانی که در ستون 64 هست به همراه سطر تغییر کنه؟


دقیقا متوجه نمیشم. یعنی خروجی را در ماتریس ورودی قرار میده؟ نمیشه خروجی در یک ماتریس جداگانه باشه

----------


## rahnema1

فهمیدم منظورتون چیه. یعنی متغیر پاسخ در ستون آخر باشه

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

----------


## coronaa

> فهمیدم منظورتون چیه. یعنی متغیر پاسخ در ستون آخر باشه
> 
> 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');  
> ...


بله ولی باید این ستون در ماتریس های a,b وجود داشته باشه. (در ستون آخر)
اجرا کردم این پیغام رو میده :
??? Index exceeds matrix dimensions.

Error in ==> myfun at 6
        i0=i0(1:ncols);

----------


## coronaa

> بله ولی باید این ستون در ماتریس های a,b وجود داشته باشه. (در ستون آخر)
> اجرا کردم این پیغام رو میده :
> ??? Index exceeds matrix dimensions.
> 
> Error in ==> myfun at 6
>         i0=i0(1:ncols);


خطا حل شد ولی داخل سلولها رو که نگاه میکنم توی ماتریس های a,b ستون آخرش خروجی (صفر و یک) وجود نداره!

----------


## coronaa

> خطا حل شد ولی داخل سلولها رو که نگاه میکنم توی ماتریس های a,b ستون آخرش خروجی (صفر و یک) وجود نداره!


اجازه بدین یه بار دیگه امتحان کنم. یه جایی رو خودم اشتباه کرده بودم.
خبر میدم بهتون.
مرسی

----------


## coronaa

منهدس از اینکه هر dataset با دو ماتریس a,b در سلولی ذخیره میشه خوبه. ولی من میخوام توی خروجی هر بار که این حلقه تکرار میشه بنویسه dataset1 با 5 تا ستون
dataset2 با 10 تا ستون و ...
datasetn با mتا ستون.
نمیشه اینطوری توی خروجی نشون داد؟

----------


## rahnema1

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

----------


## coronaa

عالی بود. مرسی.
من اینو با دیتای 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 درست کن؟

----------


## rahnema1

حالا این روشی که شما می گید خوبه ولی فکر کنم باید قبلا داده ها را ابتدا نرمال یا استاندارد کنید. یعنی میانگین صفر و واریانس 1 داشته باشه
فکر کنم دیگه rank اون کم نشه

r=rand(163,43);
X=[(r.-mean(r))./std(r),rand(163,1)<.5];

----------


## coronaa

> حالا این روشی که شما می گید خوبه ولی فکر کنم باید قبلا داده ها را ابتدا نرمال یا استاندارد کنید. یعنی میانگین صفر و واریانس 1 داشته باشه
> فکر کنم دیگه rank اون کم نشه
> 
> r=rand(163,43);
> X=[(r.-mean(r))./std(r),rand(163,1)<.5];


منظور شما همون PCA(کاهش ابعاد) هست؟

----------


## rahnema1

نه منظورم کاهش ابعاد نیست
فرض کنید ماتریسی که شما از قبل دارید ماتریس r باشه
این جور باید تبدیلش کنید

----------


## coronaa

اگه خروجی نباید نرمالیزه بشه من باید ورودی و خروجی رو از هم جدا کنم.
میخوام ورودی و خروجی ماتریس رو اینطوری فراخونی کنم ولی خطا میده؟
میخوام بگم برای 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

یه سوال برام پیش اومد!
اگه ماتریس رو نرمالیزه کنیم ماهیتش تغییری نمیکنه؟ خب دیگه اینا اعداد واقعی نمیشن که یه المانهای دیگه قرار میگیره!
سوال دیگه:
این خط رو برای چی تعریف کردین؟
cols=@(xx) size(xx,2);

----------


## rahnema1

> اگه خروجی نباید نرمالیزه بشه من باید ورودی و خروجی رو از هم جدا کنم.
> میخوام ورودی و خروجی ماتریس رو اینطوری فراخونی کنم ولی خطا میده؟
> میخوام بگم برای 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)
> منفی واسه چیه؟


نمیدونم داده های شما چه طوریه. اگه بتونید فایلها را آپلود کنید
فرمول نرمال سازی :
یعنی میانگین داده ها را از هر عددی کم می کنیم و نتیجه بدست اومده را تقسیم بر انحراف معیار دده ها می کنیم 
اینها روی خروجی اعمال نمیشه

r=rand(163,43);
r1=(r.-mean(r))./std(r);
X=[r1,rand(163,1)<.5];

----------


## rahnema1

> یه سوال برام پیش اومد!
> اگه ماتریس رو نرمالیزه کنیم ماهیتش تغییری نمیکنه؟ خب دیگه اینا اعداد واقعی نمیشن که یه المانهای دیگه قرار میگیره!
> سوال دیگه:
> این خط رو برای چی تعریف کردین؟
> cols=@(xx) size(xx,2);


این کار یک روش معمول هست. که در مرحله پیش پردازش داده ها انجام میشه.  در رابطه بین ورودی و خروجی تاثیری نمی ذاره. اما در عوض باعث فیت بهتر مدل میشه
چون نسخه متلب شما قدیمیه و دستور cols در اون وجود نداره اومدم cols را واسه اون تعریف کردم

----------


## coronaa

> r=rand(163,43);
> r1=(r.-mean(r))./std(r);
> X=[r1,rand(163,1)<.5];


این دستورات رو که اجرا میکنم این پیغام رو میده :
??? r1=(r.-mean(r))./std(r); 
          |
Error: Unexpected MATLAB operator.
روی متلب شما اجرا میشه؟

----------


## coronaa

2 تا سوال :
1- اگه بخوام دو تا ماتریس مثلن a , b با ابعاد 3 در 2 و 3 در 3 رو در یک ماتریس قرار بدم چطوریه؟
به این صورت :
M=[a b]
هم با پانتز اجرا کردم هم با کروشه ولی نمیشد!
ـــــــــــــــــــــــــ  ـــــــــــــــــــــــــ  ـــــــــ
2- من توی هر بار dataset که تشکیل میشه یه مقدار sensivity بدست میارم. حالا اگه بخوام تمام این sensivity که در هر دوره بدست میاد رو با هم جمع کنم و میانگین بگیرم چیکار باید بکنم؟
توی همون حلقه ی برنامه گذاشتم ولی فقط sensivity مرحله آخر رو به من میده. با مراحل قبل جمع نمیکنه!

----------


## rahnema1

این یکی را امتحان کنید من در 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)

----------


## coronaa

> این یکی را امتحان کنید من در octave تست می کردم
> 
> r=rand(163,43);
> r1=bsxfun(@rdivide,bsxfun(@minus,r,mean(r)),std(r)  );
> X=[r1,rand(163,1)<.5];


حل شد. مرسی. واقعاً ازت ممنونم.
میشه بگی خط دوم چیکار میکنه؟ هیچکدوم از دستوراتش برام آشنا نیست!
حالا وقتی که نرمالیزه شد، یه سری از اعداد منفی شدن. اشکالی نداره؟
راستی، octave چه نرم افزاریه؟

----------


## rahnema1

دستور bsxfun باعث میشه عملیات به صورت عضو به عضو برای هر ماتریس اجرا بشه مثل علامت *. به جای علامت *
نرم افزار octave هم یه چیزیه شبیه matlab در عوض open source هست. اما فکر کنم anfis را نداره

----------


## coronaa

با دیتای خودم این خطا رو میده :
??? 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);

----------


## rahnema1

بعضی از ورودی ها با هم همبستگی صد در صد دارند که باید یکیشون حذف بشه
من پیشنهاد می کنم اونهایی که با هم بیشتر از 90 درصد همبستگی دارند حذف بشن
همچنین استاندارد کردن فقط روی داده های train باید اعمال بشه و داده های  check باید با استفاده از میانگین و انحراف معیار داده های تمرینی ابتدا تبدیل و سپس در مدل استفاده بشن

----------


## coronaa

> بعضی از ورودی ها با هم همبستگی صد در صد دارند که باید یکیشون حذف بشه
> من پیشنهاد می کنم اونهایی که با هم بیشتر از 90 درصد همبستگی دارند حذف بشن


خب چه دستوری باید بکار ببرم تا داده های تکراری حذف بشن؟ چیکار باید بکنم؟
یه سوال:
در کل چه دستوری باید بکار ببرم تا بتونم متوجه بشم دو ماتریس a,b هیچ سطر مشابهی ندارن؟ آیا دستوری وجود داره که مقایسه کنه؟

----------


## rahnema1

همبستگی بین ستون ها منظورمه نه بین سطرها که برنامه نوشتم یعنی بین ورودی ها نباید همبستگی باشه

----------


## coronaa

> همبستگی بین ستون ها منظورمه نه بین سطرها که برنامه نوشتم یعنی بین ورودی ها نباید همبستگی باشه


دستت درد نکنه.
خط هشتم برنامه این پیغام رو میده.
??? Error using ==> dlmread at 62
The file 'a1.csv' could not be opened because: No such file or directory

Error in ==> jadid at 8
 data=dlmread('a1.csv');
دیتا به چه فرمتی تبدیل شد؟

----------


## coronaa

آها فهمیدم. دیتای خودم رو باید بجاش بذارم. با دستور 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))));

----------


## coronaa

ظاهراً columns باید دو تا  آرگومان داشته باشه :
*columns*Return database table column names
*Syntax*l = columns(dbmeta, 'cata')

----------


## rahnema1

ببخشید همون cols را بذارید

----------


## coronaa

> ببخشید همون cols را بذارید


اجرا کردم. یه خطا دیگه :
??? Error using ==> sortrows at 64
COL must be a vector of column indices into X.

Error in ==> pro at 16
     hh1=sortrows([h' u],-1);

----------


## rahnema1

به جای 1- بذاارید  [1-] ببینیم چی میشه

----------


## coronaa

> به جای 1- بذاارید  [1-] ببینیم چی میشه


متاسفانه باز همون خطا!

----------


## rahnema1

متلب شما عدد منفی را برای sortrows قبول نمی کنه این یکی فکر کنم درست بشه

hh1=sortrows([h' u],1);
hh1=hh1(rows(hh1):-1:1,:);

----------


## coronaa

> متلب شما عدد منفی را برای sortrows قبول نمی کنه این یکی فکر کنم درست بشه
> 
> hh1=sortrows([h' u],1);
> hh1=hh1(rows(hh1):-1:1,:);


بازم حل نشد!
??? Error using ==> sortrows at 64
COL must be a vector of column indices into X.

Error in ==> pro at 16
     hh1=sortrows([h' u],1);

----------


## rahnema1

این یکی چی؟

h0=[h' u];
hh1=sortrows(h0,1);
hh1=hh1(rows(hh1):-1:1,:);

----------


## coronaa

> این یکی چی؟
> 
> h0=[h' u];
> hh1=sortrows(h0,1);
> hh1=hh1(rows(hh1):-1:1,:);


نه!
??? Error using ==> sortrows at 64
COL must be a vector of column indices into X.

Error in ==> pro at 17
hh1=sortrows(h0,1);

----------


## rahnema1

اصلا فکر کنم sortrows نداره

	u=unique([i;j]);
	h=hist([i;j],u);
	[ss ii]=sort(h);
	hh1=u(ii(numel(ii):-1:1));
	 rng=[];
	 dex=1;dex1=1;
	     while( rows(ij)~=0)
			[m n]=find(ij==hh1(dex));  
			ij(m,:)=[] ;
			if (numel(m)>0)
				rng(dex1)=hh1(dex);
				dex1=dex1+1;
			end
			dex=dex+1;
			
	     end
	 in(:,rng)=[];
	 
     out = data(:,end);

----------


## coronaa

> اصلا فکر کنم sortrows نداره
> 
>     u=unique([i;j]);
>     h=hist([i;j],u);
>     [ss ii]=sort(h);
>     hh1=u(ii(numel(ii):-1:1));
>      rng=[];
>      dex=1;dex1=1;
>          while( rows(ij)~=0)
> ...


sortrows داره مهندس. اینم syntax :
 
MATLAB




*  sortrows*


Sort rows in ascending order
*syntax*
B = sortrows(A)
B = sortrows(A,column)
[B,index] = sortrows(A,...)
*Description*
B = sortrows(A) sorts therows of A in ascending order. Argument A mustbe either a matrix or a column vector. 
For strings, this is the familiar dictionary sort. When A iscomplex, the elements are sorted by magnitude, and, where magnitudesare equal, further sorted by phase angle on the interval .
B = sortrows(A,column) sortsthe matrix based on the columns specified in the vector column.If an element of column is positive, the MATLAB softwaresorts the corresponding column of matrix A in ascendingorder; if an element of column is negative, MATLAB sortsthe corresponding column in descending order.  For example, sortrows(A,[2-3]) sorts the rows of A first in ascendingorder for the second column, and then by descending order for thethird column.
[B,index] = sortrows(A,...) alsoreturns an index vector index. 
If A is a column vector, then B= A(index). If A is an m-by-n matrix,then B = A(index,:).
*Examples*
Start with a mostly random matrix, A:
rand('state',0)
A = floor(rand(6,7) * 100);
A(1:4,1)=95;  A(5:6,1)=76;  A(2:4,2)=7;  A(3,3)=73
A =
    95    45    92    41    13     1    84
    95     7    73    89    20    74    52
    95     7    73     5    19    44    20
    95     7    40    35    60    93    67
    76    61    93    81    27    46    83
    76    79    91     0    19    41     1When called with only a single input argument, sortrows basesthe sort on the first column of the matrix. For any rows that haveequal elements in a particular column, (e.g., A(1:4,1) forthis matrix), sorting is based on the column immediately to the right,(A(1:4,2) in this case):
B = sortrows(A)
B =
    76    61    93    81    27    46    83
    76    79    91     0    19    41     1
    95     7    40    35    60    93    67
    95     7    73     5    19    44    20
    95     7    73    89    20    74    52
    95    45    92    41    13     1    84When called with two input arguments, sortrows basesthe sort entirely on the column specified in the second argument.Rows that have equal elements in the specified column, (e.g., A(2:4,:),if sorting matrix A by column 2) remainin their original order:
C = sortrows(A,2)
C =
    95     7    73    89    20    74    52
    95     7    73     5    19    44    20
    95     7    40    35    60    93    67
    95    45    92    41    13     1    84
    76    61    93    81    27    46    83
    76    79    91     0    19    41     1
This example specifies two columns to sort by: columns 1 and7. This tells sortrows to sort by column 1 first,and then for any rows with equal values in column 1, to sort by column7:
D = sortrows(A,[1 7])
D =
    76    79    91     0    19    41     1
    76    61    93    81    27    46    83
    95     7    73     5    19    44    20
    95     7    73    89    20    74    52
    95     7    40    35    60    93    67
    95    45    92    41    13     1    84Sort the matrix using the values in column 4 this time and inreverse order:
E = sortrows(A, -4)
E =
    95     7    73    89    20    74    52
    76    61    93    81    27    46    83
    95    45    92    41    13     1    84
    95     7    40    35    60    93    67
    95     7    73     5    19    44    20
    76    79    91     0    19    41     1




حالا اینو جایگزین کردم این پیغام رو میده :
??? Undefined function or method 'rows' for input arguments of type 'double'.

Error in ==> pro at 20
     while( rows(ij)~=0)

----------


## rahnema1

به جای( row(ij از این استفاده کنید ببینیم چی میشه

size(ij)(1)

----------


## coronaa

??? Error: File: pro.m Line: 20 Column: 13
()-indexing must appear last in an index expression.

----------


## rahnema1

از ij یک خروجی بگیر ببینیم چیه

----------


## coronaa

> از ij یک خروجی بگیر ببینیم چیه


   Empty matrix: 0-by-2

----------


## rahnema1

یعنی این

 [i j]=find(cc>.9);
 ij=[i j]

----------


## coronaa

اصلاً u و h که معرفی کردی خروجیش empty هست!

----------


## coronaa

> یعنی این
> 
>  [i j]=find(cc>.9);
>  ij=[i j]


ij =

   Empty matrix: 0-by-2

----------


## rahnema1

فکر کنم دستور cor ففط توی octave هست

cc=abs(tril(corrcoef(in)-eye(cols(in))));

----------


## rahnema1

البته من در راهنمای متلب توی اینترنت نگاه کردم دستور corr وجود داره

----------


## coronaa

> به جای( row(ij از این استفاده کنید ببینیم چی میشه
> 
> size(ij)(1)


توی این قسمت برنامه :
while( rows(ij)~=0)
اینو جایگذاری کردم :
 while( size(ij)(1)~=0)
پیغام برنامه فعلن اینه : (واسه همین خطه)
??? Error: File: pro.m Line: 20 Column: 13
()-indexing must appear last in an index expression.

----------


## rahnema1

همون rows درسته فکر کنم مشکل در corr هست

----------


## coronaa

> البته من در راهنمای متلب توی اینترنت نگاه کردم دستور corr وجود داره


هردو توی متلب هست.
corr واسه همبستگی خطی یا همبستگی رنک هست
coeecoef احتمالن واسه همبستگی موثر هست. فکر کنم همون corr واسه همین برنامه باشه!
ولی فعلن خطا از همون قسمتی هست که عرض کردم.

----------


## rahnema1

rows=@(xx) size(xx,1);

----------


## coronaa

خروجی cc رو گرفتم. ظاهرن یه ماتریس بالا مثلثی درست میکنه.

----------


## rahnema1

الان این دستور را وارد کنید

 [i j]=find(cc>.9);
 ij=[i j]

----------


## coronaa

> الان این دستور را وارد کنید
> 
>  [i j]=find(cc>.9);
>  ij=[i j]





> الان این دستور را وارد کنید
> 
>  [i j]=find(cc>.9);
>  ij=[i j]


مهندس به جای size(ij)
دوباره با تعریفی که از rows کردی rows گذاشتم.
برنامه اجرای شد. یعنی خطا نداد.
خروجی ij هم اینه :
ij =
 
   Empty matrix: 0-by-2

----------


## coronaa

خب حالا با دیتای خودم اجرا کردم. همون خطایی که قبل از همبستگی کردن میداد رو میده!
??? 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 105
TrainOutputs=evalfis(TrainInputs,fis);

----------


## rahnema1

این خروجی ij مربوط به اتمام برنامه هست باید ij این خروجی را بده

ij =

    5    2
    6    2
   43    2
    8    4
    6    5
   43    5
   43    6
    9    7
   10    7
   38   12
   24   23
   25   23
   25   24
   37   36

----------


## coronaa

خب پس من اول با داده های فرضی به این جواب ij برسم بعد روی داده های واقعی اجرا کنم.

----------


## rahnema1

> خب پس من اول با داده های فرضی به این جواب ij برسم بعد روی داده های واقعی اجرا کنم.


این داده های شماست. همون فایل اکسل

----------


## coronaa

توی فایل من data.1 داده های فرضی هستن و data.2 داد های واقعی.با داده های فرض که اجرا میکنم خطا نمیده ولی ij رو هم خالی میده.با داد های واقعی که اجرا میکنم همون خطایی که گفتم قبل از همبستگی میداد رو میده و ij هم که نمیده.

----------


## coronaa

یه سوال:
 من ماتریس ورودی قبل و بعد از نرمالسازی و همبستگی رو میبینم، میبینم که درایه های ماتریس اولیه همه مثبت بودن ولی بعد از نرمال سازی یه سری منفی شدن.
مشکلی بوجود نمیآد؟

----------


## rahnema1

منفی بشه مشکلی پیش نمیاد

----------


## coronaa

مهندس من هنوز به این جوابم نرسیدم که چطوری میشه دو ماتریس رو با هم مقایسه کرد که سطرهای شبیه به هم ندارن؟کاری به این برنامه ندارم!

----------


## rahnema1

> مهندس من هنوز به این جوابم نرسیدم که چطوری میشه دو ماتریس رو با هم مقایسه کرد که سطرهای شبیه به هم ندارن؟کاری به این برنامه ندارم!


دقیقا متوجه نمیشم منظورتون چیه

----------


## coronaa

دو تا ماتریس داریم a و bهر دو 50 تا سط دارن. حالا چطوری میتونیم تشخیص بدیم که آیا سطرهای شبیه به هم دارن یا نه؟ هر دو سطر مقادیر یکسانی داشته باشه.

----------


## coronaa

این خطای چیه؟
??? Error using ==> evalfismex
Illegal parameters in fisGaussianMF() --> sigma = 0

----------


## rahnema1

گفتم که احتمالا بعد از ستور genfis3 باید پارامترهای تابع عضویت را اصلاح کنید

----------


## rahnema1

> دو تا ماتریس داریم a و bهر دو 50 تا سط دارن. حالا چطوری میتونیم تشخیص بدیم که آیا سطرهای شبیه به هم دارن یا نه؟ هر دو سطر مقادیر یکسانی داشته باشه.


این دستور را بزنید اگه از 100 کمتر شد سطرهای مشابه دارن

size(unique([a;b],'rows'),1)


حالا اگه این دستور را بزنید سطرهایی از a که در b هم وجود داره را مشخص می کنه یعنی اگه 1 بود معادلش در b وجود داره واگه 0 بود یکتا هست

ismember(a,b,'rows')

----------


## coronaa

شما در این برنامه قسمتی رو هم گذاشتین که بگه ماتریس های رندومی که درست میکنه اگه سطرهای مشابه داشت دوباره تولید کنه؟

----------


## rahnema1

> شما در این برنامه قسمتی رو هم گذاشتین که بگه ماتریس های رندومی که درست میکنه اگه سطرهای مشابه داشت دوباره تولید کنه؟


کدوم برنامه؟

----------


## coronaa

همون قسمت ماتریس تصادفی رو که برای برنامه ی من نوشتین.
myfun

----------


## rahnema1

آره دیگه این شرط while( numel(i1)~=163) همین کار رو می کنه

----------


## coronaa

> آره دیگه این شرط while( numel(i1)~=163) همین کار رو می کنه


آخه از اون دستور استفاده نکردین. فکر کردم نیس!  :))

----------


## rahnema1

> آخه از اون دستور استفاده نکردین. فکر کردم نیس!  :))


بازم نگفتین کدوم دستور؟ :)

----------


## coronaa

> بازم نگفتین کدوم دستور؟ :)


size(unique([a;b],'rows'),1)

----------


## coronaa

مهندس عزیز
هنوز متوجه نشدی واسه چی دستور
[i j]=find(cc>.9); 
     ij=[i j];
جواب  Empty matrix: 0-by-2 میده؟

----------


## rahnema1

این دستور را بزن تا نتیجه را ببینیم

r=rand(10,5);
[i j]=find(r>0.5);
[i j]

----------


## coronaa

> این دستور را بزن تا نتیجه را ببینیم
> 
> r=rand(10,5);
> [i j]=find(r>0.5);
> [i j]


جواب میده.
ans =

     6     1
     8     1
    10     1
     1     2
     2     2
     3     2
     4     2
     9     2
     1     3
     2     3
     3     3
     6     3
     8     3
     9     3
    10     3
     3     4
     5     4
     6     4
     7     4
     8     4
     9     4
    10     4
     1     5
     3     5
     5     5
     8     5
     9     5

----------


## rahnema1

مشکلی نیست

----------


## coronaa

ببین!
من این خط برنامه رو به جای 10 گذاشتم 2 . یعنی به دو کلاس تقصیم کن.
fis=genfis3(TrainInputs,TrainTargets,'sugeno',2); 
با داده واقعی جواب گرفتم و خطا هم نداد!
ولی قرار بود که از ستون اول 5 تا 5 تا بره تا 43 که میشد 9 تا dataset.
ولی تا 7 تا dataset رفت و برنامه جواب هم داد.
آخرین dataset رو با 33 تا ستون انجام داد.
احتمالن بعض از ستون ها رو بخاطر همبستگی حذف کرد که دیگه نتوست تا 43 تا ستون بره.
درسته؟

----------


## rahnema1

بله. به خاطر همبستگی تعداد ستونها از 43 به 34 تا کاهش پیدا کرد در نتیجه این جور شد
5   10   15   20   25   30  34

----------


## coronaa

یه بار دیگه اجرا کردم دوباره همون خطای قبلی رو داد :
??? 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 101
TrainOutputs=round(evalfis(TrainInputs,fis));
احتمالن بعضی موقع داده های تصادفی رو طوری انتخاب میکنه که با شبکه سازگار نیست!

----------


## rahnema1

برای کدوم داده این خطا را داد سایز ستونش چنده؟
معمولا وقتی تعداد ستونها از سطر ها بیشتر میشه روش least square جواب نمیده
چون anfis  هم ترکیبی از روش least square و شبکع عصبی هست

----------


## coronaa

> برای کدوم داده این خطا را داد سایز ستونش چنده؟
> معمولا وقتی تعداد ستونها از سطر ها بیشتر میشه روش least square جواب نمیده
> چون anfis  هم ترکیبی از روش least square و شبکع عصبی هست


همون داده اصلی دیگه.
ماتریس 163 در 44 که ستون آخرش خروجی هست.
برات آپلود کرده بودم. به اسم data.2

----------


## rahnema1

نه دیگه مرحله به مرحله سایز ستون زیاد میشه اولش 5 بعد 10 و همین طور زیاد میشه
میخوام بدونم این خطا کدوم زمان رخ میده

----------


## coronaa

> نه دیگه مرحله به مرحله سایز ستون زیاد میشه اولش 5 بعد 10 و همین طور زیاد میشه
> میخوام بدونم این خطا کدوم زمان رخ میده


dataset7 با 33 ستون
این دیتا ست آخری بود. 10 تا ستون رو حذف کرد.

----------


## rahnema1

به احتمال زیاد دلیلش همین می تونه باشه 
یعنی کمتر شدن نسبت بین مشاهدات و متغیرها

----------


## coronaa

ضریب همبستگی رو کردم 99 درصد
الآن اینبار روی دیتاست 6 با 30 تا ستون خطا داد.
??? 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 101
TrainOutputs=round(evalfis(TrainInputs,fis));

----------


## coronaa

چه جالب!
هر چی ضریب همبستگی رو کمتر میکنم. تعداد دیتاست ها کمتر میشه.
مثلن با 50 درصد 3 تا دیتاست میسازه
با 5 و 10 و 13 ستون

----------


## rahnema1

باید هم همین طور بشه داده ها با هم همبستگی دارن اما اگه این همبستگی خیلی زیاد باشه مدل را خراب می کنه

----------


## coronaa

موقعی که خوب کار میکنه نهایتش تا 7 تا دیتاست میره با 33 ستون.

----------


## coronaa

آقا مرسی.به یه جاهایی رسیدم فعلن.

----------


## matcode.ir

سلام دوستان عزیز برای رفع مشکلات خودتون در مورد متلب می تونید به سایت مرجع متلب مراجعه کنید :*http://www.matcode.ir*

----------


## coronaa

اگه من 10 تا ماتریس داشته باشم از a1 تا a10 و بخوام توی 10 مرحله اینا رو از اکسل فراخونی کنم چطوره؟
به این صورت :
 TRR=xlsread('C:\a1.xlsx',1);
بعد دفعه بعد :
 TRR=xlsread('C:\a2.xlsx',1);
و الی آخر ...

----------


## rahnema1

به این صورت

for i=1:10
	TRR=xlsread(sprintf('C:\\a%d.xlsx',i),1);
end

----------


## coronaa

> به این صورت
> 
> for i=1:10
>     TRR=xlsread(sprintf('C:\\a%d.xlsx',i),1);
> end


نشد!
Warning: Invalid escape sequence appears in format string. See
help sprintf for valid escape sequences. 
??? Error using ==> xlsread at 219
XLSREAD unable to open file C:.
File C:\.xls not found.

----------


## rahnema1

این را امتحان کن

 TRR=xlsread(sprintf('C:/a%d.xlsx',i),1);

----------


## coronaa

> این را امتحان کن
> 
>  TRR=xlsread(sprintf('C:/a%d.xlsx',i),1);


نه همون قبلی درست تره!
اگه منظورت slash و back slash هست که همون اولی ولی با یکی درسته. مثل این :
TRR=xlsread(sprintf('C:\a%d.xlsx',i),1); 
ولی اصلن مشکل از یه جای دیگه هست.

----------


## rahnema1

جدا بنویسی هم فایده ای نداره؟ من توی octave انجام میدم مشکلی نیست.

for i=1:10
 reshte=sprintf('C:/a%d.xlsx',i);
 TRR=xlsread(reshte,1);
end

----------


## coronaa

> جدا بنویسی هم فایده ای نداره؟ من توی octave انجام میدم مشکلی نیست.
> 
> for i=1:10
>  reshte=sprintf('C:/a%d.xlsx',i);
>  TRR=xlsread(reshte,1);
> end


نه متاسفانه :
Warning: Invalid escape sequence appears in format string. See
help sprintf for valid escape sequences. 
??? Error using ==> xlsread at 219
XLSREAD unable to open file E:.
File E:\.xls not found.

----------


## coronaa

آقا حل شد.
مرسی
برای رشته باید از / استفاده بشه.
من اشتباه میکردم.

----------


## coronaa

مهندس ببخشید!
این برنامه ای که واسه نرمالیزه کردن نوشته بودی از چه روشی استفاده کردی؟
به استادم که گفتم وقتی داده ها نرمالیزه شد ، نتیجه شبکه بدتر شد.
گفت از چه تکنیکی استفاده کردی؟
مگه چند روش داریم؟

----------


## rahnema1

> مهندس ببخشید!
> این برنامه ای که واسه نرمالیزه کردن نوشته بودی از چه روشی استفاده کردی؟
> به استادم که گفتم وقتی داده ها نرمالیزه شد ، نتیجه شبکه بدتر شد.
> گفت از چه تکنیکی استفاده کردی؟
> مگه چند روش داریم؟


اومدیم از هر داده میانگین داده ها را کم کردیم و حاصل را تقسیم بر انحراف معیار کردیم
همچنین به علت اینکه بین بعضی متغیرها همبستگی بسیار زیاد بود اومدیم متغیرهایی که همبستگی بالای 90 درصد داشتند یکیشون را حذف کردیم

----------


## coronaa

> اومدیم از هر داده میانگین داده ها را کم کردیم و حاصل را تقسیم بر انحراف معیار کردیم
> همچنین به علت اینکه بین بعضی متغیرها همبستگی بسیار زیاد بود اومدیم متغیرهایی که همبستگی بالای 90 درصد داشتند یکیشون را حذف کردیم


برای نرمالیزه کردن روش های دیگه ای هم وجود داره؟
راستی، شما با روش های ترکیبی طبقه بندی داده ها هم کار کردین؟

----------


## rahnema1

میشه کاری کرد که داده ها بین صفر تا یک قرار بگیرن یا مثلا بین -1 و 1 قرار بگیرن
طبقه بندی ترکیبی چیه؟

----------


## coronaa

> میشه کاری کرد که داده ها بین صفر تا یک قرار بگیرن یا مثلا بین -1 و 1 قرار بگیرنطبقه بندی ترکیبی چیه؟


مثلن دو روش طبقه بندی رو که جدا میشه ازش استفاده کرد، بصورت ترکیبی استفاده میکنن تا جواب بهتری بگیرن.مثل ترکیب Kmeans با RBF و ...

----------


## coronaa

من یه دستوی رو اجرا میکنم به این صورت :
[IDX,c,sumD]= kmeans(Train,numnode);
که که هیچ موقع c نباید تهی بشه.
میخوام یه شرط بذارم که اگه c تهی بود یا صفر بود دوباره این دستور رو اجرا کن وگرنه ادامه بده.
باید چیکار کنم؟

----------


## rahnema1

c=[];
while (numel(c)==0 || c==0)
	[IDX,c,sumD]= kmeans(Train,numnode);
end

----------


## coronaa

> c=[];
> while (numel(c)==0 || c==0)
>     [IDX,c,sumD]= kmeans(Train,numnode);
> end


برنامه اجرا میکنه. مشکلی نداره ولی اون چیزی که میخواستم نشد. ینی هنوز جلوی اون خالی شدن رو نمیتونه بگیره؟
هنوز c بعضی موقع خالی میمونه. این پیغام رو میده :
??? Error using ==> kmeans>batchUpdate at 435
Empty cluster created at iteration 2.

----------


## rahnema1

فکر نکنم خالی بمونه این را اجرا کنید تا مشخص بشه که سایزش خالی نیست

c=[];
while (numel(c)==0 || c==0)
	[IDX,c,sumD]= kmeans(Train,numnode);
end
disp(c)

----------


## coronaa

> فکر نکنم خالی بمونه این را اجرا کنید تا مشخص بشه که سایزش خالی نیست
> 
> c=[];
> while (numel(c)==0 || c==0)
>     [IDX,c,sumD]= kmeans(Train,numnode);
> end
> disp(c)


وقتی که اون پیغام رو میده. حرف c رو توی command window میزنم خروجی به من اینو میده :
 c=[]
ینی هنوز خالیه دیگه!

----------


## rahnema1

توی راهنمای متلب نگاه کنید یک گزینه وجود داره به نام emptyaction که اگه اون را روی drop تنظیم کنید کلاسترهای اضافی حذف میشن در غیر این صورت گزینه پیش فرض روی error تنظیم شده که خطا میده

IDX=[];
while (numel(unique(IDX))<numnode)
 [IDX,c,sumD]= kmeans(Train,numnode, 'emptyaction','drop' );
end

----------


## coronaa

> توی راهنمای متلب نگاه کنید یک گزینه وجود داره به نام emptyaction که اگه اون را روی drop تنظیم کنید کلاسترهای اضافی حذف میشن در غیر این صورت گزینه پیش فرض روی error تنظیم شده که خطا میده
> 
> IDX=[];
> while (numel(unique(IDX))<numnode)
>  [IDX,c,sumD]= kmeans(Train,numnode, 'emptyaction','drop' );
> end


طیب الله  :))
من به شما ایمان دارم!
چطوری میشه بهترین c رو انتخاب کرد؟

----------


## rahnema1

> طیب الله  :))
> من به شما ایمان دارم!
> چطوری میشه بهترین c رو انتخاب کرد؟


من هم به شما ایمان دارم
اول به این آدرس یه نگاهی بیندازید. اگه به طور عادی نشد مجبورید با روشهای دیگه برید شاید تو هلپ متلب هم باشه
http://www.mathworks.com/help/stats/k-means-​clustering.html
با تکرار میشه بهترین حالت را پیدا کرد. یعنی چند بار ( مثلا اینجا 5 بار) اجرا می کنیم و بهترین انتخاب می کنیم

sumD=[];
c={};
IDX={};
for i=1:5
	IDX=[];
	while (numel(unique(IDX))<numnode)
		[IDX{i},c{i},sumD(i)]= kmeans(Train,numnode, 'emptyaction','drop' );
	end
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};

----------


## coronaa

> من هم به شما ایمان دارم
> اول به این آدرس یه نگاهی بیندازید. اگه به طور عادی نشد مجبورید با روشهای دیگه برید شاید تو هلپ متلب هم باشه
> http://www.mathworks.com/help/stats/...lustering.html
> با تکرار میشه بهترین حالت را پیدا کرد. یعنی چند بار ( مثلا اینجا 5 بار) اجرا می کنیم و بهترین انتخاب می کنیم
> 
> sumD=[];
> c={};
> IDX={};
> for i=1:5
> ...


میگه اون پیج وجود نداره.
برنامه رو اجرا میکنم این پیغام رو میده :
??? Comma separated list expansion has cell syntax for an array that
is not a cell.

Error in ==> rb12 at 48
        [IDX{i},c{i},sumD(i)]= kmeans(Train,numnode,
        'emptyaction','drop' );
به جای کاما، سمیکالن هم گذاشتم نشد.

----------


## rahnema1

sumD=[];
c={};
IDX={};
IDX0=[];
for i=1:5
    IDX=[];
    while (numel(unique(IDX0))<numnode)
        [IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
    end
    IDX{i}=IDX0;
    c{i}=c0;
    sumD(i)=sumD0;
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};

----------


## coronaa

> sumD=[];
> c={};
> IDX={};
> IDX0=[];
> for i=1:5
>     IDX=[];
>     while (numel(unique(IDX0))<numnode)
>         [IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
>     end
> ...


???  In an assignment  A(I) = B, the number of elements in B and
 I must be the same.

Error in ==> rb12 at 52
    sumD(i)=sumD0;

----------


## coronaa

c با numnode در ارتباطه.
پس اگه بخوام بهترین c رو انتخاب کنم باید numnode هم در بهترین حالت قرار داشته باشه دیگه.
درسته؟

----------


## rahnema1

sumD=[];
c={};
IDX={};
IDX0=[];
for i=1:5
    IDX=[];
    while (numel(unique(IDX0))<numnode)
        [IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
    end
    IDX{i}=IDX0;
    c{i}=c0;
    sumD(i)=sum(sumD0);
end
indexbest=find(sumD==min(sumD));
cBest=c{indexbest};

----------


## rahnema1

> c با numnode در ارتباطه.
> پس اگه بخوام بهترین c رو انتخاب کنم باید numnode هم در بهترین حالت قرار داشته باشه دیگه.
> درسته؟


بله توی اون لینکی که گذاشتم توضیح داده
مثلا توی همین حلقه for شما می تونید به تدریج numnode را از کم به زیاد افزایش بدید ببنید در کدام حالت مقدار sumD حداقل میشه

----------


## coronaa

مرسی جواب داد.
تعداد centerها کمتر شد ولی انگار درصد specificity پایین تر اومد!
ربطی به numnode داره؟
اینو چطوری باید بهینه انتخاب کنم؟

----------


## coronaa

ظاهرن تعداد numnode با cBest برابره.
خب اینطوری هرچی ما numnode رئ انتخاب کنیم همون میشه تعداد centerهامون دیگه!
اونوقت چطوری بهترین انتخاب میشه؟

----------


## coronaa

حالا اگه بخوام سنترها رو پلات کنم یه مشکلی پیش میاد.
IDX بصورت سلول هست.
این دستور رو واسه پلات میدم :
plot(Train(IDX==1,1),Train(IDX==1,2),'.','Color',[1 0 0]);
hold on;
plot(Train(IDX==2,1),Train(IDX==2,2),'.','Color',[0 0.7 0]);
plot(Train(IDX==3,1),Train(IDX==3,2),'.','Color',[0 0 1]);

plot(c(:,1),c(:,2),'kx','MarkerSize',12,'LineWidth  ',2);
plot(c(:,1),c(:,2),'ko','MarkerSize',12,'LineWidth  ',2);
این پیغام رو میده :
??? Undefined function or method 'eq' for input arguments of type
'cell'.

Error in ==> rb12 at 61
plot(Train(IDX==1,1),Train(IDX==1,2),'.','Color',[1 0 0]);

----------


## rahnema1

تست نکردم اما مقادیر بهینه را پیدا می کنه

cBest={};
IDXBest={};
SumDbest=[];
for j=1:40
sumD=[];
c={};
IDX={};
IDX0=[];
numnode=j;
for i=1:5
    IDX=[];
    while (numel(unique(IDX0))<numnode)
        [IDX0,c0,sumD0]= kmeans(Train,numnode, 'emptyaction','drop' );
    end
    IDX{i}=IDX0;
    c{i}=c0;
    sumD(i)=sum(sumD0);
end
SumDbest[j]=min(sumD);
indexbest=find(sumD==bestSum[j]);
cBest{j}=c{indexbest};
IDXBest{j}=IDX{indexbest};

end
indexbest=find(SumDbest==min(SumDbest));
c=cBest{indexbest};
IDX=IDXBest{indexbest};
numnode=indexbest;
disp(numnode)

----------


## coronaa

برای این خط خطا میده :
SumDbest[j]=min(sumD);

خطا :
??? Error: File: rb13.m Line: 59 Column: 9
Unbalanced or unexpected parenthesis or bracket.

----------


## coronaa

> برای این خط خطا میده :
> SumDbest[j]=min(sumD);
> 
> خطا :
> ??? Error: File: rb13.m Line: 59 Column: 9
> Unbalanced or unexpected parenthesis or bracket.


مهندس حل شد.
بجای براکت ، پرانتز گذاشتم.
فعلن اجرا میکنه

----------


## coronaa

درصدهایی که میگیرم بطور میانگین به این صورته :

 Mean of Sensitivity = 85.882353 
 Mean of specificity = 44.193548 
 Mean of accuracy = 66.000000
هنوز روی کلاس صفر مشکل دارم. خوب تشخیص نمیده!

----------


## rahnema1

یعنی چی روی کلاس صفر مشکل دارین؟

----------


## coronaa

> یعنی چی روی کلاس صفر مشکل دارین؟


همون چیزی که توی پیام خصوصی گفتم. تعداد 65 نمونه داده ی تست دارم. وقتی شبکه آموزش دید حالا باید این داده های تست روی شبکه تست بشه. یه سری کلاس یک هستن یه سری کلاس صفر. وقتی تست شد باید این نمونه ها رو طبقه بندی کنه دیگه. ینی اونایی که به کلاس 1 تعلق دارند قرار بده در کلاس 1 و همچنین برای کلاس صفر.برنامه ی من به تعداد داده ای که در کلاس صفر قرار دارند فقط 40 درصدش رو درست تشخیص میده. بقیه رو اشتباهی میبره کلاس 1واسه همین sensitivity بالاست همش ولی specificity پایینه.منظورم رو رسوندم؟

----------


## coronaa

من همزمان دارم رو دوتا برنامه RBF کار میکنم تا ببینم کدوم جواب بهتری میده.
اون برعکسه. تمام داده های تست رو میبره به کلاس صفر.
یعنی کلاً test output رو صفر میکنه.

----------


## coronaa

مشکل اول اینه که شما داده های آموزش (TRR) و تست (TEE) رو تصادفی انتخاب کردین.
داده های آموزش و تست من همونی هستن که فراخونی میشن. نباید دست بخورن. چون از قبل تقسیم بندی شدن.
فقط موقعی که میخوایم کل داده ها رو یکجا به شبکه بدیم با هم توی یه ماتریسی به اسم inputs قرار میدیم.

----------


## rahnema1

من بر اساس B.5.xlsx و M.5.xlsx عمل کردم حالا داخل TrainData%d.xlsx و TestData%d.xlsx چی هست خدا می دونه

----------


## coronaa

دستور roc رو کجای برنامه باید بنویسم؟

----------


## coronaa

> من بر اساس B.5.xlsx و M.5.xlsx عمل کردم حالا داخل TrainData%d.xlsx و TestData%d.xlsx چی هست خدا می دونه


من B.5 و M.5 رو از قبل گرفتم با هم قاطی کردم. طوری که 60 درصد داده های B و M در TRR قرار گرفتن و بقیه در TEE که به ترتیب داده های آموزش و تست هستن. پس من الآن باید randperm رو حذف کنم دیگه! درسته؟
به همون صورت قبلی باید باشه :
TrInd=randperm(98);    
 TR=[TRR(TrInd(1:98),:)];
 
   TeInd=randperm(65);    
 TE=[TEE(TeInd(1:65),:)];

 inputs=[ TR(:,1:end-1); TE(:,1:end-1)]';
 targets=[ TR(:,end); TE(:,end)]';

trainInputs = TR(:,1:end-1)';
trainTargets = TR(:,end)';

testInputs = TE(:,1:end-1)';
testTargets = TE(:,end)';
بقیه ی برنامه مشکل داره.

----------


## rahnema1

همون کدی که گذاشتم را روی b , m اعمال کن دیگه خیلی تغییر نده
این دستور هم وجود داره

[X,Y,T,AUC] = perfcurve(testTargets,testOutputs',1);

----------


## coronaa

خب اینو میده. حالا منظورش چیه از این؟
من باید sensitivity و ... رو در بیارم.
area under curve= 0.532336

----------


## rahnema1

این مقدار از 0.5 شروع میشه تا 1
مقدار نیم یعنی طبقه بندی داغونه
اگه بالای 0.8 باشه خوبه

----------


## rahnema1

Input را فراموش کرده بودم

inputs=data(Indx,1:end-1);

----------


## coronaa

> این مقدار از 0.5 شروع میشه تا 1
> مقدار نیم یعنی طبقه بندی داغونه
> اگه بالای 0.8 باشه خوبه


نه . متاسفانه این به دردم نمیخوره.
معیار ارزیابی نتایج شبکه من باید همون سه تا پارامتر باشه.
مهندس! مشکل من همون testoutputs هست که همه رو صفر میده. یعنی همه در کلاس صفر قرار میگیرن و دلیلش اینه که اندیس هایی که برای داده های تست انتخاب کردیم اشتباست. ینی 99:163 نباید باشه. باید بگیم در ماتریس inputs اندیسهایی که برای داده های تست هستن.
من اینو نمیدونم چطوری بهش بفهمونم.
testOutputs = round(((outputs(:,99:163))));

----------


## coronaa

> Input را فراموش کرده بودم
> 
> inputs=data(Indx,1:end-1);


اینو خودم گذاشته بودم.
در ضمن، الگوهای من باید روی ستونها باشن که گرفتم ترنسپوزشون کردم.

----------


## rahnema1

این هم یک آموزش خوب
http://lab.fs.uni-lj.si/lasin/wp/IMI...eminar8.pdf‎

----------


## coronaa

> این هم یک آموزش خوبhttp://lab.fs.uni-lj.si/lasin/wp/IMI...eminar8.pdf‎


مهندس شرمنده.میگه این فایل وجود نداره. میشه یه جایی آپلودش کنی؟ببخشید.

----------


## coronaa

سلام مهندس. شرمنده. باز یه سوال :
چطوری میتونم بین سطرها همبستگی ایجاد کنم؟

----------


## rahnema1

> سلام مهندس. شرمنده. باز یه سوال :
> چطوری میتونم بین سطرها همبستگی ایجاد کنم؟


سلام،دشمنت شرمنده
یعنی چی می خواهی همبستگی ایجاد کنی؟ و چه لزومی داره؟

----------


## coronaa

> سلام،دشمنت شرمنده
> یعنی چی می خواهی همبستگی ایجاد کنی؟ و چه لزومی داره؟


مثل همون برنامه ای که با corr نوشته بودی منتها اون واسه ستونها بود.
حالا من میخوام بین داده هایی که میدم یه برنامه همبستگی باشه که مثلن همونطور که قبلن گفتی اگه بالای 95 درص وابسته بودن سطرها رو حذف کنه. میخوام ببینم جواب بهتری میگیرم یا نه!

----------


## rahnema1

> مثل همون برنامه ای که با corr نوشته بودی منتها اون واسه ستونها بود.
> حالا من میخوام بین داده هایی که میدم یه برنامه همبستگی باشه که مثلن همونطور که قبلن گفتی اگه بالای 95 درص وابسته بودن سطرها رو حذف کنه. میخوام ببینم جواب بهتری میگیرم یا نه!


جواب بهتر گرفتن به هر قیمتی که درست نیست. شما با این کار ماهیت داده ها را دارید کلا تغییر می دهید. این روش درست نیست

----------


## coronaa

وقتی جواب بهتری میگیرم ینی داره خوب تشخیص میده. در ضمن ، من که نمیخوام نرمالیزه کنم!
فقط میخوام تعداد سطرهایی که 95 درصد شبیه هم هستن رو حذف کنم. 
حالا شما کدشو بگین چطوری میشه. امتحان کردنش ضرر نداره!

----------


## rahnema1

> وقتی جواب بهتری میگیرم ینی داره خوب تشخیص میده. در ضمن ، من که نمیخوام نرمالیزه کنم!
> فقط میخوام تعداد سطرهایی که 95 درصد شبیه هم هستن رو حذف کنم. 
> حالا شما کدشو بگین چطوری میشه. امتحان کردنش ضرر نداره!


این حرف کاملا اشتباهه. اگه باور نمی کنی از استادت بپرس. عزیز من یه کم دقت کن می خواهی چی کار کنی. می خواهی داده ها را تغییر بدی تا مطابق میل شما جواب بده؟ 
اصلا چرا این کار می کنی؟ یه سری داده های الکی درست کن که جواب خوب بده. اگه بلد نیستی راهش را بلدم. بعدش این را به جای داده های اصلی جا بزن:)

----------


## coronaa

> این حرف کاملا اشتباهه. اگه باور نمی کنی از استادت بپرس. عزیز من یه کم دقت کن می خواهی چی کار کنی. می خواهی داده ها را تغییر بدی تا مطابق میل شما جواب بده؟ 
> اصلا چرا این کار می کنی؟ یه سری داده های الکی درست کن که جواب خوب بده. اگه بلد نیستی راهش را بلدم. بعدش این را به جای داده های اصلی جا بزن:)


باشه . انجام نمیدم. حرف شما برام قبوله.
قبلن گفتم دیگه. به شما ایمان دارم  :))

----------

