رفتن به مطلب

برنامه ای کوچک برای میانیابی و رگرسیون خطی به همراه سورس برنامه(ویژال بیسک 6)


AtAgAmEr
 اشتراک گذاری

Recommended Posts

  • کاربر ویژه

سلام

 

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

 

کسانیکه از این رشته اطلاعات دارن میدونن که 90% کارمون با داده های آماری هستش ، توی کلاس می دیدم که خیلی از دانشجوها برا کار با اکسل و ماشین حساب دچار مشکل میشدند ( البته بچه های آمار و فنی مشکلی نبود براشون ) - دیشب زد سرم یه برنامه برا اینکار بزنم - قبلاً توی اکسل درست کرده بودم ولی بازم ندانسته میزدن خراب می کردن

 

توضیحات :

 

 

 

 

میانیابی خطی :

 

 

 

با نگاه به شکل زیر ، میشه گفت که منظور ما از این روش ساده پیدا کردن مقدار Y هستش ولی زمانی که X ما دارای یک مقدار مشخص باشه

 

 

خوب و اما می ریم برا کد نویسی ( توجه :  در کد نویسی خبری از رعایت RAD - RUP - MVC - XP و از این چیزا نیستش - یعنی هر مدلی خواستم نوشتم و نتیجه داده :wub: )

 

بر روی فرم خود 6 تا Text.box ایجاد می کنیم به همراه 2 عدد دکمه که یکی برای محاسبه و دیگری برای پاک کردن فیلدها هستش و برای هر Text.box هم یک Label ایجاد میکنیم و مطابق شکل زیر عنوان دهی می کنیم

 

 

برای اینکه بعد از نوشتن در Text.box بتونیم با زدن کلید Enter به Text.box بعدی بریم ، بر روی تک تک Text.Box ها دبل کلیک کرده و در قسمت کد نویسی برنامه Event مربوطه را انتخاب می کنیم که اونم KeyPress هستش ( در اینجا بر روی Text1.text این عمل انجام گرفته )

 

 

و بعد این کد رو می نویسیم

 

(Private Sub Text1_KeyPress(KeyAscii As Integer


If KeyAscii = "13" Then

 

If Len(RTrim(Text1.Text)) = 0 Or Len(LTrim(Text1.Text)) = 0 Then
GoTo azaval:
End If

Text4.Enabled = True
Text4.SetFocus
End If

 

:azaval

End Sub

 

خوب این عدد 13 چیه ؟؟؟  این به برنامه میگه هر موقع در فیلد مربوط به  Text1.Box کلیدی زده شده کنترل کن ببین که آیا این کلید زده شده کاید Enter هستش یا نه - اگه بود این کارها رو انجام بده :

 

1- کنتزل کن اگر کاراکتری نوشته نشده باشه به مرحله 2 ( که در زیر نوشتم ) نرو ( حتی اگر فضای خالی وجود داشته باشه )

2- فیلد مربوط به Text4.Box رو در حالت فعال قرار بده ( برای اینکه کاربر نتونه همون ابتدای برنامه بدون اینکه عددی وارد کنه و بیاد سروقت Text.Box بعدی ، غیرفعالش میکنیم تا کاربر با وارد کردن عدد و زدند کلید Enter بتونه به فیلد بعدی بره )

3- علامت چشمک زن ( cursor ) به فیلد بعدی که در اینجا Text4.text هستش منتقل کن

 

خوب کار ((Len(RTrim(Text1.Text چیه ؟

میاد طول کاراکترها رو می خونه و فضای خالی از سمت راست رو حذف میکنه - یعنی اینکه شما یه چیزی نوشتین بعد اومدین کلید SpaceBar  رو زدین ، این دستور اون Space های زده شده شما رو حذف میکنه و LTrim هم برای سمت چپ همین کارو رو انجام میده

 

 

================================================================================================

 

این کد نویسی رو برای همه Text.Box ها انجام میدیم

 

================================================================================================

 

محاسبه میانیابی :

 

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

 

Private Sub Command1_Click()
Text5.Text = ((Text2.Text - Text1.Text) * (Text6.Text - Text4.Text) / (Text3.Text - Text1.Text)) + Text4.Text
End Sub
 

که در اینجا X همان Text2.Text و Y همان  Text6.Text هستش

 

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

 

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

 

رگرسیون خطی :

 

واژه رگرسیون به معنای برگشت هستش و نشان می دهد که مقدار یک متغییر به متغیر دیگری برمیگردد .

این واژه توسط فرانسیس گالتن در سال 1877 به کار برده شد .

 

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

 

فرض می کنیم که دوسری داده داریم

 

که مقدار داده های X شامل :

 

 

1026.9 1021.8 1019.4 1016.8 1012.8 1006.3

 

و مقدار داده های Y شامل :

 

 

1017.3 1013.7 1009.5 1007.2 1004.1 997.9

 

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

 

پیدا کردن مجموع X ها و Y ها - توان 2 مجموع آنها - مجموع حاصل ضرب آنها - ( n  تعداد داده ها هستش که در این مثال 6 هستش )

 

Σx - Σy- Σx2- Σy2-Σxy

 

Sxx = Σx2 − (Σx)2/n

 

Sxy = Σxy (Σx)(Σy)/n

 

Syy = Σy2 − (Σy)2/n

 

تا اینجا که ساده هستش

 

می دونیم که فرمول خطی رگرسیون ساده برابر y=a+bx هستش

 

خوب حالا باید a و مقدار b رو حساب کنیم

 

b = Sxy/Sxx

(a = (Σy/n) − b (Σx/n

 

حال نوبت محاسبه  R2 هستش : فرمولش برابر : R2 = SSR/SST

 

پس باید مقدار SSR و SST رو بدست بیاریم ( مجموع مربعات کل و رگرسیون )

 

SSE = Syy – bSxy

 

SSR = SST – SSE

 

SST = (y Σy)2 = Syy

 

به همین شکل اینم بدست میاد /

 

 

در برنامه هم برای وارد کردن مقادیر X ها  و Y ها ، 2 عدد ListBox قرار داده شده که ListBox اولی از سمت چپ برای X ها  و ListBox بعدی ( اولی از سمت راست ) برای مقادیر Y ها هستش که کاربر با وارد کردن عدد در Text.Box های 8 و 7 در برنامه و زدن کلید Enter عدد وارد لیست مربوطه میشه

 

کد مربوطه :

 

Private Sub Text8_KeyPress(KeyAscii As Integer)
If KeyAscii = "13" Then

List1.AddItem Text8.Text
Text8.Text = Empty
Text8.SetFocus

End If


End Sub

 

عدد 13 رو که فهمیدیم کارش چیه و اما خط بعدی ، مقدار Text8.Text رو وارد لیست 1 میکنه که همون مقادیر X ها هستش

و بعد Text.Box رو خالی میکنه و دستور Text8.SetFocus چشمک زن ماوس رو دوباره به Text.Box منتقل میکنه برای دریافت مقدار بعدی

 

****  کد برای مقادیر Y ها هم مشابه بالاست ****

 

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

 

Private Sub List1_Click()
List1.RemoveItem List1.ListIndex
End Sub
 

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

 

توی کد های برنامه ممکن هستش بگین List1.ListCount چه کاری انجام میده ؟؟ تعداد داده های موجود در لیست 1 رو برامون نشون میده

 

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

 

 

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

 

 

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

 

 

برنامه اجرایی

 

سورس برنامه به زبان ویژوال بیسیک 6

ویرایش شده توسط atagamer
لینک به دیدگاه
Share on other sites

  • 2 هفته بعد...
  • کاربر ویژه

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

 

این عکس

 

 

اینم خود برنامه ( بعد از اکسترکت حتماً پوشه data را در درایو C کپی کنید )

 

 

 

در ویندوز 7 و 8 از طریق Run As Administratot استفاده کنید در غیر این صورت نمودار نشان داده نخواهد شد

در آفیس 2007 پیغام مبنی بر اینکه حداکثر نفاط انتخاب شده برای نمودار 2 بعدی 32000 می باشد

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

اینصورت فایل اکسل را که در پوشه data قرار دارد باز کرده و محدوده انتخاب شده در

نمودار رو از 60000 ( آفبس 2010 ) بر روی 30000  تنطیم کتید

محل تنطیم بر اساس این عکس

 

 

===========================================

 

مشکلی در برنامه بود حتماً اطلاع بدین بهم / ممنون

 

============================================

ویرایش شده توسط atagamer
لینک به دیدگاه
Share on other sites

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

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

مهمان
ارسال پست در این تاپیک...

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

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

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

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

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

 اشتراک گذاری

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