CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
🔗 Сумма чисел 2 (7.3)

🧑‍💻 Разберем еще решения с комментов:

🟰 Никаких условных операторов, автор использует цикл от 5 до n + 1 с шагом 10.

‼️ Шаг 10 в этом случае, потому что, прибавляя к 5 каждый раз по 10, мы будем получать 15 (225) → 25 (625) → 35 (1225) и так далее, то есть, квадрат числа оканчивается на 5, если само число оканчивается на 5


summ = 0
for i in range(5, n + 1, 10):
summ += i

print(summ)
👍2👨‍💻1
🔗 Сумма чисел 2 (7.3)

⚙️ Еще одно решение, здесь у нас условие на проверку 'вхождения последней цифры квадрата числа в [5] '


n, summ = int(input()), 0

for i in range(1, n + 1):
if i ** 2 % 10 in [5]:
summ += i

print(summ)
🥰2👨‍💻1
🔗 Четвертое решение Сумма чисел 2 (7.3)

s = 0

for i in range(1, int(input()) + 1):
s += i if i**2 % 10 in (2, 5, 8)else 0

print(s)


Внимательно посмотрели и думаем, че тут происходит 😶

Счетчик и цикл for — это еще ладно, уже знаем, а что насчет третьей строчки?

‼️Насколько я понял (это неточно), это пример тернарного оператора или тернарного условия. Дальше, я обратился к GPT:

🟰result = value_if_true if condition else value_if_false🟰 — Формат тернарного оператора, теперь можете сравнить с нашей строчкой 🟰s += i if i**2 % 10 in (2, 5, 8)else 0🟰

▫️condition в данном случае — условие, которое проверяется (у нас это 🟰if i**2 % 10 in (2, 5, 8)🟰)

▫️value_if_true — значение, которое будет присвоено или использовано, если условие истинно, у нас будет присвоено i

▫️value_if_false — значение, которое будет присвоено или использовано, если условие ложно (у нас это 0).

То есть, если квадрат числа i делённый на 10, даёт остаток 2, 5 или 8 🟰(i ** 2 % 10 in (2, 5, 8))🟰, тогда к переменной s прибавляется число. Если условие ложно, то прибавляется 0
❤‍🔥1🤯1👨‍💻1
Я спать 😴
🤯3👍1
🧑‍💻 Машинка победила! (да кто бы сомневался)

⚙️ Остановились мы на понижении размерности, почитать можете → ТУТ

💲 А здесь оставлю ссылку на пост о машинном обучении (навигация по разделам) → ТУТ

⭕️ Итак, рассмотрим матричную факторизацию и разложение по сингулярным значениям

Для начала, разберем умную мысль из книги:

" Предположим‚ у нас имеется таблица, полная данных, каждая строка соответствует точке данных, а каждый столбец — признаку. Следовательно, мы можем использовать кластеризацию для уменьшения количества строк в наборе данных "
— это я взял из книги, а теперь попробую вам пояснить. Еще выложу изображения из книги для понимания.

⭕️ Но, если вы вообще ничего не поняли, ща разберемся ⚙️
🤯2
⭕️ Продолжаем умную мысль, допустим, есть у нас такая таблица: в строках могут быть записаны работники/клиенты, а в столбцах — их признаки (доход, траты на покупки, возможно, антропометрические показатели)

‼️ Теперь вспоминаем, кластеризация — это процесс группировки схожих точек данных в кластеры. Нам нужно разбить большой набор данных (у нас это таблица) на кластеры, внутри каждого такого кластера будут находится данные максимально похожие друг на друга, но при этом, сами кластеры должны различаться.

⚙️ Вот у нас строк немаленькое количество, поэтому мы берем среднее значение признаков кластера (это какая то строка, которая характеризует наши данные в кластере). Она будет представлять каждую группу, и так с каждым набором данных

🟰Пример🟰

⭕️ У нас есть клиентская база из 5 тысяч человек, можем сгруппировать их по различным признакам, я их перечислял в начале, воспользуемся кластеризацией K-средних

K-средние – это алгоритм кластеризации в машинном обучении, который может очень быстро и эффективно сгруппировать немаркированный набор данных всего в несколько итераций. Он работает, маркируя все экземпляры в кластере ближайшим центроидом (это то самое среднее значение или строка, которая характеризует наши данные).

⭕️ Когда экземпляры сосредоточены вокруг определенной точки, эта точка называется центроидом.


🔗 Дак вот, из этих 5 тысяч можем выделить, скажем, 5 кластеров (в каждом по тысяч похожих покупателей). Теперь, вместо 5000 тысяч строк, мы можем с 5 центроидами (средними строками или точками)
10🤯3
🔗 Теперь, понижение размерности

⭕️ Это такой процесс, который преобразовывает данные в наиболее удобную для анализа и интерпретации форму. Количество столбцов (признаков) уменьшается, при этом. важная информация сохраняется. Такой процесс необходим, когда признаков у нас уж слишком много,

🟰 Рассмотрим PCA (Principal Component Analysis), это статистический метод, который позволяет сократить размерность данных, сохраняя при этом наибольшее количество информации. Если сказать попроще, то мы просто преобразуем исходные данные в новые, более компактные (Типо смысл и инфа сохраняется, но количество столбцов уменьшается🟰

‼️ Согласно этому методу, если бы у нас было по 50 признаков на человека, мы могли бы сократить количество столбцов до 5, объединив исходные, при этом, сохраняя основную информацию
5👍3
👨🏼‍💻
👍3
🧑‍💻 Так, постараюсь написать несколько постов, начнем с машинки и скажу сразу, в книге об этом написано немного, поэтому я пользовался помощью GPT и других ресурсов.

⭕️ "Матричная факторизация — это метод, используемый в машинном обучении и анализе данных для нахождения скрытых структур в данных, представленных в виде матриц."

⚙️ Представим матрицу A (3x4), ее строки — это объекты (к примеру, пользователи), а столбцы — это признаки или элементы (например, фильмы, товары или услуги). Значения этой матрицы могут представлять оценки этих пользователей или рейтинги или другие взаимодействия между объектами (пользователями) и их элементами (фильмы или товары).

Алгоритм матричной факторизации работает так, что мы раскладываем матрицу A на 2 - 3 а то и больше матриц меньшего размера, но при этом, при перемножении, матрицы дают приблизительное восстановление исходной матрицы.

🔗 Я прикрепил изображение матрицы, строки у нас это пользователи, а столбцы фильмы. Значение матрицы A — это рейтинги пользователей.
5🤯3
🔗 Разберем алгоритм матричной факторизации — SVD (Разложение по сингулярным значениям). Не будем вдаваться в подробности, разберем одну для понимания

⭕️ Пример возьмем тот же — матрица 3x4, ее вы можете увидеть выше.

A = U×Σ×Vᵀ — формула для разложения одной матрицы на 3 (к примеру)

🟰 U — это матрица, которая описывает "левые сингулярные векторы" (характеристики строк матрицы A)

🟰 Σ — это диагональная матрица с числами, называемыми "сингулярными значениями". Эти числа показывают важность каждого фактора в данных.

🟰 Vᵀ — это матрица "правых сингулярных векторов" (характеристики столбцов матрицы A)


⭕️ Итак, ща все поймем:

🔗 Матрица U описывает, как каждый пользователь относится к определенным факторам. Если брать пример с фильмами, то матрица U будет описывать интерес зрителя к комедиям или боевикам.

🔗 Матрица Σ — описывает веса, которые определяют наибольшую важность. Наиболее значимые факторы будут иметь большие значения, а менее значимые — маленькие.

🔗 Матрица 𝑉ᵀ — описывает, насколько каждый фильм связан с этими факторами (например, насколько фильм является боевиком или комедией).

Зачем это все нужно?

⭕️ Пока что, нам до этого далеко, но рассмотреть просто было необходимо. Итак:

⚙️ Естественно, сжатие данных, ведь мы изначально начинали рассматривать матричную факторизацию именно из-за этого. Мы убираем лишние, менее важные данные, сохраняя при этом самое важное и значимое (Разбиение матрицы на несколько, сохраняя ее основную информацию).

⚙️ Уменьшение размерности. У наших данных может быть много признаков, не все они важны, а некоторые из них могут быть слишком повторяться. Разложение по сингулярным значениям в этом случае помогает найти самые важные направления.

⚙️ Предпочтения пользователей (да-да, наши любимые рекомендации), SVD помогает анализировать предпочтения и делать персонализированные рекомендации.
5🤯4
🔗 3 теста на ночь, с утра будете думать 💤

#1

count = 0
for i in range(1, 5):
for j in range(i):
count += j
print(count)
🥰3
Ответ на #1
Anonymous Quiz
33%
10
0%
8
33%
18
0%
6
0%
16
33%
12
0%
14
🥰3
🔗 #2

numbers = [10, 20, 30, 40]

for i in range(len(numbers)):
numbers[i] += i

print(numbers)
🥰3
🔗 #3

for x in range(5):
if x == 3:
break
else:
print("цикл выполнен")
print(x)
🥰3
🤭
🥰3
🧑‍💻 Наконец, алгоритмы! Поговорим про алгоритм сортировки выбором. Будем честны, не самый эффективный алгоритм, но разобрать его стоит.

‼️ Итак, суть алгоритма в последовательном нахождении минимального или максимального элемента и перемещении его в конец или начало списка.

Давайте на примере:

🟰 Есть у нас неотсортированный список [16, 24, 20, 8, 2] и если вкратце, то берем наименьший элемент [2] и кидаем его в начало → [2, 16, 24, 20, 8] → дальше повторяем те же действия с другими числами, пока вся неотсортированная часть не будет отсортирована.

🐍 Тут все просто, теперь разберем код на Python, чтобы закрепить тему:

0️⃣ Для начала, создаем список listt:

listt = [16, 24, 20, 8, 2]


1️⃣ Создаем цикл for для перебора по индексам всех элементов нашего списка от 1 до 5 (не включительно):

for i in range(len(listt)):


2️⃣ Создаем новую переменную внутри внешнего цикла 🟰min_index🟰 Туда мы будем сохранять текущий элемент i (Кароч, цикл будет предполагать, что текущая переменная цикла i — это минимальный элемент в неотсортированном списке.

⚙️ Переменная 🟰
min_index🟰 хранит индекс минимального элемента в оставшейся неотсортированной части списка.

min_index = i


3️⃣ Создаем внешний цикл for, который будет проходиться по всем оставшимся элементам массива (после текущего элемента 𝑖, то есть, цикл будет проходить по неотсортированному списку) и искать элемент, который меньше того, который будет сохранен в переменную 🟰min_index🟰

 for j in range(i + 1, len(listt)):


4️⃣ Создаем условие для внутреннего цикла: будет проверяться, меньше ли текущий элемент списка 🟰listt[j]🟰 чем элемент переменной 🟰min_index🟰

⭕️ Если это так, то обновляется значение 🟰min_index🟰 и оно будет указывать на индекс этого нового минимального элемента.

 if listt[j] < listt[min_index]:
min_index = j


5️⃣ На пятом этапе, после кайфового завершения внутреннего цикла, когда найден минимальный элемент в неотсортированной части списка, происходит обмен местами этого минимального элемента с текущим элементом на позиции i

6️⃣ Выводим отсортированный список:

print("Отсортированный массив:", listt)


🔗 И сам код:

listt = [16, 24, 20, 8, 2]


for i in range(len(listt)):

min_index = i
for j in range(i + 1, len(listt)):
if listt[j] < listt[min_index]:
min_index = j


listt[i], listt[min_index] = listt[min_index], listt[i]

print("Отсортированный массив:", listt)
5🤯3🥰1
🔗 Так, еще раз по циклу, чтобы было совсем понятно:

⚙️ Интересует нас именно эта часть кода:

listt = [16, 24, 20, 8, 2]


for i in range(len(listt)):

min_index = i
for j in range(i + 1, len(listt)):
if listt[j] < listt[min_index]:
min_index = j


🔗 Первая итерация:

0️⃣ i = 0

1️⃣ min_index = 0

2️⃣⭕️ Создаем внутренний цикл for от 1 до 5 (не включительно): на первой итерации j = 1

3️⃣ Теперь, условный оператор if:

🟰 Это условие нужно для поиска минимального элемента в неотсортированной части списка.

🟰 Дак вот, наш этот if будет проверять, меньше ли текущий элемент внутреннего цикла 🟰listt[j]🟰, чем текущий минимальный элемент 🟰listt[min_index]🟰

if listt[j] < listt[min_index]:


4️⃣ Если текущий элемент j меньше, чем элемент 🟰min_index🟰 → новый минимальный элемент сохраняется в j (Это нужно для сравнения оставшихся элементов с новым минимальным элементом)

‼️ Каждая новая итерация будет способствовать тому, что будет меняться минимальный элемент с текущим элементом i
2👍2🥰1🤯1