TGViewer
Унарный код || прунинг Унарный код || прунинг @k_p_d_b · 359 subscribers
Post #108 135
🔵Streaming и инкрементальные обновления

В реальности, при потоковой обработке невозможно(ну точнее возможно конечно, но просто нелогично из за огромных затрат на вычисления) полностью перестроить комплекс при новом наблюдении.
Наверное многие уже догадались, что здесь так же будет использоваться скользящее окно: фиксируется окно длиной T последних наблюдений, при выходе наблюдения за границу окна выполняется откат соответствующих включений симплексов.
Логика обновления может выглядеть примерно так:

from collections import deque

class StreamingWitnessComplex:
def __init__(self, landmarks, window_size, epsilon):
self.landmarks = landmarks
self.window = deque(maxlen=window_size)
self.epsilon = epsilon
self.simplex_witnesses = {}

def update(self, point):
if len(self.window) == self.window.maxlen:
old = self.window[0]
self._retract_witness(old)

self.window.append(point)
self._add_witness(point)

def _add_witness(self, point):
dists = np.linalg.norm(self.landmarks - point, axis=1)
order = np.argsort(dists)
k_nearest = order[:3]
for i in range(len(k_nearest)):
for j in range(i + 1, len(k_nearest)):
edge = tuple(sorted([k_nearest[i], k_nearest[j]]))
if dists[k_nearest[j]] <= dists[order[2]] + self.epsilon:
self.simplex_witnesses.setdefault(edge, set()).add(id(point))

def _retract_witness(self, point):
pid = id(point)
for edge in list(self.simplex_witnesses):
self.simplex_witnesses[edge].discard(pid)
if not self.simplex_witnesses[edge]:
del self.simplex_witnesses[edge]


Алгоритм инкрементального persistent homology основан на vineyards Cohen-Steiner-Edelsbrunner-Morozov(я честно не могу это нормально перевести на русский) - отслеживании изменений persistence diagram при непрерывной деформации фильтрации. Применительно к нашей логике каждый такт состоит из трёх фаз, а именно из insertion новых симплексов, образованных свежим наблюдением + deletion симплексов, потерявших свидетелей + restoration через swap-операции.
В железе все это выполняется по очереди, то есть пока persistence computation block обрабатывает прошлое окно, distance computation unit и witness identification logic unit начинают обрабатывать новое.
More from @k_p_d_b
  1. Jul 13, 2026🔵Понятие непрерывности Формально можно описать через эпсилон-дельта, а именно это букваль…
  2. Jul 13, 2026Открытые множества и непрерывность 🔵Открытые шары и окрестности По сути это означает слов…
  3. Jul 13, 2026Всем привет, давно постов не было, так что сегодня будет новый TDA пост, но сейчас хотел с…
  4. Jun 9, 2026🔵Влияние выбора метрики на TDA Персистентная гомология формально определяется относительн…
  5. Jun 9, 2026🔵Dynamic Time Warping(DTW) DTW определяет расстояние между временными рядами, учитывая сж…
  6. Jun 9, 2026Для дискретных последовательностей (строки символов, последовательности ДНК, ну или времен…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →