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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
Начнем с простейших понятий и я пойду спать, уже завтра будем изучать дальше!

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


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

🔗Таким образом, каждый раз, когда
мы заставляем компьютер решать задачи или принимать решения с помощью только данных, мы занимаемся машинным обучением (на опыте)

◽️ И, наконец, глубокое изучения — это целая область исследований, которая относится к машинному обучению (Это и есть нейросетки).

Кароч, на днях запилю уже какой-нибудь крутой пост о машинке. Это, скорее, было мое вводное слово, всем спокойно ночи!
🧑‍💻 Вот так резко мы врываемся к языку C (можете не спрашивать причем тут вообще Си). Пока что запишем некоторый код, потом уже попробую сделать структура и навигацию ко всему этому.

⭕️Массив — это группа ячеек памяти одинакового типа, расположенных рядом и имеющих общее имя.
⭕️Каждая ячейка в группе имеет уникальный номер.

При работе с массивами необходимо решать три задачи:
1️⃣ Выделять память нужного размера под массив.
2️⃣ Записывать данные в нужную ячейку.
3️⃣ Читать данные из ячейки.
‼️ Очень важно понимать вам одно ‼️Я пока что сам в нем ничего не знаю, не сказал бы что процесс вынужденный, но, мне самому придется это все понять, а вам это вполне может быть интересно. Ща разберем один код, уверяю, вы все поймете 🖤


#include <stdio.h>
const int N = 10; # Размер массива

int main() {
int A[N]; # Объявление массива

# Ввод массива с клавиатуры
printf("Введите массив A:\n"); #Вывод вод
for (int i = 0; i < N; ++i) { #Цикл по всем элементам
printf("Введите A[%d]: ", i); #Ввод A[i]
scanf("%d", &A[i]); #Ввод A[i]
}

#Умножение всех элементов на 2
for (int i = 0; i < N; ++i) { #Цикл по всем элементам
A[i] = A[i] * 2; #Умножить A[i] на 2
}

#Вывод массива на экран
printf("Результат:\n");
for (int i = 0; i < N; ++i) { #Цикл по всем элементам
printf("%d ", A[i]); #Вывод A[i]
}

return 0;
}


В целом, код достаточно читаем, но, я постараюсь объяснить и вам и себе его так, как я хотел бы, чтобы объясняли мне, начинаем)

0️⃣ Подключаем библиотеку stdio.h для использования таких функций, как, например, printf ( Вывод данных на экран ) и scanf ( Ввод данных с клавиатуры ). 👇🏿

#include <stdio.h>


1️⃣ В 🟰C🟰 нужно явно объявлять тип переменных ( К примеру: int A[N] объявляет массив целых чисел размером 10 ). В Python: переменные и типы данных динамические, и не нужно указывать их типы явно, вот вам явное отличие. const int N = 10;

⭕️ В Python список ( А еще массивы заменяются списками в нашем любимом питоне ) объявляется как A = [], и его можно динамически расширять с помощью метода .append() (Позже мы обязательно это рассмотрим подробнее).

Дак вот, возвращаемся к коду:

🟰 const int N = 10; устанавливает константу N, равную 10 ( Строчкой ниже мы зададим размер нашего массива этой переменной)
🟰 int A[N]; создается массив A размером 10.

Кстати, еще вы можете заметить Int main () ( Главная управляющая функция main () )

2️⃣:
for (int i = 0; i < N; ++i) { #Цикл по всем элементам
printf("Введите A[%d]: ", i); #Ввод A[i]
scanf("%d", &A[i]); #Ввод A[i]


Конструкцию for вы уже знаете (цикл ), давайте что-нибудь новенькое:

Итак, int i = 0 является начальной позицией, переменную i мы сразу же объявляем как целое число (int) и сразу же получает значение 0 (Потому что оно начальное).

int i = 0


⭕️ Это уже, своего рода, условие внутри нашей конструкции цикла (Пока i меньше значения N), цикл будет выполняться.)
i < N


🧑‍💻 "Инкремент — это операция, в результате которой значение переменной увеличивается на единицу" — не стал ничего придумывать, все сказано очень хорошо (После каждого выполнения тела цикла переменная i увеличивается на 1, а выполняется после каждого блока кода).

⭕️ Еще есть Декрементэто операция, в результате которой значение переменной уменьшается на единицу (- - 1)

++i

3️⃣:

Я уже сказал че за printf и scanf, Что за d в кавычках?? %d — это спецификатор формата, который говорит printf, что на этом месте в строке нужно подставить целое число.

🟰%d, %i — для целых чисел;

🟰%f, %g — для вещественных чисел;

🟰%c — для символов.


"&" — вот эта херь нужна для определения адреса переменной.

🟰 Операция * (звездочка) — позволяет получить значение объекта по его адресу.
🟰 Операция & (амперсанд) — позволяет определить адрес переменной.


 printf("Введите A[%d]: ", i); #Ввод A[i]
scanf("%d", &A[i]); #Ввод A[i]
}


4️⃣ В следующем цикле for, программа проходит по всем элементам массива и каждый элемент умножается на 2:

for (int i = 0; i < N; ++i) {
A[i] = A[i] * 2;


5️⃣ После умножения всех элементов, программа снова использует цикл для вывода всех значений массива и наша программа решена‼️ (Мы вводим 10 чисел и каждое умножается на 2)

for (int i = 0; i < N; ++i) { #Цикл по всем элементам
printf("%d ", A[i]); #Вывод A[i]
}


Итак, давайте подведем итоги:

🟰 Первый цикл производил ввод значений (чисел в нашем случае ) в массив ( Код запрашивал ввод чисел и сохранял их в массив A по индексу i ).

🟰 Второй цикл умножал каждый элемент массива на 2 и выводил результат

Я спать
🔗 Навигация по Машинному обучению

🧑‍💻 Введение

0️⃣ Простейшие понятия

1️⃣ И еще важные понятия (их будет много)

2️⃣ Пример 1 (Модель 1)

3️⃣ Пример 2 (Модель 2)

4️⃣ Модель 3 (Обязательно к прочтению)

5️⃣ Модель 4 и 5 (Вероятные изменения)

6️⃣ Модель 6 (Вероятные изменения)

7️⃣ Модель 7 (Как бы могла выглядеть наша модель)

🟰
ДОП НАВИГАЦИЯ ПО МОДЕЛЯМ🟰

🔗 Признаки моделей

🔗 Прогнозы и метки (Размеченные данные)

🔗 Неразмеченные данные

🔗 Контролируемое обучение и примеры

🔗 Неконтролируемое обучение

🔗 Алгоритмы кластеризации

🔗 Кластеры и кластеризация

🔗 Где нужна кластеризация ? (примеры)

🔗 Понижение размерности

🔗 Матричная факторизация и разложение по сингулярным значениям (Введение в тему)

🔗 Вспоминаем кластеризацию и алгоритм K-средних

🔗 Вспоминаем понижение размерности

🔗 Продолжаем матричную факторизацию

🔗 Алгоритм матричной факторизации SVD (Разложение по сингулярным значениям)

__________________________________

🟰Н А В И Г А Ц И Я🟰

‼️ ПРОДОЛЖЕНИЕ НАВИГАЦИИ ( МАШИННОЕ ОБУЧЕНИЕ 2 )
Итак, продолжаем машинку:

0️⃣ Начнем с того, что, когда мы хотим принять какое либо решение, которое основывается на нашем с вами опыте, мы задействуем такую концепцию, как
🔗 Вспоминание → Формулирование → Прогнозирование.

⭕️ Берем пример из книги: вспоминаем, что всю неделю шел дождь и прогнозируем о том, что сегодня он тоже скорее всего пойдет.

🟰МОДЕЛЬ — набор правил, которые представляют наши данные и могут быть задействованы для прогнозирования. (Именно модель обучается на данных для выполнения наших с вами задач).

🟰А вот АЛГОРИТМэто набор шагов, которые мы используем, чтобы построить модель.
👀1
1️⃣🔗 Берем снова пример из книги:

⭕️1. На почту нашего главного героя присылают, скажем, 10 сообщений в неделю (Это мы вспомнили), при этом, из 10 присланных на почту сообщений— 6 из них SCAM.

2. Теперь, формулируем модель (2 этап после вспоминания). Надо еще учитывать тот момент, что оно может оказаться неверным (наше формулирование это), но, это лучшее что мы можем придумать.

3. Дальше прогнозирование (3 этап), является ли это электронное письмо спамом. Учитывая, что 6 из 10 — спам, новое электронное письмо будет спамом с вероятностью 60 % и с вероятностью 40 % — нет. По сути, с большей вероятностью новое письмо окажется спамом, поэтому ликвидируем его
⭕️ (Новое письмо — спам)

Возмоожно, мы были неверны в наших прогнозах, но мы сделали прогноз на основе наших данных.

🧑‍💻 Грокаем дальше —>
🤡1👀1
2️⃣🖇 Модель 2 (Грокнем ее)

Теперь книга нам предлагает капнуть глубже...

z понедельник — полезное;
z вторник — полезное;
z суббота — спам;
z воскресенье — спам;
z воскресенье — спам;
z среда — полезное;
z пятница — полезное;
z суббота — спам;
z вторник — полезное;
z четверг — полезное.


ХАХААХАХХА не знаю почему скопировалось Z, но пусть будет )

👨‍💻 Давайте посерьезнее, итак, у нас теперь инфы побольше! Теперь мы знаем, что по будням нам присылают рабочую почту, а по выходным — 🔞.

🔗 Перейдем к модели, и допустим, сегодня вторник. а это значит, что, с большей вероятностью — это полезное письмо.
🤡3
🔗3️⃣ Теперь усложняем, модель 3.

⭕️ Нас встречает наш кент и говорит, что мы не пришли не его день рождения (обидно). Как оказалось, эта плешь присылала всем приглашения в воскресенье! А у нас на воскресенье, как и на другие выходные стоит блок по сообщениям (По любому скамеры пишут) Для начала, возвращаемся к стадии вспоминания, когда нам присылали сообщения.

🔗 Дальше, книга предлагает такой вариант:

1 Кбайт — полезное;
2 Кбайт — полезное;
16 Кбайт — спам;
20 Кбайт — спам;
18 Кбайт — спам;
3 Кбайт — полезное;
5 Кбайт — полезное;
25 Кбайт — спам;
1 Кбайт — полезное;
3 Кбайт — полезное


⭕️ Похоже, большие письма являются спамом, потому что содержат большие вложения, мелкие письма — зачастую полезные.

⭕️ Формулируем следующее: если письмо больше 10 кб — спам, меньше — что-то полезное от кореша.

🧑‍💻 Теперь сам прогноз: если кент прислал письмо на почту, вес у него, килобайт 15, значит, скорее всего, письмо — спам.


‼️ В нашем примере, день недели и размер письма были признаками (Запоминаем че это) ↓

‼️ПРИЗНАК — любое свойство или характеристика данных, которые модель может применять для прогнозирования
🤡1
🧑‍💻 Два классификатора, которые у нас получились, хороши по-своему, но есть недостатки...

❗️ Модель 4 предполагала бы, что письмо, отправленное в выходные и имеющее вес больше 10 Кбайт — SCAM, в противном случае — полезное.

❗️ Модель 5 предполагала бы, что, если письмо, отправлено в течение недели — должно быть не больше 15 Кбайт, чтобы не попасть в категорию спама. Если письмо отправлено на выходных, то оно должно быть больше 5 Кбайт, чтобы попасть в категорию спама. В противном случае — письмо вайб + кайф
🤡1
🔗 Последовательность чисел 1 (7.2)

Ща одну задачку быстренько разберем и я спать. На минуточку, уже раздел 7.2!


⭕️ Все как обычно, два int(input) и пишем цикл for.

⭕️ Подается два числа:

Первое число — переменная для 'начала', вторая — для 'конца', но обязательно, второй аргумент должен быть включительным, поэтому +1
m, n = int(input()), int(input())

for i in range(m, n + 1):
print(i)
👍1
Последовательность чисел 3🌶

Ща разберем задачку на ночь и надо спать ложиться 👀


0️⃣🧑‍💻 Вводим привычную уже херню и думаем че дальше...

m = int(input())
n = int(input())


1️⃣ У нас в условии сказано, что m > n, это мы и пишем в первое условие:

if m > n:


2️⃣⭕️ Теперь можно и цикл прописать. (напоминаю, там три аргумент — start, stop, step ).

‼️ Нам нужно вывести такую последовательность, чтобы были только нечетные числа + числа должны идти от большего к меньшему.

🌶 И получается такой вот код:


m = int(input())
n = int(input())
if m > n:
for i in range(m, n - 1, -1):
if i % 2 != 0:
print(i)
👍1
🧑‍💻 Ща еще разберем некоторые решения, как раз нам нужно без условного оператора что-то найти 👁‍🗨

m, n = int(input()), int(input())

start = ((m - 1) // 2) * 2 + 1

for i in range(start, n - 1, -2):
print(i)


Вот такой код я украл у разрабов курса, че тут происходит ⁉️

0️⃣ Допустим, подается 6 и -1, это мы запоминаем 🧑‍💻

1️⃣ 🔗 Теперь, переменная start, и если мы подставим 6, то получается: ‼️ start = ((6-1) // 2) * 2 + 1 (Короче, если мы подадим четное число, эта формула сделает его нечетным, а если введем нечетное — то ничего 👀)

2️⃣⚙️ Ну и прописываем цикл for, а аргументом для старта делаем переменную start

UPD: Выводом будет: 5 3 1 -1
Еще одно решение с комментов, своего я придумать ничего не могу...

🧑‍💻 Подается снова 6 и - 1, цикл будет перебирать от 6 до -1 (не включительно) с шагом -2. ‼️ Важно понимать, на данном этапе нам код выведет: 6 4 2 0, можете сами попробовать:

m, n = int(input()), int(input())
for i in range(m, n, -2):
print(i)


🖇 Пока вроде все ясно, но зач нам четные числа, когда нам нужны нечетные??? Именно поэтому выводим в функции print следующее:

print(i - 1 + i % 2)


Берем снова шестерку, вычитаем 1 и прибавляем результат деления по модулю 6 от 2, (Это вот так ес че 6 % 2), получается 5, то что нам и нужно! На первой итерации i = 6, а выводит 5 (Уже объяснил почему), на второй итерации i = 4 ( Потому что у нас шаг -2 ), а вывод будет 3 и так далее до -1...

🔗 Код:

m, n = int(input()), int(input())
for i in range(m, n, -2):
print(i - 1 + i % 2)
🤡1
🧑‍💻 Так, Последовательность чисел 4 (7.2),

По сравнению с прошлыми заданиями, эта прям намного проще,⭕️ просто прописываем условный оператор if и учитываем 3 данных условия (хотя бы одному наш код должен удовлетворять)

Ну и, собственно, код:

m = int(input())
n = int(input())
for i in range(m, n + 1):
if i % 17 == 0 or i % 10 == 9 or (i % 3 == 0 and i % 5 == 0):
print(i)


🤷‍♂️ Даже и не знаю, какие комментарии можно дать, оператор or мы знаем, как писать условия тоже знаем, почему диапазон от m до n + 1 тоже знаем (если забыли вдруг, у нас индексация с 0, поэтому + 1)
Итак, мы почти доделали 7.2!!!

🧑‍💻 Задание Таблица умножения (7.2), ща быстро напишем и гоу дальше

a = int(input())
for i in range(1, 11):
print(f' { a} x {i} = {a * i}')
Всем споки
👀2🥰1🤡1
👀 Так, покатали яйца денек, можно и за работу

🧑‍💻 Начнем с тестов, уж больно давно их не было, чисто на разминку:

#1

count = 0
for i in range(4):
for j in range(2):
count += 1
print(count)
#1 Что напечатает следующий код?
Anonymous Quiz
0%
4
60%
8
0%
6
20%
12
20%
16
👀2
🟰На всякий🟰