Pull to refresh
4
0.2
inakrin@inakrin

User

Send message

Думаете, если данную мудрость в виде вашего параграфа, на который я отвечал ввести в LLM в качестве части инструкции по написанию кода проекта какого-нибудь, какой результат получится?
А если в качестве ТЗ отдать программисту? Моё предположение - в большем количестве случаев - спагетти код. Могу ошибаться, конечно.
"Но не проще" понимается по разному разными людьми. А любители передавать 100 аргументов в функциональном стиле на 20 вызовов функций вниз вообще по моему опыту склонны отвечать, что 10 файлов с классами - это очень сложно, вот же один файл со всеми функциями - это просто. И рефакторить легко, Ctrl-F аргумент и добавили ещё один в 20 местах. Зато в одном файле всё.

Это "потом" уже много где наступило. Реальный пример: Результат откладывания на потом: 5 "индусов" с ИИ вместе(курсор оплаченный компанией) не могут две недели уже в проекте закрыть таску странички с crud через 3rd party api так чтобы работало и не было несоответствий между api и локальной БД. ИИ просто сыпется на количестве легаси кода в проекте, который непонятно используется или нет, он не понимает, каких пользователей данных(в смысле кода) можно игнорировать, потому что легаси, какие важны и т.д. Я могу её за два часа закрыть, но просто пишу в PRы что не учтено, где сломается в этот раз, специально в описательном стиле и вопросительном без описания как именно пофиксить и жду когда хоть кто-нибудь из индусов поймёт, что пересылать мои комментарии LLM вместе с "fix these please" не сработает без понимания того, что и как должно работать. Причем понимание элементарно передать и ЛЛМ. Просто нужно перед "пофикси плиз" дать задание "расскажи как работает, где и как используется, объясни связи между а и б". Вот интересно, когда дойдёт.

Ага ага, а потом "меньше кода" просто невозможно прочитать и понять, а что этот код вообще делает. Меньше != понятнее. 20 классов по килобайту но с понятным наименованием, структурой и понятным кодом в каждом из маленьких методов классов с минимумом аргументов лучше сжатого в килобайт функционального спагетти с передачей 20+ параметров через кучу вызовов. Пример навеян реальным проектом.

У LLM кода есть кстати есть отличный и полезный(для меня) эффект. Он может сгенерировать код по промпту так, как я бы никогда не написал сам. При этом не обязательно хуже. Применить библиотеку/метод, о существовании которых я не догадывался, например, паттерн архитектурный. На ревью соответственно я автоматически учусь вариантам "как можно решить эту задачу". Дальше я уже могу добавлять в промпт инструкции вроде "реши задачу этим способом". Но это требует ревью кода и понимания, работает ли, хорошо ли сделано, как именно и почему работает. Не думаю, что многие этим занимаются.

Вы рисунки в модель отправляли? Ну я же говорю, что проблема ввода у вас. Вы не понимаете какие данные нужно отправить модели и в каком виде, чтобы она решила задачу. И на какие подзадачи разбить и решить отдельно, потом соединить. Вот для начала те 1162 точки, массивом и варианта 2-3.
У вас кстати точки с отклонениями теоретически можно не удалять а двигать туда где они должны быть (если я по скудным обрывкам которые вы присылаете могу правильно догадаться). И таким образом проблема удаления важных точек может решится.

И описание параметров ответом ChatGPT. Она правильно замечает, что нужно больше траекторий для проверки:

Why this is “universal” (and when to tune it)

Strengths

  • No assumption of monotonic x/y, no assumption of a functional form, no need to fit a global curve.

  • Handles different shapes because it’s purely local (but uses both directions).

  • Robust scaling per coordinate prevents one axis (e.g., y) from masking errors in another (e.g., x).

  • passes=2 usually fixes small clusters of glitches.

Knobs

  • k (default 6.0) controls strictness:

    • Lower k ⇒ removes more points (risk: false positives on aggressive maneuvers)

    • Higher k ⇒ removes fewer points (risk: misses subtle glitches)

  • passes (default 2) for occasional clustered glitches.

If you paste a few more trajectories (including ones with sharper turns / pauses), I can sanity-check whether the same defaults behave the way you want and suggest safe parameter ranges for your data.

Так у вас в голове есть понимание как решить, но у вас есть и понимание того, что это за траектории, какой физический смысл они имеют. А откуда у модели возьмётся понимание, если ей скармливать маленькие кусочки сырых данных. Вот по вашей картинке новой ясно, что траектории могут по кругу/спирали ходить. А ни по одному из кусочков, которые вы предложили скормить LLM этого совершенно не ясно. Наверное ещё какие-то недостающие звенья есть.
Моё мнение на данный момент: вы скармливаете модели недостаточно данных (в общем, включая метаданные о смысле этих точек и траекторий) и думаете, что у неё откуда-то возьмётся то понимание, которое есть у вас только в голове. И вот опять, вы выложили пример полной траектории картинкой. А в чатгпт тоже картинкой загоняете? Проблема ввода у вас заметна на всех уровнях. С самого начала я попросил пример данных, чтобы прогнать, вы выложили 20 точек, по котороым сначала мне, а потом LLM неявно предлагается догадаться, о том какие бывают полные траектории. Ещё я должен догадаться, что то , что эти 20 точек оказывается не то, что вы сами в chatgpt загоняли. А какого результата вы тогда ожидали от моей попытки, если вы даёте мне не те данные, которые сами использовали в промпте?
Тем не менее прогнал те два кусочка, воторые вы выложили через ChatGPT, код ниже. Результат для двух кусочков верный. Попробуйте на полной траектории, скорее всего будет не то, что вы ожидаете, но проблема не в GPT - проблема в полноте данных и промпте.

import numpy as np
import matplotlib.pyplot as plt

def _tukey_threshold(values: np.ndarray, k: float = 6.0) -> float:
    """Threshold = Q3 + k*IQR (k=6 is strict; fewer false positives)."""
    v = values[~np.isnan(values)]
    q1, q3 = np.percentile(v, [25, 75])
    return float(q3 + k * (q3 - q1))

def denoise_trajectory(points: np.ndarray, k: float = 6.0, passes: int = 2):
    """
    Remove out-of-order / glitch points from a trajectory.

    Works for N x D points (D can be 2, 3, ...).
    Core:
      - forward constant-velocity prediction error
      - backward constant-velocity prediction error
      - normalize by per-dimension robust step scale = median(|diff|)
      - score = min(forward, backward) (needs to be bad from both sides)
      - threshold by Tukey rule on interior scores
      - optional multiple passes for clustered glitches

    Returns:
      cleaned_points, removed_indices, keep_mask
    """
    P = np.asarray(points, dtype=float)
    if P.ndim != 2 or len(P) < 5:
        return P.copy(), np.array([], dtype=int), np.ones(len(P), dtype=bool)

    keep = np.ones(len(P), dtype=bool)
    removed = []

    for _ in range(max(1, int(passes))):
        Q = P[keep]
        n = len(Q)
        if n < 5:
            break

        # Robust per-coordinate scale: typical step size in each dimension
        diffs = np.diff(Q, axis=0)
        scale = np.median(np.abs(diffs), axis=0) + 1e-12

        # Forward prediction error for i>=2: p[i] ≈ 2*p[i-1] - p[i-2]
        f_pred = 2 * Q[1:-1] - Q[:-2]      # predicts Q[2:]
        f_res  = Q[2:] - f_pred
        f_score = (np.abs(f_res) / scale).max(axis=1)
        f_full = np.full(n, np.nan)
        f_full[2:] = f_score

        # Backward prediction error for i<=n-3: p[i] ≈ 2*p[i+1] - p[i+2]
        b_pred = 2 * Q[1:-1] - Q[2:]       # predicts Q[:-2]
        b_res  = Q[:-2] - b_pred
        b_score = (np.abs(b_res) / scale).max(axis=1)
        b_full = np.full(n, np.nan)
        b_full[:-2] = b_score

        # Combined score: must be bad from BOTH sides (for interior points)
        comb = np.nanmin(np.vstack([f_full, b_full]), axis=0)

        # Learn threshold from the safe interior range where both sides exist
        interior = comb[2:-2]
        thr = _tukey_threshold(interior, k=k)

        out = np.where(comb > thr)[0]
        if len(out) == 0:
            break

        # Map indices from Q back to original P
        orig_idx = np.nonzero(keep)[0][out]
        keep[orig_idx] = False
        removed.extend(orig_idx.tolist())

    removed = np.array(sorted(set(removed)), dtype=int)
    return P[keep], removed, keep

def plot_before_after(points, removed_idx, title="Trajectory"):
    P = np.asarray(points, float)
    removed_idx = np.asarray(removed_idx, dtype=int)

    # BEFORE
    plt.figure()
    plt.plot(P[:, 0], P[:, 1], marker="o")
    if len(removed_idx):
        plt.scatter(P[removed_idx, 0], P[removed_idx, 1], marker="x")
    plt.title(f"{title} (before)")

    # AFTER
    keep = np.ones(len(P), dtype=bool)
    keep[removed_idx] = False
    Pc = P[keep]

    plt.figure()
    plt.plot(Pc[:, 0], Pc[:, 1], marker="o")
    plt.title(f"{title} (after)")
    plt.show()

# ---- Example usage ----
# cleaned, removed, keep = denoise_trajectory(points, k=6.0, passes=2)
# plot_before_after(points, removed, "My Trajectory")

А, так судя по диалогам ниже у вас данные не однотипны. То есть сам шум и сами траетории отличаются. А вы даёте, как я понимаю, единственный пример или маленькую выборку, из которого непонятно вообще, что бывают другие формы шума и траекторий. И возможно не объясняете, а как отличить в принципе важную точку от неважной. И какой смысл у этих точек вообще. Но вы внизу так и написали "нюансов множество". Мой подход в таком случае: скормить LLM (полной версии с агенто-думалкой) полное описание нюансов, данные(выборку), пример данных, где по каждой точке прокомментировано почему она удалена/оставлена, и т.д. Попросить написать код, который будет выводить дебаг по каждой точке - почему точка удалена/оставлена. Потом смотреть, где ошибки и почему. Это не на один запрос к модели задача.

А вы бесплатные минимальные версии использовали, или картинки просто для примера, а настоящие данные сложнее? Потому что я уверен, что последняя версия чатгпт и клод с задачей справится быстро. Если хотите - скиньте массив координат текстом, попробую через чатгпт прогнать

А у меня, кстати, давно уже есть решение данной проблемы. Решение: Н уходит в бесконечный цикл(пытаясь выяснить ответ).

И противоречие исчезает. Ответ будет получен через бесконечное количество времени.

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

Часто новое знание - это собранное в другом порядке старое и взгляд под новым углом. И чатгпт зачастую выдаёт очень много того, чего нет (или сложно найти) в существующей литературе. А ещё она пишет и запускает код и интерпретирует полученные данные. Так что не стоит отрицать возможную новизну просто на основании использования llm.

P.S. Статью не понял, лично не могу оценить, слишком много непонятных мне терминов, увы.

Шершавый кабанчик он такой. Пришлите Маску кто-нибудь историю шершавого кабанчика.

Сталкивались ли вы с этим на своей работе? Как думаете, ваш ИИ-помощник - это действительно прорыв или просто генератор «рабочего шлака»?

Прорыв, если правильно использовать. Правило шлак на входе - шлак на выходе никуда не делось.

И в чём, по-вашему, главная угроза ИИ: массовая безработица, о которой говорит Хинтон, или гигантский экономический пузырь, готовый лопнуть и утянуть за собой всех нас?

Вопрос, где предлагается выбрать "главную угрозу" только из двух вариантов, во-первых неявно подразумевает существование этой самой угрозы, что, возможно, и не так, во-вторых, даже в случае существования некой главной угрозы, выбор из двух вариантов может и не иметь правильного ответа, а в третьих, является отличным примером того, как можно получить шлак на выходе LLM вместо полезного ответа.

>2 месяца на итерацию
Ужас. Я в Индонезии - здесь мне только нужно отправить файл, на следующий день порежут и отправят детали.
Деталь посложнее - в Китае, 2 недели на всё про всё.

Да, соглашусь, неконструктивное доказательство возможно.
В статье-то просто заявлено "конструктивное". Целая глава так называется. Ну вот я и спрашиваю как дойти из 1 до 31 например, а ответа так и нет. А если логику "конструктивного доказательства" оттуда переписать на нормальный язык, то она эквивалентна математическим банальностям и заявление о достижимости любого числа из 1 не следует вообще ни из чего.

Вопрос-то в том как, не зная маршрута от числа к 1 дойти из 1 в число.
Вот вы заявляете, что все числа достижимы из 1 по вашей таблице. А написать алгоритм того, как полный путь из 1 до любого числа не вычисляя оригинальный путь от числа к 1 сделать не можете. Значит ваша таблица и статья ничего не доказывает.
И фактически эквивалентна оригинальному алгоритму 3n+1. просто числа в табличке организованы. Показывает, что если откуда-то начать, двигаясь вперед или назад, то куда-то можно придти, в зоне прямого понимания куда именно имея только ближайшие элементарно вычислимые члены последовательности. А если последовательность состоит из 10**10 членов? А алгоритма именно попадания в любое число - не показывает. Или, например, возьмём любое число, какое расстояние от него до единицы? Если бы ваша таблица однозначно показывала такое расстояние (конечное значение, вы же заявляете конечное число шагов, значит и количество шагов можете простой формулой посчитать наверное?) для любого числа - гипотеза была бы доказана. Но в таком случае бы и формула была бы известна от любого n, и можно было бы её записать стандартным математическим языком, без придумывания смутных концептов и заявления о несостоятельности современной математики.
Кстати, раз уж так случилось, что я последнее время как раз увлёкся гипотезой Коллатца, скажу, что все ваши выкладки можно записать стандартным математическим языком, и тогда сразу станет ясно, почему они несостоятельны и гипотезу не доказывают.
Ваше "на любой ключ существует единственный переход с указателя на другой строке" фактически банальность и эквивалентно: для каждого n существует единственное m для которого верно m=3*n+1.
И так далее. Указатели ваши: любое число n, которое 3 mod 6 - произведение нечетного числа и 3. А 4 mod 6 - четно Каждое 6-е так-то, начиная с 3/4.
Конечно они уникально указывают на свой множитель. Но не указывают практически ни на что, относящееся к прогрессии Коллатца (кроме тривиально вычислимых ближайших соседей).

Не отслеживается. На основании какого правила я, например, должен сменить четность на 16, а не на 64? Я знаю что я хочу прийти в 31, но без знания последовательности, как я выбираю шаги с 1?
Ладно, согласно вашему диагональному правилу дошли до 40, например. Минимальный ключ нужно брать? Попадаем в 13 значит? И выходим из последовательности, ведущей к 31.
Вы можете не рисовать табличку. Вы напишите пошагово: начали в 1, перешли в n1 (на основании x1), перешли в n2 (на основании x2).... попали в 31.

Я обязательно разберусь, когда вы пример покажете. Покажите путь из 1 в 31 по таблице, восстанавливающий исходную последовательность Коллатца.

Почему час на омывку тратится?

Я постоянно печатаю, омывка занимает 5 минут.
Делаю так:
Держу 2 канистры с изопропиловым спиртом или метанолом(он дешевле) (последнее время стал смешивать первую с дихлорметаном, но это необязательно).
Снимаю модель с платформы, заливаю изопропиловым спиртом из канистры 1 в ведёрке модель, рукой в перчатке полоскаю, сливаю спирт назад в канистру 1 через фильтр, заливаю из второй канистры, повторно полоскаю, даю спирту стечь на картонку минуту, затем отправляю в самодельную УФ ванну, где модель ещё обдувает кулерами, чтобы спирт сдуть. Иногда слишком много воды в спирте оказывается, тогда ещё третье полоскание в гексане. Вода на дне собирается.

А вот я взял вашу таблицу.
И пример.
"строк. Рис. 2 иллюстрирует начало процесса: алгоритм 2n−1/3 стартовал с 1
и остановлен на переходе с указателя 58 на ключ 19."
А каким образом (на основании какого правила) переход происходит именно с 58 именно на 19? Да. 19*3+1 - 58. Но к 58 можно прийти не только с 19 двигаясь прямо. Почему двигаясь рекурсивно с 58 нужно именно на 19? К 58 можно прийти так: 309->928->464->232->116->58. Почему нужно двигаться с 58 не на 309?
И каким образом вы вообще пришли к 58. Пошли вверх по таблице к 58? Стартовали с 1 - 2n-1/3 получается 1/3.
Начало процесса с 1, а потом внезапно 58. Я не вижу как процесс пришел туда, и где доказательство, что он вообще должен был туда прийти и что каждый шаг процесса матемматически валиден.
Вот вот это ваше описание:
"двигаться от 1 по восходящему алгоритму Коллатца-наоборот (берем 1,
серийно умножаем на 2, отнимаем 1 и делим на 3 если делится, получаем
нечетное число и повторяем те же действия),"
Давайте попробуем.
Серийно умножил единицу на 2 - получил степерь двойки. 2048. Отнял единицу. 2047. На 3 не делится.
Что дальше? Я пришёл от единицы к 2047? Последовательность Коллатца занимает 157 шагов от 2047 до 1. Куда эти шаги пропали?
Ладно, давайте 31 возьмём, 31 у вас в таблице есть. Умножил единицу на 2**5, отнял 1 поучил 31.
Догадаюсь, что вы имеете в виду, что получив нечётное число нужно переходить на строку с ключом этого число.
Переходим на строку 31 (вопрос полного пути от 1 до 31 ещё открыт). Таак, желтые ячейки - это числа, которые ведут вперёд (назад в оригинале)? 124. (124-1)/3 - 41. Ладно, с 31 пришел на 41. Потом на 109 таким же манером, потом на 145... 193... 257.
Ладно, прямым вычислением выяснили, что Коллатц последовательность, начинающаяся с 257 задевает 31, 193, 145...
Вопрос только вот в чем: Где доказательство того, что после очень большого количества таких итераций я не попаду в число, которое вернёт меня на 31? (31 как пример).
Вот в следующий после 31 41 я могу прийти из 1165(и бесконечного числа других нечетных стартов). Начиная с 1165 ни 145 ни 193 ни 257 не задеваются.
Последовательность Коллаца начиная от 31 возрастает до 3077 и состоит из(нечетные числа): 31,47,71,107,161,121,91,137,103,155,233,175,263,395,593,445,167,251,377,283,425,319,479,719,1079,1619,2429,911,1367,2051,3077,577,433,325,61,23,35,53,5,1

Почему не может существовать такого числа, которое в своей прогрессии зацепит то, которое приведет опять в 31? (например 41,145,257,1165)?
И почему оригинальная последовательность должна идти вниз всегда. 31 отправляет вверх до 3077. Почему нет такого числа, которое будет всегда зацеплять число, которое будет отправлять последовательность вверх?
Возможно если вы на вашей таблице покажете пошагово, как из 1 прийти в любое число, при этом восстановив исходную последовательность - тогда я смогу согласиться, что эта таблица доказывает, что все числа достижимы из 1. А пока нет даже единственного примера, как имея только 2 числа изначально 1 и 31 прийти в 31.

1
23 ...

Information

Rating
3,246-th
Registered
Activity