Лого на 91. НЕГ „Проф. Константин Гълъбов“

Избираем модул · Урок 10

Всичко е вектор

Как снимка, текст и звук стават редици от числа — единственото, което алгоритъмът разбира. Плюс първите стъпки в Python за хора, които знаят C#.

Едно правило за всички данни

Алгоритъмът не вижда котка, не чува дума и не чете изречение. Той получава редица от числа и връща число. Всичко останало — изображения, звук, текст, видео — минава първо през превод към числа.

Вектор на признаците

Редицата числа, която описва един пример. Дължината ѝ е броят признаци, а всяко число е стойността на един от тях.

Изображение

6×6 пиксела00609030008020022012004018025525019030301602402451702006015016070000304010036 числаВектор с 36 признака — точно това вижда моделът.
Всеки пиксел е едно число от 0 (черно) до 255 (бяло). Редовете се навързват в един дълъг вектор.

Черно-бяла снимка 28×28 (какъвто е наборът с ръкописни цифри) дава 784 числа. Цветна снимка има по три числа на пиксел — червено, зелено, синьо, — така че 224×224 дава над 150 000 числа. Оттам идва и нуждата от сериозни изчисления.

Какво се губи при навързването

Когато навържем редовете, съседството по вертикала изчезва: пиксел и този точно под него се озовават на 28 позиции разстояние. Затова за изображения се използват мрежи, които работят направо върху двумерната решетка.

Звук

Микрофонът мери въздушното налягане 44 100 пъти в секунда. Една секунда звук е 44 100 числа. Обикновено те се превръщат в спектрограма — картина, в която хоризонтално е времето, вертикално са честотите, а яркостта е силата. Така задачата за звук се превръща в задача за изображение.

Текст

Най-наивният превод: за всяка дума от речника — една позиция; в изречението слагаме 1 там, където думата присъства, и 0 навсякъде другаде. Това се нарича торба с думи.

речник: [днес, утре, контролно, спам, кликни]
"утре имаме контролно"  →  [0, 1, 1, 0, 0]
"кликни за спам"         →  [0, 0, 0, 1, 1]

Работи изненадващо добре за спам филтри и се проваля навсякъде, където е важен редът или смисълът: „кучето ухапа човека“ и „човекът ухапа кучето“ дават един и същ вектор. Затова в урок 20 ще видим по-добър превод — вектори на думите, при които близките по смисъл думи получават близки числа.

Разстояние между примери

Щом всеки пример е точка в пространство, между два примера има разстояние. Смята се точно както в часа по математика, само че с повече от две координати:

d(A, B) = √((a₁ − b₁)² + (a₂ − b₂)² + … + (aₙ − bₙ)²)

Това е цялата тайна на много алгоритми: близките точки са сходни примери. Урок 13 стъпва изцяло върху нея.

Затова мащабът има значение

Ако единият признак е в диапазона 0–255, а другият — 0–1, първият определя разстоянието почти изцяло. Нормализирането не е козметика, а условие алгоритъмът изобщо да работи.

Python за хора, които знаят C#

От следващия урок пишем код. Ето разликите, които ще ви трябват днес:

C#Python
Блокове{ }отстъп (4 интервала)
Променливаint n = 5;n = 5
Методint F(int x) { … }def f(x):
Списъкint[] a = {1, 2};a = [1, 2]
Цикълforeach (var x in a)for x in a:
ПечатConsole.WriteLine(x);print(x)

Трите неща, които изненадват

  • Няма точка и запетая и няма фигурни скоби — отстъпът е синтаксис. Сбъркан отстъп е грешка, не грозен код.
  • Типовете не се пишат, но съществуват: списък от числа не се събира с текст.
  • Индексирането е като в C# — от 0, — но има и отрицателни индекси: a[-1] е последният елемент.