You are on page 1of 4

‫به نام خدایی که بیدریغ ستّار العیوب است‪...

‬‬

‫مؤلف‪ :‬سجّاد رحمانی‬

‫هرگونه کپی برداری غیرقانونی و حرام است و هیچ گونه رضایت مولف را در بر ندارد‬

‫تمرین سری ‪5‬‬


‫‪ -1‬اگر نیاز باشد در سوالی از پایتون استفاده نکنید‪ ،‬صراحتاً بیان میشود‪.‬‬

‫‪ -2‬ممکن است در جواب بعضی سواالت نیاز باشد بگویید با خطا مواجه میشویم و توضیح دهید‪[ .‬پس لزوماً قرار‬
‫نیست چیزی که خواسته شده واقعاً صحیح باشد]‬

‫پس تاکید مجدد‪ :‬اگر جایی با خطا مواجه میشه‪ ،‬کامل توضیح بدید [کاملِ کامل!]‬

‫‪ -3‬در هیچ جای این تمرین حق ندارید از مطالبی استفاده کنید که ما آموزش ندادیم‪.‬‬

‫متن سوال‬ ‫شماره‬


‫در این سوال میتوانید از پایتون استفاده کنید‬ ‫‪2‬‬
‫عدد ‪ 1‬را در نظر بگیرید‪ .‬میخواهیم این عدد را آنقدر تقسیم بر ‪ 2‬بکنیم که عددی کوچک مانند ‪ ‬شود‬
‫(همان ‪ ‬که پایتون در نظر میگیره منظورمون هست)‪.‬‬
‫چندبار نیاز است این تقسیم بر ‪ 2‬کردن انجام شود؟ (برنامهای بنویسید که این تعداد دفعاتی که باید عدد‬
‫تقسیم بر ‪ 2‬شود را چاپ کند)‬
‫حل‪:‬‬
‫‪import sys‬‬

‫‪eps=sys.float_info.epsilon‬‬

‫‪# dividing till reaching epsilon‬‬


‫‪number=1‬‬
‫‪i=0 # iteration counter‬‬
‫‪while number>eps:‬‬
‫‪number=number/2‬‬
‫‪i+=1‬‬
‫‪else:‬‬
‫))‪print("Number of iterations: {}".format(i‬‬

‫در این سوال میتوانید از پایتون استفاده کنید‬ ‫‪3‬‬


‫مقادیر ‪ x‬و ‪ y‬را در نظر بگیرید‪:‬‬
‫میخواهیم یک رگرسیون خطی ساده بر این دادهها برازش دهیم‪.‬‬ ‫‪X‬‬ ‫‪Y‬‬
‫یادآوری از آمار‪ :‬در معادلهی رگرسیونی خطی ساده به فرم زیر‪:‬‬ ‫‪1‬‬ ‫‪16‬‬
‫‪Y =  0 + 1X1‬‬ ‫‪0‬‬ ‫‪9‬‬
‫برآورد ضرایب به صورت زیر است‪:‬‬ ‫‪2‬‬ ‫‪17‬‬
‫‪S‬‬ ‫‪0‬‬ ‫‪12‬‬
‫‪b1 = ˆ1 = XY‬‬
‫‪SXX‬‬ ‫‪3‬‬ ‫‪22‬‬
‫‪b = ˆ = Y − b X‬‬
‫‪0‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪13‬‬
‫که در آن‪:‬‬ ‫‪0‬‬ ‫‪8‬‬
‫‪n‬‬ ‫‪n‬‬
‫‪1‬‬ ‫‪15‬‬
‫‪X‬‬ ‫‪i‬‬ ‫‪Y‬‬ ‫‪i‬‬
‫=‪X‬‬ ‫‪i =1‬‬
‫=‪Y‬‬ ‫‪i =1‬‬ ‫‪2‬‬ ‫‪19‬‬
‫‪n‬‬ ‫‪n‬‬ ‫‪0‬‬ ‫‪11‬‬
‫‪SXY‬‬ ‫‪=  XiYi − nXY‬‬ ‫‪SXX‬‬ ‫‪=  Xi2 − nX 2‬‬
‫‪i‬‬ ‫‪i‬‬

‫حال شما باید توابعی بنویسید که ‪ x‬و ‪ y‬را به ترتیب به عنوان ورودی بگیرند و موارد زیر را انجام دهند‪.‬‬
‫الف) تابعی که معادله رگرسیونی را چاپ کند (اسم تابع را ‪ fit‬بگذارید)‪.‬‬
‫یعنی مثالً در خروجی بدهد‪:‬‬
‫‪Y= 15.2 + 5.6 * X‬‬
‫ب) تابعی ک برآورد ضرایب رگرسیون را خروجی دهد (اسم تابع را ‪ coeff‬بگذارید)‪.‬‬
‫پ) تابعی که به ازای یک مشاهده جدید‪ ،‬طبق معادله رگرسیونی‪ ،‬پیشبینی انجام دهد (اسم تابع را‬
‫‪ predict‬بگذارید)‪.‬‬
‫تذکر‪ :‬در مثال فوق حق ندارید یک تابع بنویسید که همهی موارد باال را باهم خروجی دهد‪ .‬بلکه توابع‬
‫باید جداگانه باشند‪ ،‬ولی باهم ارتباط داشته باشند‪.‬‬
‫حل‪:‬‬
‫الف تا پ) در حل زیر تابع ‪ elementwise_production‬خواسته نشده‪ ،‬اما برای راحتی کار‬
‫خودمان‪ ،‬این تابع را تعریف کردهایم‪ .‬کار این تابع این است که مولفههای دو لیست را درایهدرایه در هم‬
‫ضرب کند و حاصل هر بار از این عملیات را داخل لیستی به اسم ‪ result‬اضافه میکند‪.‬‬
‫‪# ========== Building our linear regression‬‬
‫)‪# elementwise production function (for simplicity‬‬
‫‪def elementwise_production(x,y):‬‬
‫][=‪result‬‬
‫‪for i in range(len(x)):‬‬
‫)]‪result.append(x[i]*y[i‬‬
‫‪return result‬‬

‫‪# calculating regression line‬‬


‫‪def fit(x,y):‬‬
‫)‪n=len(x‬‬
‫‪x_bar=sum(x)/n‬‬
‫‪y_bar=sum(y)/n‬‬
‫)‪S_xy=sum(elementwise_production(x,y))-(n*x_bar*y_bar‬‬
‫)‪S_xx=sum(elementwise_production(x,x))-(n*x_bar*x_bar‬‬
‫‪global b_0,b_1‬‬
‫‪b_1=S_xy/S_xx‬‬
‫)‪b_0=y_bar-(b_1*x_bar‬‬
‫‪if b_1>=0:‬‬
‫))‪print("Y= {} + {} * X".format(b_0,b_1‬‬
‫‪else:‬‬
‫)))‪print("Y= {} - {} * X".format(b_0,abs(b_1‬‬

‫‪# returning regression line coefficients‬‬


‫‪def coeff():‬‬
‫‪return b_0,b_1‬‬
# predicting new observation
def predict(x_new):
return (b_0 + (b_1*x_new))
x=[1,0,2,0,3,1,0,1,2,0]
y=[16,9,17,12,22,13,8,15,19,11]

# ========== validating our linear regression


fit(x,y) # fitting a linear regression on x & y
print(coeff()) # coefficients
print( predict(2) ) # the prediction for x=2?
:‫خروجی‬
Y= 10.2 + 4.0 * X
(10.2, 4.0)
18.2

،‫ پرتاب یک تاس رو شبیهسازی کنید و ببینید که آیا در عمل‬،‫ به عنوان زنگ تفریح و برای دل خودتون‬:‫زنگ تفریح‬

1
]‫ هر وقت خودتون حل کردید بهش نگاه کنید‬،‫هست یا نه؟ [جوابش رو در زیر آوردم‬ ‫واقعاً احتمال هر وجه‬
6

1
)0.1666666666 ً‫ هست یعنی مثال‬6 ‫ یعنی هِمینجوری تا آخر عدد‬6 ‫(اون‬ = 0 / 16 :‫ اوالً باید بدونیم که‬:‫حل‬
6

‫ کلیتش‬،‫ ممکنه یه جور دیگه نوشته باشید‬،‫کدی که من نوشتم اینه [لزوماً قرار نیست شما هم همین شکلی نوشته باشید‬
]‫رو چک کنید‬

# www.Koolac.Org
# By: Sajjad Rahmani
import random
dice=[]
for i in range(10000000):
dice.append(random.randint(1,6))
prob={
1: dice.count(1)/len(dice),
2: dice.count(2)/len(dice),
3: dice.count(3)/len(dice),
4: dice.count(4)/len(dice),
5: dice.count(5)/len(dice),
6: dice.count(6)/len(dice)
}
print( prob )
:)‫ طبیعتاً یکم طول میکشه‬،‫ میلیون بار عدد تصادفی تولید میکنیم‬10 ‫خروجی (چون داریم‬

{1: 0.1666605, 2: 0.1668222, 3: 0.1667151, 4: 0.1664218, 5: 0.1667469, 6: 0.1666335}


‫موفق باشید‬

‫با تشکر‪ ،‬سجّاد رحمانی‬

‫گروه آموزشی کوالکــــ‪...‬‬

You might also like