Algorithm design & data structure
6.63K subscribers
950 photos
142 videos
175 files
545 links
این کانال برای تمامی علاقه‌مندان به کامپیوتر، مخصوصاً حوزه ساختمان داده‌ها و الگوریتم‌ها، مفید می باشد. آشنایی با ریاضیات مقدماتی، برنامه‌نویسی مقدماتی و پیشرفته و همچنین شی‌گرایی می‌تواند در درک بهتر مفاهیم این درس کمک‌ کند.

👨‍💻Admin👉 @Se_mohamad
Download Telegram
شبیه کد و مثالی از Expectimax

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
پیاده سازی رگرسیون خطی (Linear Regression) شامل مراحل زیر هست:

1️⃣تولید داده
2️⃣ساخت نورون یا پیاده‌سازی رابطه
3️⃣محاسبه خروجی نورون براساس داده ورودی و مدل رابطه
4️⃣محاسبه لاس یا اتلاف
5️⃣محاسبه گرادیان ها
6️⃣بروزرسانی وزن های نورون

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
👌1
یک درخت جستجوي باینري با کلمه "SEARCH "(از چپ بـه راسـت) بـسازید. تعـداد متوسط مقایسه براي پیدا کردن یک کاراکتر در این درخت برابر است با:
Anonymous Quiz
18%
2.83
47%
2.4
18%
2.6
18%
6
محاسبه اتلاف یا loss
درکل توابع اتلاف متنوعی با کارکردهای مختلف در یادگیری ماشین و شبکه عصبی وجود دارد. برای مساله رگرسیون، یکی از پرکاربردترین‌ها تابع اتلاف Mean Square Error (MSE) هست.

طبق رابطه بالا، MSE عبارتند از میانگینِ مربعِ اختلاف بین مقدار هدف یا واقعی (y) و مقدار پیش‌بینی‌شده توسط مدلی مانند رگرسیون خطی (a+bx). رابطه بالا در نامپای به‌صورت زیر پیاده‌سازی می‌شود:
error = (y - y_hat)

loss = (error ** 2).mean()


که در کد بالا y همان y واقعی می باشد و y_hat که از رابطه خطی y=wx+b به دست می آید که اختلاف این دو همان error به دست می آید.

#هوش_مصنوعی

📣👨‍💻 @AlgorithmDesign_DataStructuer
Stack memory :

حافظه پشته برای تخصیص حافظه استاتیک استفاده می شود و از ساختار آخرین ورودی، اولین خروجی (LIFO) پیروی می کند. از نظر دسترسی به داده بسیار سریع است اما از نظر اندازه محدودیت دارد. مهم است بدانید که انواع مقادیر مانند انواع اولیه، bool، int، float، char و ... (بستگی به زبان برنامه نویسی دارد) و ارجاعات به اشیاء اعلام شده در یک متد یا تابع معمولاً در پشته ذخیره می شوند. و هنگامی که متد وجود دارد (ما محدوده را داریم) حافظه اختصاص داده شده برای آن متغیرها به طور خودکار تخصیص داده می شود.
برای مثال :
void StackMemoryExampleMethod()
{
int num = 5; // 'num' is allocated on the stack
}

#الگوریتم

📣👨‍💻 @AlgorithmDesign_DataStructuer
فرض کنید A یک ماتریس m * n خلوت (Sparse ) باشد عناصـر غیرصـفر آن را بـه ترتیب سطري در یک آرایه، 3*t که t تعداد عناصـر غیرصـفر مـاتریس اسـت ذخیـره میکنیم. بهترین تابع زمان عمل ترانهاده گیري برابر است با ...
Anonymous Quiz
24%
t+m
34%
tm
24%
tn
17%
t+n
👍3
لیست پيوندي(Linked List) :
ليست پيوندي بر خلاف آرايه پوياست. به همين دليل درج و حذف در آن ساده تر و سريع تر از آرايه است. اما جستجو و مرت بسازي
ميتوانند در آرايه بسيار سريع تر انجام شوند . هر عنصر در ليست يك طرفه خطي از دو بخش تشكيل شده است كه يكي براي ذخيره مقدار و ديگري براي اشاره به عنصر بعدي ليست است. در ليست يك طرفه خطي نميتوان جستجوي دودويي انجام داد جستجوي خطي در ليست يك طرفه از مرتبه (n(O است .
براي حذف گره با آدرس مشخص از ليست يك طرفه ابتدا بايد ليست را تا يافتن گره قبل از آن پيمايش نمود. بنابراين عمليات حذف يك عنصر دلخواه از ليست يك طرفه خطي از مرتبه (n(O است. در حالي كه درج با فرض دانستن مكان آن از (1)O است .
براي دسترسي به عناصر ليست يك طرفه خطي لازم است آدرس عنصر ابتدايي را داشته باشيم. بنابراين گاهي براي هماهنگي اين عنصر با ديگر عناصر آن را مقدار دهي نمي كنند و در حقيقت اولين عنصر حاوي مقدار بعد از عنصر ابتدايي قرار مي گيرد. در اين حالت به عنصر ابتدايي «سر ليست» گفته مي شود .
آخرين اشاره گر ليست يك طرفه خطي null است. با تعريف ليست حلقوي يك طرفه اين اشاره گر به عنصر اول اشاره مي كند. در چنين ليستي با داشتن آدرس هر گره مي توان به كليه گره ها دسترسي داشت و معمولاً به خاطر ساده نمودن درج در ابتداي ليست آدرس گره انتهايي نگه داري مي شود. ليست حلقوي نيز مي تواند سر ليست داشته باشد .
در ليست پيوندي دو طرفه در هر گره دو اشاره گر وجود دارد كه يكي به گره بعدي و ديگري به گره قبلي در ليست اشاره مي كند. بنابراين با داشتن آدرس يك گره كليه گره ها قابل دستيابي هستند. حذف و درج در اين ليست با ليست يك طرفه تفاوت دارد و از مرتبه (1)O است.
#الگوریتم
📣👨‍💻 @AlgorithmDesign_DataStructuer
توابع قابل استفاده در کتابخانه Pthorch :

import torch
random_tensor = torch.rand(size=(3, 4))
random_tensor, random_tensor.dtype
output:
(tensor([[0.1284, 0.5498, 0.0269, 0.1569],
[0.4350, 0.7384, 0.9168, 0.5741],
[0.1758, 0.3176, 0.9596, 0.4971]]),
torch.float32)

این کد یک تنسور تصادفی به ابعاد (3، 4) ایجاد می‌کند و نوع داده‌ی آن را نمایش می‌دهد. تنسور تصادفی با استفاده از تابع torch.rand ایجاد می‌شود و ابعاد آن با استفاده از پارامتر size=(3, 4) مشخص می‌شود. در نهایت، نوع داده‌ی تنسور نیز با استفاده از ویژگی dtype نمایش داده می‌شود.
random_image_size_tensor = torch.rand(size=(224, 224, 3))
random_image_size_tensor.shape, random_image_size_tensor.ndim
output :
(torch.Size([224, 224, 3]), 3)

این کد یک تنسور تصادفی به ابعاد (224، 224، 3) ایجاد می‌کند که معمولاً برای نمایش تصاویر RGB استفاده می‌شود. در این تنسور، ابعاد اول و دوم به ترتیب ارتفاع و عرض تصویر را نشان می‌دهند و ابعاد سوم تعداد کانال‌های رنگی است (سه کانال برای RGB).
tensor = torch.arange(10, 100, 10)
print(f"Tensor: {tensor}")

print(f"Index where max value occurs: {tensor.argmax()}")
print(f"Index where min value occurs: {tensor.argmin()}")
output :
Tensor: tensor([10, 20, 30, 40, 50, 60, 70, 80, 90])
Index where max value occurs: 8
Index where min value occurs: 0

در این کد، یک تنسور با استفاده از تابع torch.arange ایجاد شده است. این تابع یک تنسور ایجاد می‌کند که شروع آن از start است، تا end به مقدار step افزایش می‌یابد.

در اینجا، با استفاده از torch.arange(10, 100, 10) یک تنسور با مقادیر از 10 تا 90 با گام 10 ایجاد شده است.

سپس با استفاده از argmax() و argmin()، اندیس مقادیر بزرگترین و کوچکترین عناصر تنسور به ترتیب به دست می‌آید و چاپ می‌شود. این اندیس‌ها نشان‌دهندهٔ موقعیت (اندیس) این مقادیر در تنسور هستند.
#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
میخواهیم تغییراتی دریک لیست پیوندياعمال کنیم که عمل افزودن عنصر ابتـداویـا انتهـاي لیست با عملیاتی ازمرتبه (1) O قابل انجام باشد. لیست پیوندي را . . .
Anonymous Quiz
25%
حلقوی میکنیم
28%
دو طرفه میکنیم
40%
حلقوی میکنیم وآخرین عنصر را برای دسترسی به لیست ذخیره میکنیم
7%
معکوس میکنیم
الگوریتم و فلوچارت.pdf
5.4 MB
کتاب الگوریتم و فلوچارت برای دوستانی که تازه با رشته کامپیوتر آشنا شدن

#الگوریتم

📣👨‍💻 @AlgorithmDesign_DataStructuer
This media is not supported in your browser
VIEW IN TELEGRAM
پیاده‌سازی گیت OR با ترسپترون:
برای پیاده‌سازی گیت OR با استفاده از نورون ترسپترون، باید وزن‌ها (weights) و بایاس (bias) را به گونه‌ای تنظیم کنیم که رفتار ترسپترون مشابه گیت OR باشد.

همان طور که در گیف مشاهده میکنید ورودی های نوروون (x1,x2) همان AوB نیز می باشند و وزن هر دو 1.5 و bais نیز -1 نیز می باشد این مقادیر به داخل نورون می روند و عملیات هایی در داخل آن انجام می شود و خروجی y را می دهد که در واقع با آن y-had نیز گفته میشود این کار چندین بار اتفاق می افتد اگر خطا غیر صفر باشد وزن ها آپدیت می شود و بعد از چندین اپوک شبکه یاد میگرید که خطی جدایی پذیر بین آن ها قرار دهد که همان طور که در شکل می بینید 3 مقدار آن مقدار خروجی 1 و یکی 0 شده است شبکه باید یاد بگیرید که خطی بین این دو بیندازد و آن ها را از هم جدا کند.
نکته : از نکاتی که باید در این پست بدونیم اینکه در شبکه عصبی پرسپتورن که همان یک معادله جدا پذیری خطی نیز می باشد مقدار وزن ها یعنی W را میدانیم ولی در شبکه عصبی غیر خطی نیز وزن ها را نمیدانیم.

#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
👍2
کد پرسپترون برای طبقه بندی تابع OR :

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd


def step_function(x):
if x<0:
return 0
else:
return 1


training_set = [((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 1)]

# ploting data points using seaborn (Seaborn requires dataframe)
plt.figure(0)

x1 = [training_set[i][0][0] for i in range(4)]
x2 = [training_set[i][0][1] for i in range(4)]
y = [training_set[i][1] for i in range(4)]

df = pd.DataFrame(
{'x1': x1,
'x2': x2,
'y': y
})

sns.lmplot("x1", "x2", data=df, hue='y', fit_reg=False, markers=["o", "s"])


# parameter initialization
w = np.random.rand(2)
errors = []
eta = .5
epoch = 30
b = 0


# Learning
for i in range(epoch):
for x, y in training_set:
# u = np.dot(x , w) +b
u = sum(x*w) + b

error = y - step_function(u)

errors.append(error)
for index, value in enumerate(x):
#print(w[index])
w[index] += eta * error * value
b += eta*error

''' produce all decision boundaries
a = [0,-b/w[1]]
c = [-b/w[0],0]
plt.figure(1)
plt.plot(a,c)
'''


# final decision boundary
a = [0,-b/w[1]]
c = [-b/w[0],0]
plt.plot(a,c)

# ploting errors
plt.figure(2)
plt.ylim([-1,1])
plt.plot(errors)

#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
کاربردهای جستجوی باینری(Binary Search):
1️⃣جستجو در آرایه های مرتب شده: جستجوی باینری برای یافتن موثر یک عنصر در یک آرایه مرتب شده استفاده می شود.
2️⃣پرس و جوهای پایگاه داده: جستجوی باینری را می توان برای مکان یابی سریع رکوردها در جدول پایگاه داده که بر اساس یک کلید خاص مرتب شده است استفاده کرد.
3️⃣یافتن نزدیکترین تطابق: جستجوی باینری را می توان برای یافتن نزدیکترین مقدار به مقدار هدف در یک لیست مرتب شده استفاده کرد.
جستجوی درون یابی: جستجوی باینری را می توان به عنوان نقطه شروع برای جستجوی درون یابی استفاده کرد که یک الگوریتم جستجوی سریع تر است.
مزایای جستجوی باینری:
1️⃣کارآمد: جستجوی باینری دارای پیچیدگی زمانی O(log n) است که آن را برای جستجوی آرایه های مرتب شده بزرگ بسیار کارآمد می کند.
2️⃣پیاده سازی ساده: پیاده سازی و درک جستجوی باینری نسبتاً آسان است.
3️⃣همه کاره: جستجوی باینری را می توان در طیف گسترده ای از برنامه ها استفاده کرد.
4️⃣قابل اعتماد: جستجوی باینری یک الگوریتم قابل اعتماد است که در صورت وجود عنصر هدف در آرایه، همیشه آن را پیدا می کند.

#الگوریتم
📣👨‍💻 @AlgorithmDesign_DataStructuer
👍51
چگونه دو ماتریس را ضرب کنیم؟
برای محاسبه AB، با دانستن اینکه A باید در سمت چپ B باشد، ابتدا باید این کار را انجام دهیم بررسی کنید که ماتریس ها سازگار هستند. ضرب دو ماتریس فقط در صورتی امکان پذیر است که تعداد ستون های A با تعداد ردیف های B برابر باشد.
بنابراین، اگر A یک ماتریس n × m و B یک ماتریس m × k باشد، حاصل ضرب،AB را می توان یافت و یک ماتریس جدید n × k خواهد بود.
برای محاسبه حاصل ضرب، یک سری ضرب ضرب داخلی بین بردارهای ردیف A و بردارهای ستون B انجام می دهیم.

شکل بالا فرآیند یک ماتریس 3×3 A و یک ماتریس 3×2 B را نشان می دهد.

#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
مسئله ارضای محدودیت‌ها (Constraint Satisfaction Problem - CSP) در هوش مصنوعی به مسائلی اشاره دارد که باید مجموعه‌ای از متغیرها را طوری مقداردهی کنیم که یک سری محدودیت‌های از پیش تعریف‌شده را ارضا کنند. این نوع مسائل در بسیاری از حوزه‌ها از جمله زمان‌بندی، تخصیص منابع، و حل پازل‌ها کاربرد دارند.

اجزای اصلی یک مسئله ارضای محدودیت
متغیرها (Variables): عناصر اصلی مسئله که باید مقداردهی شوند. به عنوان مثال، در یک مسئله جدول زمانی، هر کلاس درس می‌تواند یک متغیر باشد.
دامنه‌ها (Domains): مجموعه مقادیر ممکن برای هر متغیر. برای مثال، در مسئله جدول زمانی، دامنه هر کلاس درس می‌تواند شامل تمام ساعات و روزهای موجود باشد.
محدودیت‌ها (Constraints): شرایطی که مقادیر متغیرها باید رعایت کنند. این محدودیت‌ها می‌توانند به صورت روابط بین متغیرها تعریف شوند، مانند "دو کلاس درس نمی‌توانند در یک زمان برگزار شوند."
شکل بالا این مسائله را بیان میکند که هیچ منطقه ای با منطقه کناری خودش هم رنگ نمی باشد که در پست های بعدی درمورد شکل بحث خواهیم کرد.

#هوش_مصنوعی
📣👨‍💻 @AlgorithmDesign_DataStructuer
مرتبه سازی قطعه کد زیر چیست؟
i:=2
while i<=n do begin i:=i^2 x:=x+1 end
Anonymous Quiz
39%
log n
29%
log(log n)
13%
n
19%
n log n
🤔83🙏2