vault backup: 2026-05-18 21:11:52

This commit is contained in:
Dmitry
2026-05-18 21:11:52 +03:00
parent 969ef896bc
commit 6a5af63bb5
66 changed files with 1646 additions and 210 deletions
+11
View File
@@ -0,0 +1,11 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Infrastructure
---
# Infrastructure
![[infra.excalidraw.md|950]]
@@ -0,0 +1,88 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Ruby - массивы
---
# Ruby - массивы
Массив в Ruby - эксземпляр класса **Array**
Поскольку массивы являются объектами со своими методами, то это позволяет облегчить работу со списками данных.
Массив задается с использованием квадратных скобок, но не только.
```ruby
a1 = [...]
a2 = %w{word1 word2}
a3 = ['start', nil, 5, [...]]
a4 = Array.new
a5 = Array.new(3)
a6 = Array.new(5, "Test")
a7 = Array.new(5) { |i| i*i }
a8 = Array.[](1, 'a', /^A/)
a9 = Array[1, 'a', /^A/]
```
Ruby позволяет создавать многомерные массивы, элементы которого могут иметь разную размерность.
![[Pasted image 20260517200426.png]]
## Индексация массива
Доступ к элементам массива в Ruby осуществляется путем указщания его индекса, при этом, есть поддержка отрицательных индексом для индексации с конца.
### Размеры массива
```ruby
size == length - синонимы, позволяют узнать количество элементов в массиве
```
### Поиск элементов массива
Метод `array.include?(obj)` возвращает `true`, если объект является элементом массива `array`. Иначе - `false`.
Метод `array.index(obj)` возвращает индекс первого вхождения элемента в массив `array`, который равен искомому. Возврат `nil`, если такой элемент не был найден.
### Добавление элементов в массив
```ruby
a = [1,2,3]
a << 4
a += [5]
a.push(6)
```
Метод `array.unshift(obj)` добавляет элемент в начало массива (со сдвигом вправо уже существующих).
Метод `array.push(obj)` добавляет элемент в конец массива (синоним - `append`).
`array.index(index, obj)` вставляет полученные значения перед элементом с индексом `index`.
### Разворачивание многомерного массива в одномерный
```ruby
array.flatten()
array.flatten!() # преобразует в одномерный, заменяя первоначальный
```
### Срезы массивов
1) Использование диапазонов при индексации
2) Использование индекса и длины подмассива
3) `array.values_at(selector)` - возвращает массив, который состоит из элементов массива `array`, которые соответствуют передаеваемым селекторам.
Селекторы могут быть целыми числами (индексами) или диапазонами.
4) `array.first(n)` и `array.last(n)`, которые возвращают первые (последние) `n` элементов.
### Операции с массивом
1) `array.sample(n)` выбор случайного элемента (или `n` элементов)
2) `array.select{ |item| block }` выполняет выражение `block` для каждого элемента массива и возвращает массив, состоящий из элементов, для которых выражение принимает значение true
### Удаление из массива
1) `array.delete(obj)` - удаляет все элементы массива, которые равны `obj`. Если ничего не было удалено, то -> `nil`
2) `array.delete_at(index)` удаляет элемент с индексом `index`.
3) `array.delete_if{ |item| block }` удаляет все элементы, полходящие под условие.
4) `array.shift` удаляет первый элемент из массива и возвращает его, если нет такого, то `nil`.
5) `array.pop` удаляет *последний* элемент из массива и возвращает его.
### Полезные методы
![[Pasted image 20260517203130.png]]
![[Pasted image 20260517203153.png]]![[Pasted image 20260517203218.png]]
![[Pasted image 20260517203235.png]]
![[Pasted image 20260517203252.png]]
![[Pasted image 20260517203317.png]]
![[Pasted image 20260517203352.png]]
@@ -0,0 +1,75 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-17
title: Ruby - основы языка
---
# Ruby - основы языка
Пусть Ruby и объектно-ориентированный язык, можно с ним работать, как с обычным процедурным языком.
```ruby
puts "Hello World!"
```
Команда `puts` выводит что-угодно в консоль.
- В конце строк ставить знаки препинания не нужно
- Пробелы в начале строки ничего не значит, никакой табуляции
- Если нужно написать несколько команд в одной строке, то `;` заменит перенос строки по смыслу
## Комментарии
- Два вида комментариев:
- Однострочный - символ `#`
- Многострочный - конструкция =begin =end
## Типы данных
```ruby
puts "Hello".class -> String
puts true.class -> TrueClass
puts 5.class -> Integer
puts 6.4.class -> Float
putl nil.class -> NilClass
```
### Именование
- Переменные называются с маленькой буквы
- Классы, обратно, именуются с большой буквы
- Нельзя называть классы и переменные, используя ключевые слова языка
### Преобразование типов
- Явное (с помощью функций)
- `to_i` - к целому числу (отсечение дробной части для *float*)
- `to_s` - к строке
- `to_f` - к вещественному числу
- Неявное (преобразование в ходе работы программы) - авто преобразование при мат.операциях (int + float = float)
![[Pasted image 20260517175400.png]]
![[Pasted image 20260517175655.png]]
## Управляющие конструкции
В Ruby есть три основных оператора:
- if - без ветвления
`if a > 0 <action> end`
- if-elsif-else
- unless - сработает, если условие ложно
- case
![[Pasted image 20260517181450.png]]
### Операторы цикла
1) loop - бесконечный цикл (с условиями выхода break)
2) while - цикл с условием выполнения
3) next - прерывание шага цикла и моментальный переход на следующий шаг
4) until - цикл, пока условие ложно
5) redo - прерывание текущего шага и повторение его же
6) for - итератор перебора перечислимого объекта
- самый распространенный вариант - диапазоны:
- `n..m` - все целые от `n` до `m` *включительно*
- `n...m` - все числа не включая `m`
> ```ruby
> x, r = x.divmod
> ```
@@ -0,0 +1,28 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-14
title: КР - Кохонен
---
# КР - Кохонен
## Схема
![[Drawing 2026-05-14 17.10.42.excalidraw]]
Смысл $D_{1},\dots,D_{k}$ - к какому кластеру образец принадлежит.
## Алгоритм с формулами
1) Инициализация весов случайными маленькими значениями
2) Нормировка:
$$\text{весов:}\ w_{ij}=\frac{w_{ij}}{\sqrt{\sum\limits_{l=1}^{n}w_{lj}^{2}}}$$
$$\text{входов: }x_{i}=\frac{x_{i}}{\sqrt{\sum\limits_{l=1}^{n}x_{l}^{2}}}$$
3) Выбираем нейрона-победителя по одному из критериев:
$$S_{j}=\sum\limits_{i=1}^{n}x_{i}w_{ij}=||x||*||w^{j}||*\cos \phi \to \max$$
$$D_{j}=\sqrt{\sum\limits_{i=1}^{n}(x_{i}-w_{ij})^{2}} \to \min$$
4) Корректировка веса только нейрона-победителя:
$$w_{ij}(t+1)=w_{ij}(t)+\alpha(x_{i}-w_{ij}(t))$$
5) Алгоритм останавливается при стабилизации весов или достижении максимального числа эпох.
![[Drawing 2026-05-14 17.24.16.excalidraw]]
@@ -0,0 +1,52 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-14
title: КР - Персептрон
---
# КР - Персептрон
## Схема персептрона
![[Pasted image 20260514152232.png|400]]
$$u_{i}=f(\sum\limits_{j=0}^{n}w_{ij}^{(1)}x_{j}),\ i=\overline{1,k}$$
$$y_{l}=f(\sum\limits_{i=0}^{k}w_{li}^{(2)}u_{i}),\ l=\overline{1,m},\ i=\overline{1,k}$$
$$y_{l}=f(\sum\limits_{i=0}^{k}w_{li}^{(2)}f(\sum\limits_{j=0}^{n}w_{ij}^{(1)}x_{j}))$$
## Формальный нейрон - Персептрон
Нейрон состоит из трех типов элементов: **умножителей** (синапсов), **сумматора** и **нелинейного преобразователя**.
![[Drawing 2026-05-14 15.06.37.excalidraw|500]]
$$y_{i}=\sum\limits_{j=1}^{N}w_{ij}x_{j}$$
## Алгоритм ОРО
1. Прямой проход сети. Инициализация весов маленькими значениями
2. На последнем слое:
$$\delta_{j}^{(N)}=(y_{j}-d_{j})y_{j}^{'};\ \ \Delta w_{ij}^{(N)}=-\eta \delta_{j}^{(N)}y_{i}^{(N-1)}$$
3. При обратном распространении (n<N):
$$\delta_{i}^{(n)}=y_{i}^{'(n)}\sum\limits_{j}\delta_{j}^{(n+1)}w_{ij}^{(n+1)};\ \ \Delta w_{ij}^{(n)}=-\eta \delta_{j}^{(n)}y_{i}^{(n-1)}$$
4. Меняем веса: $w_{ij}^{(n)}(t+1)=w_{ij}^{(n)}(t)+\Delta w_{ij}^{(n)}(t)$
5. Алгоритм останавливается, если кончились эпохи, или ошибка меняется меньше заданного порога $\epsilon$, иначе п. 2.
$$E(w)=\frac{1}{2}\sum\limits_{j}(y_{j}-d_{j})^{2}$$
## Задача прогнозирования
По скользящему окну первые $k$ последовательных элементов, по которым предсказывается 1 следующий элемент.
$90\ 92\ 95\ 98\ 99\ 100$
Окно размера $3$
$$\begin{align}
90\ 92\ 95\ &\to 98 \\
92\ 95\ 98\ &\to 99 \\
95\ 98\ 99\ &\to 100
\end{align} - \text{обучающая выборка}$$
## Задача с нейроном
![[Drawing 2026-05-14 17.02.08.excalidraw]]
Рассчитать веса для одного нейрона.
$$y_{j}^{'}=\delta*(1-\delta)$$
$$w_{11}(t+1)=w_{11}^{(N)}+\Delta w_{11}^{(N)}(t)$$
$$\delta^{(N-1)}=y^{'}*(\delta^{(N)}_{1}*w_{11}^{(N)}+\delta_{2}^{(N)}*w_{12}^{(N)}+\dots+\delta_{5}^{(N)}*w_{15}^{(N)})$$
+149
View File
@@ -0,0 +1,149 @@
---
status: seed
type: concept
tags: []
created: 2026-05-14
updated: 2026-05-15
title: КР - Хопфилд
---
# КР - Хопфилд
## Что могут спросить
1. Что такое сеть Хопфилда и для чего она нужна?
2. Почему сеть Хопфилда относится к ассоциативной памяти?
3. Какая у неё архитектура?
4. Как кодируются входные и эталонные образы?
5. Как рассчитываются веса?
6. Как сеть восстанавливает искажённый образ?
7. Какие есть ограничения?
8. Чем сеть Хопфилда отличается от сети Хэмминга?
## Краткий ответ
**Сеть Хопфилда** - однослойная рекуррентная нейронная сеть ассоциативной памяти. Она хранит набор эталонных образов и по искажённому или неполному входу пытается восстановить ближайший эталон.
Если вход похож на один из запомненных образов, сеть в процессе итераций приходит к устойчивому состоянию, соответствующему этому образу.
## Архитектура
- один слой нейронов;
- каждый нейрон связан с другими нейронами;
- выходы нейронов возвращаются на входы;
- связей нейрона с самим собой обычно нет;
- веса задаются один раз по эталонным образам;
- состояние сети пересчитывается до стабилизации.
![[Pasted image 20260515090322.png|400]]
Входной и выходной векторы имеют одинаковую размерность:
$$
X=(x_1,\dots,x_n),\quad x_i \in \{-1,1\}
$$
Эталонный образ:
$$
X^k=(x_1^k,\dots,x_n^k),\quad k=1,\dots,m
$$
где:
- $n$ - число нейронов и размерность образа;
- $m$ - число запоминаемых эталонов;
- $k$ - номер эталонного образа.
## Инициализация весов
Веса рассчитываются по эталонным образам:
$$
w_{ij}=\sum\limits_{k=1}^{m}x_i^kx_j^k,\quad i\neq j
$$
Связь нейрона с самим собой исключается:
$$
w_{ii}=0
$$
Смысл: если два признака часто имеют одинаковый знак в эталонах, связь между ними усиливается; если разные знаки - связь становится отрицательной.
## Алгоритм функционирования
1. На вход подаётся неизвестный или искажённый образ.
Начальное состояние сети:
$$
y_i(0)=x_i,\quad i=0,\dots,n-1
$$
2. Для каждого нейрона считается новое состояние:
$$
s_j(p+1)=\sum\limits_{i=0}^{n-1}w_{ij}y_i(p)
$$
3. Значение нейрона обновляется через пороговую функцию:
$$
y_j(p+1)=f(s_j(p+1))
$$
где обычно:
$$
f(s)=
\begin{cases}
1, & s \ge 0 \\
-1, & s < 0
\end{cases}
$$
4. Шаги повторяются, пока выходы не перестанут изменяться.
Если распознавание успешно:
$$
Y=X^k
$$
То есть сеть восстановила один из эталонных образов.
## Ограничения
Сеть Хопфилда может ошибиться, если:
- запомнено слишком много образов;
- эталоны слишком похожи друг на друга;
- вход слишком сильно искажён;
- сеть пришла к ложному устойчивому состоянию.
Оценка ёмкости:
$$
m \approx 0.15n
$$
где $m$ - число запоминаемых образов, $n$ - число нейронов.
## Отличие от сети Хэмминга
| Сеть | Что выдаёт | Когда нужна |
|---|---|---|
| Хопфилда | восстановленный образ | нужно восстановить полный эталон |
| Хэмминга | номер ближайшего образа | нужно выбрать класс/эталон |
Главная фраза для ответа: **сеть Хопфилда восстанавливает образ, а сеть Хэмминга выбирает ближайший образец по расстоянию Хэмминга**.
## Мини-ответ на контрольной
Сеть Хопфилда - рекуррентная сеть ассоциативной памяти для восстановления эталонного бинарного образа по искажённому входу. Веса рассчитываются один раз по эталонам:
$$
w_{ij}=\sum\limits_{k=1}^{m}x_i^kx_j^k,\quad w_{ii}=0
$$
После подачи входа сеть итеративно пересчитывает состояния нейронов через пороговую функцию, пока выходной вектор не стабилизируется. Если всё прошло успешно, устойчивое состояние совпадает с одним из эталонов.
@@ -0,0 +1,14 @@
---
status: seed
type: concept
tags: []
created: 2025-12-17
updated: 2026-05-18
title: Лайфхак для NPM. Как проксировать не на поддомен а на под путь
---
# Лайфхак для NPM. Как проксировать не на поддомен а на под путь
Если нужно проксировать NPM не на поддомен, а на под "локацию" `domain.ru/<path>`, то нужно в location добавить нужный маршрут, но в доп.настройках укзать срез
```
rewrite ^/<path>/?(.*)$ /$1 break;
```