vault backup: 2026-05-18 21:11:52
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
> ```
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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)})$$
|
||||
@@ -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;
|
||||
```
|
||||
Reference in New Issue
Block a user