Machine learning Interview
ИИ, Rust, вайбкодинг, Data Science, Deep Learning и делюсь тем, что интересно и полезно! Вопросы - @workakkk РКН: clck.ru/3FmwRz
Show more📈 Analytical overview of Telegram channel Machine learning Interview
Channel Machine learning Interview (@machinelearning_interview) in the Russian language segment is an active participant. Currently, the community unites 30 268 subscribers, ranking 4 300 in the Technologies & Applications category and 21 337 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 30 268 subscribers.
According to the latest data from 03 September, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 130 over the last 30 days and by 20 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 12.41%. Within the first 24 hours after publication, content typically collects 7.38% reactions from the total number of subscribers.
- Post reach: On average, each post receives 3 755 views. Within the first day, a publication typically gains 2 234 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 31.
- Thematic interests: Content is focused on key topics such as claude, llm, контекст, hermes, nvidia.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“ИИ, Rust, вайбкодинг, Data Science, Deep Learning и делюсь тем, что интересно и полезно!
Вопросы - @workakkk
РКН: clck.ru/3FmwRz”
Thanks to the high frequency of updates (latest data received on 04 September, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
i - leftSize.
Приведенный далее код реализует этот алгоритм.
public int partition(int[] array, int left, int right, int pivot) {
while (true) {
while (left <= right && array[left] <= pivot) {
left++;
}
while (left <= right && array[right] > pivot) {
right--;
}
if (left > right) {
return left - 1;
}
swap(array, left, right);
}
}
public int rank(int[] array, int left, int right, int rank) {
int pivot = array[randomIntInRange(left, right)];
/* Раздел и возврат конца левого раздела */
int leftEnd = partition(array, left, right, pivot);
int leftSize = leftEnd - left + 1;
if (leftSize == rank + 1) {
return max(array, left, leftEnd);
} else if (rank < leftSize) {
return rank(array, left, leftEnd, rank);
} else {
return rank(array, leftEnd + 1, right, rank - leftSize);
}
}
Как только найден наименьший i-й элемент, можно пройтись по массиву и найти все значения, которые меньше или равны этому элементу.
Если элементы повторяются (вряд ли они будут «уникальными»), можно слегка модифицировать алгоритм, чтобы он соответствовал этому условию. Но в этом случае невозможно будет предсказать время его выполнения.
Существует алгоритм, гарантирующий, что мы найдем наименьший i-й элемент за линейное время, независимо от «уникальности» элементов. Однако эта задача несколько сложнее. Если вас заинтересовала эта тема, этот алгоритм приведен в книге Т. Кормен, Ч. Лейзер-сон, Р. Ривестп, К. Штайн «CLRS’ Introduction to Algorithms» (есть в переводе).
Пишите свое решение в комментариях👇
@machinelearning_interviewtorchscript, onnx, ipex, tensorrt);
• TorchServe можно использовать для многих типов вывода в производственных условиях.
• Объединение нескольких моделей в один граф/workflow;
• Инференс API (REST и GRPC);
• API для управления моделями;
• Метрики из коробки.
pip install torch==1.7.0 torchvision==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install torchserve==0.2.0 torch-model-archiver==0.2.0
• Примеры, демонстрирующие возможности и интеграции TorchServe
@machinelearning_interview!pip install nltk
!pip install pandas
import pandas as pd
import nltk
from nltk.tokenize import sent_tokenize,word_tokenize
from nltk.stem import PorterStemmer
from nltk.corpus import stopwords
import re
Обзор данных
▪Следующим этапом проекта будет загрузка датасета. В данном случае мы будем использовать набор данных твитов о катастрофах из Kaggle.
▪Мы можем загрузить наш датасет с помощью библиотеки pandas.
df = pd.read_csv("/train.csv")
▪Для того чтобы получить общее представление о данных, мы можем просмотреть верхние строки набора данных с помощью функции head в pandas:
df.head(10)
Для анализа столбца ключевых слов мы используем библиотеку seaborn, которая позволяет визуализировать распределение ключевых слов и их корреляцию с целью.
plt.figure(figsize=(10,70))
sns.countplot(data=df,y="keyword",hue="target",saturation=0.50)
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0)
plt.show()
📌 Продолжение
@pro_python_codepandas добавляет промежуточный слой Block и BlockManager. Он управляет этими массивами, обеспечивая максимальную эффективность операций. Это одна из причин, почему в Pandas методы, работающие с несколькими столбцами, могут быть очень быстрыми. Далее более подробно рассмотрим упомянутые слои.
Массивы
Фактические данные датафрейма могут храниться в наборе массивов NumPy или Pandas ExtensionArray. Этот слой обычно направляет к базовой реализации, например использует NumPy API при условии хранения данных в массивах NumPy. Pandas хранит в них данные и вызывает свои методы без расширения интерфейса.
Массивы NumPy обычно являются двумерными и дают ряд преимуществ в производительности, о которых речь пойдет далее. На данный момент Pandas ExtensionArray в основном представляют собой одномерные структуры данных, благодаря чему операции становятся предсказуемыми.
Однако не обошлось и без недостатков: в ряде случаев страдает производительность.
ExtensionArray допускает применение датафреймов, которые поддерживаются массивами PyArrow и другими типами данных Pandas.
Block
Датафрейм обычно состоит из столбцов, представленных по крайней мере одним массивом. Как правило, имеется коллекция массивов, так как один массив может хранить только один определенный тип данных. Эти массивы хранят данные, но не владеют информацией о том, какие столбцы они представляют. Каждый массив из датафрейма обернут соответствующим блоком Block.
✔ Block добавляет дополнительную информацию в массивы, например расположение представленных им столбцов.
✔Block служит слоем вокруг фактических массивов с возможностью расширения вспомогательными методами, необходимыми для операций Pandas.
✔ При выполнении фактической операции с датафреймом Block гарантирует, что метод направляется в базовый массив. Например, при вызове astype он убедится, что эта операция вызывается в массиве.
Данный слой не располагает информацией о других столбцах в датафрейме, являясь автономным объектом.
BlockManager
Как следует из названия, BlockManager управляет всеми Block, связанными с одним датафреймом. Он содержит сами Block и информацию об осях датафрейма, например имена столбцов и метки Index.
И самое главное в том, что он направляет большинство операций к фактическим Block:
df.replace(...)
BlockManager гарантирует, что replace выполняется для каждого Block.
Понятие консолидированного датафрейма
Мы исходим из того, что датафреймы поддерживаются типами данных NumPy, например их данные могут храниться в двумерных массивах.
При создании датафрейма Pandas гарантирует, что на каждый тип данных приходится только один Block:
df = pd.DataFrame(
{
"a": [1, 2, 3],
"b": [1.5, 2.5, 3.5],
"c": [10, 11, 12],
"d": [10.5, 11.5, 12.5],
}
)
У этого датафрейма есть 4 столбца, представленные двумя массивами: один из них хранит целочисленный тип данных, а другой — числа с плавающей точкой. Это и есть консолидированный датафрейм.
Добавим новый столбец к этому датафрейму:
df["new"] = 100
У него такой же тип данных, как и у существующих столбцов "a" и "c". Рассмотрим 2 возможных варианта дальнейших действий:
1. Добавление нового столбца в существующий массив, содержащий целочисленные столбцы.
2. Создание нового массива только для хранения нового столбца.
◾️ Первый вариант предусматривает добавление нового столбца в существующий массив. Для этого требуется скопировать данные, поскольку NumPy не поддерживает эту операцию без копирования. В итоге добавление одного столбца оборачивается слишком большими затратами.
◾️ Второй вариант
📌 Читатьclass BankAccount:
def __init__(self, account_number: int, balance: float):
self.account_number = account_number
self.balance = balance
def deposit_money(self, amount: float):
self.balance += amount
def withdraw_money(self, amount: float):
if amount > self.balance:
raise ValueError("Unfortunately your balance is insufficient for any withdrawals right now ... ")
self.balance -= amount
def print_balance(self):
print(f'Account no: {self.account_number}, Balance: {self.balance} ')
def change_account_number(self, new_account_number: int):
self.account_number = new_account_number
print(f'Your account number has changed to "{self.account_number}" ')
Принцип нарушается, поскольку классом BankAccount контролируется больше одной задачи, связанной с банковскими счетами: управление профилями счетов и управление денежными средствами.
б) соблюдение принципа:
А вот пример соблюдения принципа:
class DepositManager:
def deposit_money(self, account, amount):
account.balance += amount
class WithdrawalManager:
def withdraw_money(self, account, amount):
if amount > account.balance:
raise ValueError("Unfortunately your balance is insufficient for any withdrawals right now ... ")
account.balance -= amount
class BalancePrinter:
def print_balance(self, account):
print(f'Account no: {account.account_number}, Balance: {account.balance} ')
class AccountNumberManager:
def change_account_number(self, account, new_account_number):
account.account_number = new_account_number
print(f'Your account number has changed to "{account.account_number}" ')
class BankAccount:
def __init__(self, account_number: int, balance: float):
self.account_number = account_number
self.balance = balance
self.deposit_manager = DepositManager()
self.withdrawal_manager = WithdrawalManager()
self.balance_printer = BalancePrinter()
self.account_number_manager = AccountNumberManager()
def deposit_money(self, amount: float):
self.deposit_manager.deposit_money(self, amount)
def withdraw_money(self, amount: float):
self.withdrawal_manager.withdraw_money(self, amount)
def print_balance(self):
self.balance_printer.print_balance(self)
def change_account_number(self, new_account_number: int):
self.account_number_manager.change_account_number(self, new_account_number)
Задачи, связанные с управлением банковским счетом, мы разделили на отдельные классы, упростив в случае необходимости изменение классов одинакового назначения.
в) пример расширения кодовой базы:
🔘 Продолжение части 1
🔘 Часть 2
🔘 Часть 3
@machinelearning_interview