شبکه عصبی RBF چیست ؟

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

معماری شبکه :

شبکه های RBF معمولا شامل سه لایه هستن :  لایه ی ورودی، لایه ی مخفی با یه تابع فعالیت RBF غیرخطی و لایه ی خروجی

 ورودی می تونه به عنوان یه بردار از اعداد حقیقی مدل بشه و خروجی این شبکه یه تابع scalar از بردار ورودی هستش که به صورت زیر محاسبه میشه :

که N تعداد نرونهای لایه ی مخفی، بردار مرکز نرون i و  وزن نرون i در نرون خروجی خطی هستش.

آموزش :

شبکه های RBF معمولا به وسیله ی یک الگوریتم دو مرحله ای آموزش داده میشن. در مرحله ی اول، بردارهای مرکز  برای توابع RBF در لایه ی مخفی انتخاب میشن. این مرحله رو میشه با چندین روش اجرا کرد : میشه مراکز رو به شکل تصادفی از برخی مجموعه مثالها نمونه برداری کرد، یا میشه از K-means clustring بهره برد.توجه داشته باشین که این مرحله بدون نظارته ( unsupervised).

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

یه سورس کد از شبکه عصبی RBF هم واستون قرار دادم ، میتونین از لینک زیر دانلود کنین : 

سورس کد RBF در متلب

 

 

 

آموزش الگوریتم های clustering در متلب

سلام دوستای عزیزم

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

دانلود آموزش

 

-----------------------------------------------------------------------------------------------------------------------

دِلـــم چـِـه کــودکــانــه بَهــانــه ی تــو را میگیـــرد،
امـــا تــو بـــزرگـــانــه بِــه دِل نگیـــر…
فقـــط بگــــو : کــــودکـــ استـــ، نـِـمی فهمــد

 

آموزش شبکه عصبی در متلب


سلام  دوستای گلم

تو این جلسه می خوام در مورد شبکه عصبی مصنوعی بحث کنم.اصلا شبکه عصبی مصنوعی چیه؟ خوب شبکه عصبی طبیعی چیه که حالا می خوای در مورد مصنوعیش بحث کنی ؟ آره آفرین طبیعیش میشه همون شبکه ی اعصاب انسان ، می گن مغز انسان از تعداد 10 11 نرون تشکیل شده که هر نرون با تقریبا 104 نرون دیگه ارتباط داره.

سرعت سوئیچنگ نرونها در حدود 10-3 ثانیه است که در مقایسه با کامپیوترها 10 -10 ثانیه خیلی ناچیزه. با این وجود من می تونم در 0.1 ثانیه تصویر تو رو بازشناسائی کنم. این قدرت فوق العاده باید از پردازش موازی توزیع شده در تعدادی زیادی از نرونها باشه. خداییش عجب سیستمیه واقعا ایول ، دمش گرم !

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

به طور کلی یه شبکه عصبی به وسیله ی موارد زیر تعیین می شه:

1- الگوی ارتباط بین نرون های شبکه ، که بهش معماری شبکه یا توپولوژی شبکه می گیم ( می تونه تک لایه باشه ، دو لایه ، سه لایه و ...)

2- روش تعیین وزن های شبکه ، که بهش آموزش شبکه (training) ، ( learning) یا الگوریتم شبکه می گیم.

این وزن که داخل مورد 2 گفتم یعنی چی ؟ هر پیوند ارتباطی یه وزن مربوط به خودشو داره که داخل یه شبکه عصبی تو سیگنالی که می خواد ارسال بشه ضرب میشه. ببین تو سیستم اعصاب آدما هم مفهوم وزن به صورتیه که اگه فرض کنی این یه نرون طبیعی باشه :

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

توابع فعالیت :

تو بعضی کتابها بهش توابع خروجی هم می گن. 1- تابع همانی ( تابع خطی f(x)=x ) 

2 - تابع پله ی دودویی با آستانه ی ϴ ، یعنی چی ؟ یعنی اگه x از مقدار ϴ بزرگتر و مساوی باشه خروجی 1 میشه در غیر این صورت میشه 0

3 - تابع پله ی دو قطبی با آستانه ی ϴ ، که اگه x بزرگتر و مساوی ϴ باشه خروجی 1 میشه و در غیر این صورت منفی 1 میشه.

بازم داریم از این توابع اما حسش نیست توضیح بدم !! 

یه نکته ی مهم : bias (بایاس) یه بایاس دقیقا مثل یه وزن اتصال از واحدی عمل می کنه که خروجی اون همیشه 1 هست.

بایاس همیشه مثل یه وزن عمل می کنه .

Perceptron :

نوعی از شبکه عصبی برمبنای یه واحد محاسباتی به نام پرسپترون ساخته میشه. یه پرسپترون برداری از ورودیها با مقادیر حقیقی رو می گیره و یه ترکیب خطی از این ورودیها رو محاسبه میکنه. اگه حاصل از یه مقدار آستانه بیشترباشه خروجی پرسپترون برابر با 1 و در غیر اینصورت معادل -1 خواهد بود.

این پرسپترون بلا رو مسائلی که خطی یا تفکیک پذیر خطی باشن عمل می کنه ، یعنی چی ؟ این نمودار رو ببین :

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

آخه این رو چه شکلی تفکیک خطی کنیم؟ با تفکیک غیر خطی !!

پرسپترون می تونه تمام توابع بولی مثل AND وOR و NAND و NOR پیاده سازی کنه اما XOR رو نه !! و اینجاست که بحث لایه های مخفی پیش می یاد.اصلا بد نیست بدونی زمانی که واسه ی اولین بارموضوع شبکه های عصبی مصنوعی و پرسپترون ها پیش اومد و این که دیدن نمی شه مسائل غیر خطی رو باهاش حل کرد ، حدود 10 سال شبکه های عصبی مصنوعی فراموش شد تا این که دو مرتبه با ایده ی لایه های مخفی ، از سر گرفته شد.( آخی چه سرنوشتی داشته !! )

اولین چیزی که باید بهش توجه کنی : ورودی های مسئله ست ، ببین ورودیها حتما باید به شکل یه ماتریس n سطری با 1 ستون باشن.حالا اگه این طوری نبود چی ؟ یعنی من یه ماتریس ورودی به صورت l*k داشتم اون موقع چی کار کنم ؟ خوب تبدیلش کن دیگه !

بعد از این که ورودی هات آماده شدن حالا وقتشه ماتریس الگو (P) و ماتریس هدف (t) رو مشخص کنی . واسه ماتریس p همون ورودی هات رو که مثلا ماتریس a1 تا an هستند قرار می دی چه طوری ؟ P=[a1 a2 a3 ……an ]

ماتریس هدف همونه که می خوایم از مسئله داشته باشیم مثلا واسه AND اگه ورودی هام 1 و 1 باشه خوب می خوام خروجیم 1 باشه. توجه کن تعداد درایه های ماتریس P و t باید یکی باشه. t=[1 0 1 ……1]

حالا ورودی ها ، ماتریس هدف و ماتریس الگو آماده ست وقت اینه که شبکه رو بسازیم ، چه شکلی ؟ با دستور newff

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

Net=newff(محدوده ی ماتریس ورودی ,[تعداد نرون های لایه ها ] ,تابع فعالیت , …)

ما به تعداد لایه ها ، تابع فعالیت داریم ، آخه تابع فعالیت تو هر لایه از یه نوعه .اصلا بزار یه مثال واست بزنم :

net=newff(minmax(p),[2 2],{' logsig’ ‘logsig'},trainlm);

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

بعد از این که شبکه مونو ساختیم باید آموزشش بدیم . خوب این آموزش که می گی یعنی چی ؟ روش تعیین وزن های یه شبکه رو بهش می گن آموزش شبکه ی عصبی . خوب با چه دستوری این کار رو انجام بدم؟ با تابع train

net=train( net,p,t)

حالا که وزن های شبکه معلوم شد باید بتونی شبکه رو اجرا کنی تا خروجی های اون بدست بیاد. با کدوم دستور میشه این کار رو کرد؟ با تابع sim

Out=sim( net , p)

مثلا می تونی با یه سری از دستورات بعضی پارامتر ها رو تغییر بدی ، مثل ...

net.trainparam.epochs=50

می دونی epochs چیه؟ توی یه الگوریتم یادگیری یه سیکل یا یه اعمال بر روی تمام بردار های آموزشی اصطلاحا یه epochs می گن.حالا تو این دستور گفتم می خوایم حداکثر مقدارش 50 باشه.

اگه بخوایم به یه مقدار حداقل خطا برسم از این دستور استفاده می کنم :

net.trainparam.goal=0.001

یه کد کوچولو با اجراش رو مشاهده می کنین :