Как рассчитать вычислительную сложность модели машинного обучения?
Можно говорить как о временной сложности алгоритма, так и о пространственной. Первая описывает количество времени, необходимое для выполнения алгоритма. Вторая — количество необходимой памяти. В ML-моделях это всё зависит от входных данных.
Примем такие обозначения:
n = количество обучающих примеров,
d = количество измерений данных,
Тогда расчёты будут такими:
🔹 KNN
Временная сложность — O(knd) (k — количество соседей)
Пространственная сложность — O(nd)
🔹 Логистическая регрессия
Временная сложность — O(nd)
Пространственная сложность — O(d)
🔹 SVM
Временная сложность (при обучении) — O(n²)
Временная сложность (при запуске) — O(k*d) (k — количество опорных векторов)
🔹 Дерево решений
Временная сложность (при обучении) — O(n*log(n)*d)
Временная сложность (при запуске) — O(максимальная глубина дерева)
Отметим, что это лишь обобщённые оценки.
#машинное_обучение
#программирование
Можно говорить как о временной сложности алгоритма, так и о пространственной. Первая описывает количество времени, необходимое для выполнения алгоритма. Вторая — количество необходимой памяти. В ML-моделях это всё зависит от входных данных.
Примем такие обозначения:
n = количество обучающих примеров,
d = количество измерений данных,
Тогда расчёты будут такими:
🔹 KNN
Временная сложность — O(knd) (k — количество соседей)
Пространственная сложность — O(nd)
🔹 Логистическая регрессия
Временная сложность — O(nd)
Пространственная сложность — O(d)
🔹 SVM
Временная сложность (при обучении) — O(n²)
Временная сложность (при запуске) — O(k*d) (k — количество опорных векторов)
🔹 Дерево решений
Временная сложность (при обучении) — O(n*log(n)*d)
Временная сложность (при запуске) — O(максимальная глубина дерева)
Отметим, что это лишь обобщённые оценки.
#машинное_обучение
#программирование
👍8❤2
Условие: У вас есть датафрейм df, содержащий два столбца: A и B. Столбец A содержит даты, а столбец B — числовые значения. Как бы вы рассчитали скользящее среднее по столбцу B с окном в 3 дня, предполагая, что значения в столбце A идут подряд и без пропусков?
Решение:
import pandas as pd
data = {
'A': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09'],
'B': [18, 71, 13, 57, 7, 8, 69, 83, 27]
}
df = pd.DataFrame(data)
# Убедимся, что столбец A распознан как дата
df['A'] = pd.to_datetime(df['A'])
# Установим столбец дат как индекс датафрейма
df = df.set_index('A')
# Рассчитаем скользящее среднее по столбцу B с окном в 3 дня
df['Moving_Average'] = df['B'].rolling(window=3).mean()
print(df)
#python
#pandas
#программирование
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍4😁1
🐍 Задача про умножение матриц
Условие: Вам даны две матрицы, нужно написать функцию для их умножения. Матрицы могут быть квадратными или прямоугольными.
Решение: Напишем решение на чистом Python
#программирование
#линейная_алгебра
Условие: Вам даны две матрицы, нужно написать функцию для их умножения. Матрицы могут быть квадратными или прямоугольными.
Решение: Напишем решение на чистом Python
def matrix_multiply(A, B):
# Сначала проверим, можем ли мы вообще перемножить эти матрицы
if len(A[0]) != len(B):
raise ValueError("Number of A columns must equal number of B rows.")
# Инициализируем результирующую матрицу, заполненную нулями
result = [[0 for _ in range(len(B[0]))] for _ in range(len(A))]
# Перемножим матрицы
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
result[i][j] += A[i][k] * B[k][j]
return result
# Проверим функцию на примере
A = [[1, 2, 3],
[4, 5, 6]]
B = [[7, 8],
[9, 10],
[11, 12]]
result = matrix_multiply(A, B)
for row in result:
print(row)
#программирование
#линейная_алгебра
🔥11👍6🥰1
Напишите линейную регрессию на Python с нуля
Это один из самых простых алгоритмов. Он включает следующие шаги:
1️⃣ Инициализация параметров.
2️⃣ Вычисление предсказаний.
3️⃣ Вычисление функции потерь.
4️⃣ Обновление параметров с помощью градиентного спуска.
5️⃣ Повторение до сходимости.
#машинное_обучение
#программирование
Это один из самых простых алгоритмов. Он включает следующие шаги:
import numpy as np
class LinearRegression:
def __init__(self, learning_rate=0.01, n_iters=1000):
self.learning_rate = learning_rate
self.n_iters = n_iters
def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
for _ in range(self.n_iters):
model_preds = self.predict(X)
dw = (1 / n_samples) * np.dot(X.T, (model_preds - y))
db = (1 / n_samples) * np.sum(model_preds - y)
self.weights -= self.learning_rate * dw
self.bias -= self.learning_rate * db
def predict(self, X):
return np.dot(X, self.weights) + self.bias
#машинное_обучение
#программирование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Напишите код, который будет иллюстрировать Закон больших чисел (ЗБЧ)
ЗБЧ утверждает, что при увеличении количества попыток случайная величина стремится к своему математическому ожиданию. Для иллюстрации возьмём подбрасывание честной монетки. Математическое ожидание выпадения орла равно 0.5. С увеличением числа подбрасываний среднее значение количества выпавших орлов должно приближаться к 0.5.
#программирование
#теория_вероятностей
ЗБЧ утверждает, что при увеличении количества попыток случайная величина стремится к своему математическому ожиданию. Для иллюстрации возьмём подбрасывание честной монетки. Математическое ожидание выпадения орла равно 0.5. С увеличением числа подбрасываний среднее значение количества выпавших орлов должно приближаться к 0.5.
import random
import matplotlib.pyplot as plt
total_flips = 0
numerical_probability = []
H_count = 0
for i in range(0, 5000):
new_flip = random.choice(['H', 'T'])
total_flips += 1
if new_flip == 'H':
H_count += 1
numerical_probability.append(H_count / total_flips)
plt.figure(figsize=(10, 6))
plt.plot(numerical_probability, label='Численная вероятность орла')
plt.axhline(y=0.5, color='r', linestyle='-', label='Математическое ожидание (0.5)')
plt.xlabel("Количество бросков")
plt.ylabel("Численная вероятность орла")
plt.title("Закон больших чисел: Подбрасывание монеты")
plt.legend()
plt.show()
#программирование
#теория_вероятностей
👍7🔥3
Объясните разницу между списком и кортежем?
▫️Список — это упорядоченная коллекция элементов. Элементы могут иметь любой тип. При этом коллекцию можно изменять: вставить новый элемент, удалить старый и т.д. То есть длина у списка динамическая — при необходимости Python будет выделять новую память.
Список создаётся через квадратные скобки.
▫️Кортеж — это тоже упорядоченная коллекция элементов. Элементы тоже могут иметь любой тип. Однако изменять кортеж нельзя. Кроме того, в памяти Python пустой кортеж — всегда в единственном экземпляре. Пустые списки же каждый раз создаются заново.
Кортеж создаётся через круглые скобки.
#программирование
#python
▫️Список — это упорядоченная коллекция элементов. Элементы могут иметь любой тип. При этом коллекцию можно изменять: вставить новый элемент, удалить старый и т.д. То есть длина у списка динамическая — при необходимости Python будет выделять новую память.
Список создаётся через квадратные скобки.
▫️Кортеж — это тоже упорядоченная коллекция элементов. Элементы тоже могут иметь любой тип. Однако изменять кортеж нельзя. Кроме того, в памяти Python пустой кортеж — всегда в единственном экземпляре. Пустые списки же каждый раз создаются заново.
Кортеж создаётся через круглые скобки.
#программирование
#python
😢3
Какие магические методы в Python вы знаете?
Магическими методами в Python называют встроенные методы с двойными подчёркиваниями (например, `__init__`, `__str__`). Они позволяют определять поведение классов для различных операций.
Вот несколько магических методов для примера:
▫️`__init__` — для инициализации нового объекта;
▫️`__del__` — деструктор, который вызывается при удалении объекта;
▫️`__str__` — определяет поведение функции `str()`, вызванной для экземпляра вашего класса;
▫️`__len__` — возвращает длину объекта;
▫️`__eq__` — определяет поведение оператора равенства `==`;
▫️`__iter__` — возвращает итератор для объекта;
▫️`__getitem__` — получение значения по ключу или индексу;
▫️`__call__` — позволяет объекту класса вести себя как функция.
#программирование
#python
Магическими методами в Python называют встроенные методы с двойными подчёркиваниями (например, `__init__`, `__str__`). Они позволяют определять поведение классов для различных операций.
Вот несколько магических методов для примера:
▫️`__init__` — для инициализации нового объекта;
▫️`__del__` — деструктор, который вызывается при удалении объекта;
▫️`__str__` — определяет поведение функции `str()`, вызванной для экземпляра вашего класса;
▫️`__len__` — возвращает длину объекта;
▫️`__eq__` — определяет поведение оператора равенства `==`;
▫️`__iter__` — возвращает итератор для объекта;
▫️`__getitem__` — получение значения по ключу или индексу;
▫️`__call__` — позволяет объекту класса вести себя как функция.
#программирование
#python
🔥7❤3
Что такое args, kwargs. В каких случаях они требуются?
В Python оператор * используется не только для умножения, но и для того, чтобы «распаковывать» объекты, внутри которых хранятся некие элементы. Именно эта его особенность применяется в случае с args и kwargs.Можно использовать другие имена, но это считается дурным тоном. args — это сокращение от arguments (аргументы), а kwargs — сокращение от keyword arguments (именованные аргументы).
Соответственно, мы используем *args, когда не уверены, сколько аргументов будет передано функции, или если хотим передать список или кортеж аргументов функции. А **kwargs мы используем, когда не знаем, сколько именованных аргументов будет передано функции. В последнем случае, в виду того, что речь идёт об именованных аргументах, применяется словарь, где ключ — имя параметра, значение — значение параметра.
#python
#программирование
В Python оператор * используется не только для умножения, но и для того, чтобы «распаковывать» объекты, внутри которых хранятся некие элементы. Именно эта его особенность применяется в случае с args и kwargs.
Соответственно, мы используем *args, когда не уверены, сколько аргументов будет передано функции, или если хотим передать список или кортеж аргументов функции. А **kwargs мы используем, когда не знаем, сколько именованных аргументов будет передано функции. В последнем случае, в виду того, что речь идёт об именованных аргументах, применяется словарь, где ключ — имя параметра, значение — значение параметра.
#python
#программирование
👍6
Что такое генераторы и итераторы в Python?
В Python генераторы и итераторы — это объекты, позволяющие работать с потенциально большими последовательностями данных без необходимости загружать всё в память одновременно. То есть и генераторы, и итераторы позволяют перебирать элементы коллекций.
🔹Итераторы реализуют методы __iter__() и __next__(). Метод __iter__() возвращает сам итератор, а __next__() — следующий элемент коллекции. Если элементы заканчиваются, __next__() должен вызвать исключение StopIteration.
🔹Генераторы представляют собой специальный способ реализации итераторов. Их можно реализовать двумя способами: как функцию с ключевым словом yield или как генераторное выражение. Главное отличие генератора от итератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям. Канонический пример — генератор, порождающий последовательность чисел Фибоначчи.
#программирование
#python
В Python генераторы и итераторы — это объекты, позволяющие работать с потенциально большими последовательностями данных без необходимости загружать всё в память одновременно. То есть и генераторы, и итераторы позволяют перебирать элементы коллекций.
🔹Итераторы реализуют методы __iter__() и __next__(). Метод __iter__() возвращает сам итератор, а __next__() — следующий элемент коллекции. Если элементы заканчиваются, __next__() должен вызвать исключение StopIteration.
🔹Генераторы представляют собой специальный способ реализации итераторов. Их можно реализовать двумя способами: как функцию с ключевым словом yield или как генераторное выражение. Главное отличие генератора от итератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям. Канонический пример — генератор, порождающий последовательность чисел Фибоначчи.
#программирование
#python
👍4❤1
Напишите функцию для вычисления евклидова расстояния
Вот две точки для примера:
Решение:
#python
#программирование
Вот две точки для примера:
plot1 = [1,3]
plot2 = [2,5]
Решение:
def euclidean_dist(point1, point2):
return ((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)**0.5
point1, point2 = [1, 3], [2, 5]
print(euclidean_dist(point1, point2)) # -> 2.23606797749979
#python
#программирование
👍6🥱5
Какова разница между == и is в Python?
🔘 == проверяет равенство значений двух объектов. Он возвращает True, если объекты имеют одинаковые значения, даже если они занимают разные места в памяти.
🔘 is проверяет, указывают ли две переменные на один и тот же объект в памяти.
Рассмотрим пример:
В первом случае lst == lst[:] возвращает True, потому что срез lst[:] создаёт новый список с теми же значениями, что и у оригинального списка lst.
Во втором случае lst is lst[:] возвращает False, так как lst[:] создает новый объект в памяти, который имеет те же значения, но является другим объектом.
#python
#программирование
Рассмотрим пример:
lst = [10, 20, 20]
print(lst == lst[:]) # True
print(lst is lst[:]) # False
В первом случае lst == lst[:] возвращает True, потому что срез lst[:] создаёт новый список с теми же значениями, что и у оригинального списка lst.
Во втором случае lst is lst[:] возвращает False, так как lst[:] создает новый объект в памяти, который имеет те же значения, но является другим объектом.
#python
#программирование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🤔1
Что такое JAX?
JAX — это фреймворк для вычислений и исследований в области машинного обучения. Он предоставляет API, совместимое с NumPy, и поддерживает автоматическое дифференцирование, векторизацию, параллелизацию и компиляцию в реальном времени для GPU/TPU. JAX ориентирован на скорость и производительность и подходит для обучения больших моделей, требующих мощных ускорителей.
🔗 Ссылка на документацию JAX
#программирование
JAX — это фреймворк для вычислений и исследований в области машинного обучения. Он предоставляет API, совместимое с NumPy, и поддерживает автоматическое дифференцирование, векторизацию, параллелизацию и компиляцию в реальном времени для GPU/TPU. JAX ориентирован на скорость и производительность и подходит для обучения больших моделей, требующих мощных ускорителей.
🔗 Ссылка на документацию JAX
#программирование
👾5👍4
Назовите алгоритмическую сложность следующих структур данных: список, словарь, очередь, множество
▪️Список (List)
Позволяет хранить последовательность элементов, поддерживает доступ по индексу.
Операция поиска (доступа к элементу): O(1);
Вставка или удаление элемента: O(n) в худшем случае.
▪️ Словарь (Dictionary)
Позволяет хранить пары «ключ-значение» и обеспечивает быстрый доступ к значениям по ключу.
Операция поиска, вставки и удаления элемента: O(1) в среднем, O(n) в худшем случае при коллизиях.
▪️ Очередь (Queue)
Поддерживает порядок «первым пришёл — первым вышел» (FIFO).
Операция добавления и удаления элемента: O(1).
▪️ Множество (Set)
Хранит уникальные элементы и обеспечивает быстрые операции проверки наличия элемента.
Операция поиска, вставки и удаления элемента: O(1) в среднем, O(n) в худшем случае
#программирование
▪️Список (List)
Позволяет хранить последовательность элементов, поддерживает доступ по индексу.
Операция поиска (доступа к элементу): O(1);
Вставка или удаление элемента: O(n) в худшем случае.
▪️ Словарь (Dictionary)
Позволяет хранить пары «ключ-значение» и обеспечивает быстрый доступ к значениям по ключу.
Операция поиска, вставки и удаления элемента: O(1) в среднем, O(n) в худшем случае при коллизиях.
▪️ Очередь (Queue)
Поддерживает порядок «первым пришёл — первым вышел» (FIFO).
Операция добавления и удаления элемента: O(1).
▪️ Множество (Set)
Хранит уникальные элементы и обеспечивает быстрые операции проверки наличия элемента.
Операция поиска, вставки и удаления элемента: O(1) в среднем, O(n) в худшем случае
#программирование
👍3❤2