رفتن به مطلب

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


ارسال های توصیه شده

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

 

کدی بنویسید که 3 ماتریس :

 

 

n = [ 1 0 1 1 ]

m = [ 2 4 2 1 ]

p = [ -1 3 1 1 ]

 

را بگیرید و عبارت z= an+bm را محاسبه کند و اینکار را تا جایی انجام دهد که حاصل e = p - z برابر صفر شود. یعنی باید b , a رو همینجور تست کنه تا عبارت E برابر 0 بشه .

 

 

 

پ ن : می دونم از دستور For با 4 بار تکرار درون دستور While باید استفاده شه .. ولی نمی دونم چه جور .

ممنون میشم دوستان کمک کنند . این مثال از خودمه اگر صورت سوال اشکال داره همون دستور for تنها باشه کافیه یعنی دیگه شرط تا جای تکرار کند که حاصل e صفر شودT نیاز نیست اگر با شرطه حل نمیشه حل نمیشه

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

 

کدی بنویسید که 3 ماتریس :

 

 

n = [ 1 0 1 1 ]

m = [ 2 4 2 1 ]

p = [ -1 3 1 1 ]

 

را بگیرید و عبارت z= an+bm را محاسبه کند و اینکار را تا جایی انجام دهد که حاصل e = p - z برابر صفر شود. یعنی باید b , a رو همینجور تست کنه تا عبارت E برابر 0 بشه .

 

 

 

پ ن : می دونم از دستور For با 4 بار تکرار درون دستور While باید استفاده شه .. ولی نمی دونم چه جور .

ممنون میشم دوستان کمک کنند . این مثال از خودمه اگر صورت سوال اشکال داره همون دستور for تنها باشه کافیه یعنی دیگه شرط تا جای تکرار کند که حاصل e صفر شودT نیاز نیست اگر با شرطه حل نمیشه حل نمیشه

 

 

سلام

اینجا 4 معادله دارین، 2 مجهول، احتمال اینکه جواب داشته باشه زیاد نیست. برای این ورودی ها هم جواب نداره:

 

clear;

n = [ 1 0 1 1 ]';
m = [ 2 4 2 1 ]';
p = [ -1 3 1 1 ]';

syms a b
z = a*n + b*m;
e = p - z

لینک به دیدگاه

سلام . گفتم که احتمالا صورت سوالم غلط باشه .اصلا پست اول رو فراموش کنید .

 

ماه یه ورودی داریم P و تابع هدف T

 

که با رابطه net = newp(p,t); با هم در ارتباط هستن .

و یه a هم داریم که از رابطه زیر بدست میاد:

a= sim(net,p)

a خروجیمون هست .

باید مقدار هدف منهای خروجی ها برابر 0 بشه یعنی e=t-a

 

و اینکار با تغییر در w و b باید انجام شه . و اگر 0 نشد باید

w1=s+e*p'

B1=b+e

کنیم تا 0 بشه .

 

در کل این یک سلول عصبی perceptron هست. اگر کمی آشنایی دارین کد زیر رو اجرا کنید تا متوجه بشین . تشکر

 

 

 

p=[ [1;0.1] [2;0.2] [0.1;0.3] [2;0.3] [0.2;0.4] [3;0.4] [0.1;0.5] [1.5;0.5] [0.5;0.6] [1.6;0.7]];
t=[ 1 1 0 1 0 1 0 1 0 0 ];
net = newp(p,t);
b=net.b{1};
w=net.IW{1,1} ;
while e==0
for b=10 , w=10
a= sim(net,p)
e = t-a
w1=w+e*p' 
B1=b+e
end
end
plotpv(p,t)
plotpc(w1 ,B1)

لینک به دیدگاه
سلام . گفتم که احتمالا صورت سوالم غلط باشه .اصلا پست اول رو فراموش کنید .

 

ماه یه ورودی داریم P و تابع هدف T

 

که با رابطه net = newp(p,t); با هم در ارتباط هستن .

و یه a هم داریم که از رابطه زیر بدست میاد:

a= sim(net,p)

a خروجیمون هست .

باید مقدار هدف منهای خروجی ها برابر 0 بشه یعنی e=t-a

 

و اینکار با تغییر در w و b باید انجام شه . و اگر 0 نشد باید

w1=s+e*p'

B1=b+e

کنیم تا 0 بشه .

 

در کل این یک سلول عصبی perceptron هست. اگر کمی آشنایی دارین کد زیر رو اجرا کنید تا متوجه بشین . تشکر

 

 

 

p=[ [1;0.1] [2;0.2] [0.1;0.3] [2;0.3] [0.2;0.4] [3;0.4] [0.1;0.5] [1.5;0.5] [0.5;0.6] [1.6;0.7]];
t=[ 1 1 0 1 0 1 0 1 0 0 ];
net = newp(p,t);
b=net.b{1};
w=net.IW{1,1} ;
while e==0
for b=10 , w=10
a= sim(net,p)
e = t-a
w1=w+e*p' 
B1=b+e
end
end
plotpv(p,t)
plotpc(w1 ,B1)

 

شبکه عصبی بلد نیستم.

 

برای اینکه کدتون اجرا بشه باید یه مقدار اولیه به e بدین. حلقه for کار خاصی انجام نمی ده، چون b فقط یه مقدار داره. اگه هم می خواین e صفرکنین، باید شرط while e~=0 باشه. b و w چجوری تغییر می کنن،اینجا هر دو یه مقدار دارن؟

لینک به دیدگاه

ممنون

رابطه a با p اینه:

 

a = f( w1p1+w2p2+b)

 

که f هر تابعی می تونه باشه که در اینجا hardlim هست.

 

به طور مثال : اگر

w1=1

w2=-1

b=0

در نظر بگیریم برای a1 خواهیم داست:( از ورودی p1 = 1 و p2 = 0.1 )

 

f(a1) = (1)(1)+(-1)(0.1)+0 = 0,9

 

چون تو تابع hardlim داریم:

 

1397290387.jpg

پس a1 برابر 1 هست (0.9 بزرگتر از 0 )

 

در نتیجه e1 = t1-a1 = 1-1 = 0 می شود .

 

جال ما 10 ورودی داریم و باید برای هر 10 تا طوری برنامه رو اکی کنیم که نتیجه همه e ها برابر 0 بشه . اینکار با تغییر در w ها و b انجام میشه.

 

w1 , b1 هم که تو کد نوشته شده همون جدید ها هستن .

 

به ما گفتن باید یه حلقه for تشکلی بدین که 10 بار تکرار شه و e رو صفر کنه و از اونجای که ممکنه w1 و b1 جدید برای مثلا e2 صفر بشه و e6 صفر نشه پس باید از یک حلقه while هم استفاده کنید و شرط بزارین که تا زمانی جلقه for ادامه بده که e ها رو همگی 0 کنه . یعنی بهترین w1 , b1 رو پیدا کنه

 

 

بببخشید توضیحات طولانی شد . نمی دونم منظورم متوجه شدین یا ن

 

 

 

این روهم بگم که کد های

b=net.b{1};

w=net.IW{1,1} ;

 

در ابتدا متلب خودش w و b رو حدسی می زاره و اگر که شرط برقرا نشد طبق رابطه w1 و b1 جدید بدست میاره و دوباره تکرار می کنه ببینه 0 میشن همگی با نه

لینک به دیدگاه
ممنون

رابطه a با p اینه:

 

a = f( w1p1+w2p2+b)

 

که f هر تابعی می تونه باشه که در اینجا hardlim هست.

 

به طور مثال : اگر

w1=1

w2=-1

b=0

در نظر بگیریم برای a1 خواهیم داست:( از ورودی p1 = 1 و p2 = 0.1 )

 

f(a1) = (1)(1)+(-1)(0.1)+0 = 0,9

 

چون تو تابع hardlim داریم:

 

1397290387.jpg

پس a1 برابر 1 هست (0.9 بزرگتر از 0 )

 

در نتیجه e1 = t1-a1 = 1-1 = 0 می شود .

 

جال ما 10 ورودی داریم و باید برای هر 10 تا طوری برنامه رو اکی کنیم که نتیجه همه e ها برابر 0 بشه . اینکار با تغییر در w ها و b انجام میشه.

 

w1 , b1 هم که تو کد نوشته شده همون جدید ها هستن .

 

به ما گفتن باید یه حلقه for تشکلی بدین که 10 بار تکرار شه و e رو صفر کنه و از اونجای که ممکنه w1 و b1 جدید برای مثلا e2 صفر بشه و e6 صفر نشه پس باید از یک حلقه while هم استفاده کنید و شرط بزارین که تا زمانی جلقه for ادامه بده که e ها رو همگی 0 کنه . یعنی بهترین w1 , b1 رو پیدا کنه

 

 

بببخشید توضیحات طولانی شد . نمی دونم منظورم متوجه شدین یا ن

 

 

 

این روهم بگم که کد های

b=net.b{1};

w=net.IW{1,1} ;

 

در ابتدا متلب خودش w و b رو حدسی می زاره و اگر که شرط برقرا نشد طبق رابطه w1 و b1 جدید بدست میاره و دوباره تکرار می کنه ببینه 0 میشن همگی با نه

 

p و t مشخصه، از روشون net رو بدست میارین، بعد هم b و w. بعد از این دقیقا می خواین چکار کنین؟ داخل حلقه ها چه اتفاقی میفته؟ a همیشه ثابت هست، چون اینجوری که نوشتین ورودی های sim تغییر نمیکنه که a تغییر کنه؟ چجوری e صفر بشه وقتی a و t تغییر نمی کنن؟

لینک به دیدگاه

p , t مشخصه یعنی داده ها هستن ، net این دو تا رو به هم ربط میده .

a به b و w بستگی داره طبق همون رابطه ای که نوشتم . a = f( w1p1+w2p2+b)

پس زمانی که هر کدوم از w ها یا b تغییر کنه a نیز تغییر می کنه که یا 1 هست یا 0 .. طبق پست قبل که توضیح دادم.

با تغییر aچون t ثابت هست پس :e = t-a هم تغییر می کنه

نکته : مقدار a یا 1 هست یا 0 - طبق تایعی که تو پست قبل گفتم -

مقدار t هم که داده شده یا 0 هست یا 1

 

حالا ما می خوایم b و W رو اعدادی بزاریم که a1 ....a10 رو طوری بدست بیاره که e1...e10 = 0 بشه

 

 

یعنی مثلا ابتدا متلب w1 , w2 , b رو خودش میزاره

بعد e1...e10 رو محاسبه می کنه می بینه که بعضی هاش 0 نمیشن بعد میاد دوباره طبیق رابطه زیر که براش تعریف کردیم:

 

w(new) = w1 + e*p'

b(new) = b+e

 

جدید میسازه و دوباره e1...e10 رو محاسبه می کنه .. اینکار رو باید ادامه بده تا w1 , w2 و b پیدا کنه که همه e ها رو 0 کنه .

 

a که گفتین ثابته نه ثابت نیست چون این sim همون تایع هست که به b و w ها بستگی داره .

لینک به دیدگاه
p , t مشخصه یعنی داده ها هستن ، net این دو تا رو به هم ربط میده .

a به b و w بستگی داره طبق همون رابطه ای که نوشتم . a = f( w1p1+w2p2+b)

پس زمانی که هر کدوم از w ها یا b تغییر کنه a نیز تغییر می کنه که یا 1 هست یا 0 .. طبق پست قبل که توضیح دادم.

با تغییر aچون t ثابت هست پس :e = t-a هم تغییر می کنه

نکته : مقدار a یا 1 هست یا 0 - طبق تایعی که تو پست قبل گفتم -

مقدار t هم که داده شده یا 0 هست یا 1

 

حالا ما می خوایم b و W رو اعدادی بزاریم که a1 ....a10 رو طوری بدست بیاره که e1...e10 = 0 بشه

 

 

یعنی مثلا ابتدا متلب w1 , w2 , b رو خودش میزاره

بعد e1...e10 رو محاسبه می کنه می بینه که بعضی هاش 0 نمیشن بعد میاد دوباره طبیق رابطه زیر که براش تعریف کردیم:

 

w(new) = w1 + e*p'

b(new) = b+e

 

جدید میسازه و دوباره e1...e10 رو محاسبه می کنه .. اینکار رو باید ادامه بده تا w1 , w2 و b پیدا کنه که همه e ها رو 0 کنه .

 

a که گفتین ثابته نه ثابت نیست چون این sim همون تایع هست که به b و w ها بستگی داره .

 

a چجوری تغییر می کنه وقتی net و p ثابت هستن، شما b و w جدیدی که به sim نمی دین. می تونین امتحان کنین، مثلا b رو تغییر بدین، ببینین خروجی تغییر می کنه.

 

شاید مقادیرشون رو باید توی net تغییر بدین:

net.b{1} = b1;

لینک به دیدگاه

انی کد رو در متلب امتحان کنید:

 

p=[ [1;0.1] [2;0.2] [0.1;0.3] [2;0.3] [0.2;0.4] [3;0.4] [0.1;0.5] [1.5;0.5] [0.5;0.6] [1.6;0.7]];
t=[ 1 1 0 1 0 1 0 1 0 0 ];
net = newp(p,t);
net.b{1} =  [0]
net.IW{1,1}=[1,-1] ;
a= sim(net,p);
e= t-a
plotpv(p,t)
plotpc(net.IW{1,1},net.b{1})

 

فک کنم من بد توضیح می دم . به شکل هم توجه کنید .. بهید طوری اون خط بدست بیاد که دو شکل مجزا رو از هم جدا کنه

لینک به دیدگاه
انی کد رو در متلب امتحان کنید:

 

p=[ [1;0.1] [2;0.2] [0.1;0.3] [2;0.3] [0.2;0.4] [3;0.4] [0.1;0.5] [1.5;0.5] [0.5;0.6] [1.6;0.7]];
t=[ 1 1 0 1 0 1 0 1 0 0 ];
net = newp(p,t);
net.b{1} =  [0]
net.IW{1,1}=[1,-1] ;
a= sim(net,p);
e= t-a
plotpv(p,t)
plotpc(net.IW{1,1},net.b{1})

 

فک کنم من بد توضیح می دم . به شکل هم توجه کنید .. بهید طوری اون خط بدست بیاد که دو شکل مجزا رو از هم جدا کنه

 

خب اینجا دو تا از پارامترهای net رو تغییر دادین، توی هر حلقه باید این پارامترها (b و IW) تغییر کنن؟

b اولیه یه مقدار داره، ولی b1ی که حساب می کنین هم اندازه e میشه، 10 مقدار داره، مشکلی پیش نمیاد؟

لینک به دیدگاه

اره باید تو هر حلقه تغییر کنند به طوری که در اخر به عددهایی براشون برسیم که e رو 0 کنند

نه فک نکنم مشکلی پیش باید اگر B هم 10 تا باشه.. البته در کل باید b یه دونه باشه

 

اگر تو همین کد قبل نگاه کنید می بینید که a هیچ کاری نمی کنه به نتیجه شکل در حقیقت a رو برای این معرفی کردیم که بتونه e رو 0 کنه

لینک به دیدگاه

در حقیقت متلب میاد طبق

net.b{1}

net.IW{1,1{

 

اگر براشون چیزی تعریف نکرده باشیم حدسی اعدادی می زاره و بعد حساب می کنه ببینه برای همه ورودی ها E برابر 0 میشه یا نه

اگر دید 0 نمیشه طبق رابطه

 

W=net.IW{1,1{+e*p'

B = net.b{1}+e

 

b و w جدید می سازه و باز برای تمام ورودی ها بررسی می کنه . وباید تا جایی ادامه بده که wو b پیدا کنه تا همه e ها رو 0 کنه

 

نکته : الان متوجه شدم وقتی e باید 0 بشه پس

B = net.b{1}+e

B هم برابر net.b{1} هست دیگه انگار b هم ثابت اولیه هست

لینک به دیدگاه
اره باید تو هر حلقه تغییر کنند به طوری که در اخر به عددهایی براشون برسیم که e رو 0 کنند

نه فک نکنم مشکلی پیش باید اگر B هم 10 تا باشه.. البته در کل باید b یه دونه باشه

 

اگر تو همین کد قبل نگاه کنید می بینید که a هیچ کاری نمی کنه به نتیجه شکل در حقیقت a رو برای این معرفی کردیم که بتونه e رو 0 کنه

 

در حقیقت متلب میاد طبق

net.b{1}

net.IW{1,1{

 

اگر براشون چیزی تعریف نکرده باشیم حدسی اعدادی می زاره و بعد حساب می کنه ببینه برای همه ورودی ها E برابر 0 میشه یا نه

اگر دید 0 نمیشه طبق رابطه

 

W=net.IW{1,1{+e*p'

B = net.b{1}+e

 

b و w جدید می سازه و باز برای تمام ورودی ها بررسی می کنه . وباید تا جایی ادامه بده که wو b پیدا کنه تا همه e ها رو 0 کنه

 

نکته : الان متوجه شدم وقتی e باید 0 بشه پس

B = net.b{1}+e

B هم برابر net.b{1} هست دیگه انگار b هم ثابت اولیه هست

 

 

مقادیر اولیه b و IW به ترتیب 0 و [0و0] هست.

چرا شرایطی که برای b گرفتین، که میگین ثابت میمونه برای w پیش نمیاد.

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

لینک به دیدگاه

ببینین حلقه ی زیر انقدر ادامه پیدا میکنه تا تمام درایه های e برابر صفر بشه. all هم وقتی تمام درایه های بردار غیر صفر باشه، خروجی یک میده:

 

clear
e = [4 7 6];
while ~all(e==0)
   e(e>0) = e(e>0) - 1;
   disp(e)
end

 

برای سوال خودتون هم یه همچین کدی باید بنویسین. برای نوشتن کدش هم، قبلش باید سوال رو کامل متوجه شده باشین. کد زیر جواب نمیده، چون تمام درایه های e همزمان صفر نمیشن ولی شاید کمک بکنه:

 

clear
p=[ [1;0.1] [2;0.2] [0.1;0.3] [2;0.3] [0.2;0.4] [3;0.4] [0.1;0.5] [1.5;0.5] [0.5;0.6] [1.6;0.7]];
t=[ 1 1 0 1 0 1 0 1 0 0 ];
net = newp(p,t);
b=net.b{1};
w=net.IW{1,1} ;
e = 1;
n = 0;
while ~all(e==0)
   a = sim(net,p);
   e = t-a;
   w1 = w+e*p'
%     b1 = b+e;
   net.b{1} =  b;
   net.IW{1,1}= w1 ;
   n = n+1;
end
plotpv(p,t)
plotpc(w1 ,b)

لینک به دیدگاه

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...