algoroots
105 subscribers
5 photos
2 videos
5 files
6 links
جایی برای تقویت ذهن الگوریتمی با
الگوریتم های کاربردی در حوزه های جذاب
Download Telegram
Chip_Huyen_Designing_Machine_Learning_Systems_An_Iterative_Process.pdf
15.5 MB
کتابی برای پیاده سازی سیستم های ماشین لرنینگ به صورت واقعی و عملی
#Ml
3
🤔الگوریتم k-means

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

این الگوریتم مجموعه ای از نقاط داده را به K خوشه مجزا تقسیم می‌کند :
به صورتی که نقاط داخل هر خوشه بیشترین همسایگی را با هم داشته باشند و نقاط مختلف هر خوشه بیشترین تفاوت را با هم.


مسئله ریاضی پشت این الگوریتم کمینه کردن مجموع مربع فاصله داده ها از مرکز است.

#ML
👍41
import numpy as np

def initialize_centroids(X, k):
indices = np.random.choice(len(X), size=k, replace=False)
return X[indices]

def assign_clusters(X,centroids):
distances = np.linalg.norm(X[:, np.newaxis] -centroids, axis=2)
return np.argmin(distances, axis=1)

def update_centroids(X, labels, k):
return np.array([X[labels== i].mean(axis=0) for i in range(k)])

def has_converged(old_centroids, new_centroids, tolerance=1e-4):
shifts = np.linalg.norm(new_centroids - old_centroids, axis=1)
return np.all(shifts < tolerance)

def kmeans(X, k, max_iterations=100):
centroids=initialize_centroids(X, k)

for _ in range(max_iterations):
labels = assign_clusters(X, centroids)
new_centroids = update_centroids(X, labels, k)

if has_converged(centroids, new_centroids):
break

centroids=new_centroids

return centroids, labels
1
◻️ارزیابی Silhouette Score :

یکی از بهترین ارزیابی ها برای خوشه بندی

اندازه‌گیری میزان شباهت هر نقطه به خوشه اش نسبت به خوشه های دیگر

مقدار در بازه ی [1,1-]
نزدیک به 1 یعنی خوشه بندی عالی
نزدیک به صفر یعنی نقاط بین دو خوشه است
نزدیک به 1- یعنی اشتباه در خوشه بندی
#ML
👍21
import numpy as np
from collections import Counter

def euclidean_distance(a, b):
return np.sqrt(np.sum((a-b) ** 2))

class KNN:
def __init__(self, k=3):
self.k = k

def fit(self, X, y):
self.X_train = X
self.y_train = y

def predict(self, X):
return [self._predict(x) for x in X]

def _predict(self, x):

distances = [euclidean_distance(x, x_train) for x_train in self.X_train]

k_indics = np.argsort(distances)[:self.k]

k_nearest_labels = [self.y_train[i] for i in k_indics]

most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
1
algoroots
import numpy as np from collections import Counter def euclidean_distance(a, b): return np.sqrt(np.sum((a-b) ** 2)) class KNN: def __init__(self, k=3): self.k = k def fit(self, X, y): self.X_train = X self.y_train = y…
◼️برای هر نمونه از حلقه های for تو در تو نباید استفاده شه
◽️راهکار جایگزین بردارسازی با نامپای هست

◽️برای تصادفی نشدن نتایج در کلاس ها با رأی برابر شرطی کردن روش خوبی است
بخصوص بررسی میانگین

◽️معیار F1_score حتما در کنار سه معیار شاخص بررسی شود

◽️مقدار خیلی کوچک K باعث نویز میشود
و بزرگ آن دقت را کم میکند
بهینه سازی با Cross_validatiam راهکار خوبی است


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

#ML
#python
1👍1
الگوریتم ژنتیک(GA) :

الگوریتمی برای جست و جوی تصادفی با استفاده از تکامل زیستی

عملکرد کلی :

◽️جمعیت اولیه:
از پاسخ های تصادفی به نام کروموزوم ها استفاده میکنیم

◽️ارزیابی:
با استفاده از یک تابع هدف کیفیت هر کروموزوم سنجیده میشود

◽️انتخاب :
کروموزوم های بهتر با احتمال بیشتر برای تولید مثل انتخاب میشوند

◽️کراس اور :
ترکیب دو کروموزوم برای تولید فرزندان جدید

◽️جهش :
برای جلوگیری از گیرافتادن در مینیمم های محلی به طور تصادفی ژن ها در کروموزوم ها تغییر می‌کنند

◽️تکامل نسل :
تکرار مراحل تا به یک شرط توقف یا جواب بهینه برسیم

ویژگی :
عملکرد قوی در فضاهای پیچیده
مناسب برای مسائل غیرخطی و پیچیده
1🔥1
import random

def fitness(x):
return x**2


def decode(chromosome, a, b, bits):
value =int(chromosome, 2)
return a + (b - a) * value / (2**bits - 1)


def random_chromosome(bits):
return ''.join(random.choice('01') for_in range(bits))


def selection(population, scores):
k = 3
selected = random.choices(list(zip(population, scores)), k=k)
selected.sort(key=lambda x: x[1], reverse=True)
return selected[0][0]

def crossover(p1, p2, rate=0.7):
if random.random() < rate:
point = random.randint(1, len(p1) - 1)
return p1[:point] + p2[point:], p2[:point] + p1[point:]
return p1, p2


def mutate(chromosome, rate=0.01):
return ''.join(
bit if random.random() > rate else ('1' if bit == '0' else '0')
for bit in chromosome
)


bits = 10
bounds = (-10, 10)
population_size = 20
generations = 50

population = [random_chromosome(bits) for _ in range(population_size)]


for gen in range(generations):
decoded = [decode(c, *bounds, bits) for c in population]
scores=[fitness(d) for d in decoded]


best_idx = scores.index(max(scores))
print(f"{gen}: x = {decoded[best_idx]:.3f}, f(x) = {scores[best_idx]:.3f}")


select = [selection(population, scores) for _ in range(population_size)]


children = [ ]
for i in range(0, population_size, 2):
p1, p2 = select[i], select[i+1]
c1, c2 =crossover(p1, p2)
c1, c2 =mutate(c1), mutate(c2)
children.extend([c1, c2])

population = children
2
algoroots
ساختار این الگوریتم برای یافتن بیشینه ی تابع درجه دوم #python
جایگزین کردن numpy.array به جای str ها برای بهینه کردن سرعت

اگر تابع fitness سنگین باشد باید از memorization استفاده
ارزیابی مکرر پرهزینه است

طراحی کلاس برای کروموزوم بسیار مناسب است(OOP)

اگر نرخ جهش بالا باشد
الگوریتم شبیه جستجوی تصادفی می‌شود

نداشتن تنوع در جمعیت موجب گیرافتادن در بهینه ی محلی می‌شود(مهم)

رعایت این نکات الگوریتم را بسیار بهینه میکند
1🤔1
def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True

def next_prime(n):
candidate = n + 1
while not is_prime(candidate):
candidate += 1
return candidate

def sum_with_next_prime(num):
if is_prime(num):
next = next_prime(num)
result =num +next
print(f"{num} is a prime Sum with the next prime {next} is: {result}")
else:
print(f"{num} is not a prime")

number=int(input("Enter a number: "))
sum_with_next_prime(number)
2🔥1
algoroots
def is_prime(n): if n <= 1: return False if n <= 3: return True if n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6…
#python
الگوریتمی جالب
عدد را دریافت و اگر اول بود آن را با عدد اول بعدی اش جمع میکند
🔥21
عدم پشتیبانی از اعداد بزرگ در این الگوریتم ها به چشم میخورد
که برای پیاده سازی های بزرگ مشکل است
1👍1🤔1
algoroots
def is_prime(n): if n <= 1: return False if n <= 3: return True if n % 2 == 0 or n % 3 == 0: return False i = 5 while i * i <= n: if n % i == 0 or n % (i + 2) == 0: return False i += 6…
◽️برای کار با اعداد اول
استفاده از غربال اراتستن راهکار بهینه ای است

◽️کتابخانه ی sympy راهکار خوبی برای کار با اعداد صحیح است و آزادی عمل خوبی برای کار با اعداد بزرگ می‌دهد
1
algoroots
◽️برای کار با اعداد اول استفاده از غربال اراتستن راهکار بهینه ای است ◽️کتابخانه ی sympy راهکار خوبی برای کار با اعداد صحیح است و آزادی عمل خوبی برای کار با اعداد بزرگ می‌دهد
import math

def sieve_of_eratosthenes(n):
is_prime=[True] *(n + 1)
is_prime[0]=False
is_prime[1] = False

for p in range(2, int(math.sqrt(n)) + 1):
if is_prime[p]:
for multiple in range(p * p, n + 1, p):
is_prime[multiple]=False

primes= [ ]
for i in range(2,n + 1):
if is_prime[i]:
primes.append(i)

return primes

n = int(input("Find all prime numbers up to: "))
primes = sieve_of_eratosthenes(n)
print(f"Prime numbers up to {n} are:")
print(primes)
4
algoroots
#python ساختار الگوریتم غربال اراتستن
نوشتن این الگوریتم با bitrray به صرفه تر است
3🔥1
هک کردن شبکه عصبی! یا حداقل تلاش برای انجام آن.
یک شبیه‌ساز عالی منتشر شده که در آن باید هوش مصنوعی را قانع کنید تا رمز عبور را بدهد.

باید زیرکی به خرج دهید و پرامتی پیدا کنید که بتواند محافظت چت‌بات را دور بزند
https://gandalf.lakera.ai/baseline

اسپویل:
پاسخ مرحله ی اول در تصویر هست.
7