Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Нейросеть для обработки одномерного массива

#python #нейронные_сети


Добрый вечер,
Необходимо создать нейросеть для определения зависимости на последовательности.
Например у нас есть эталонная зависимость 

[0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0]


И также у нас есть входные данные, которые могут быть смещены: 

[0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0]


На выходе хотелось бы иметь какое-то число от 0 до 1 с вероятностью совпадения.
Буду рад услышать и увидеть любой материал, ссылки, а еще лучше псевдо- или обычный код.
    


Ответы

Ответ 1



Тема определения зависимы ли (перефразировано - насколько похожи) два набора данных друг от друга широка и довольно плотно исследована. Иногда я сторонник простых решений и прежде чем переходить к "попсовым" классификаторам, лучше пройтись по списку старых-добрых чисто статистических (или иных) методов (коли у нас просто в общем виде есть только массивы). В вопросе не указан тип данных, поэтому я пройдусь наугад по всему, что приходит в голову. Характер данных здесь играет ключевую роль - именно от него и зависит выбранный метод. Самое первое, что приходит в голову, когда говорят про зависимость какой-либо переменной от другой - корреляция. Коэффициент корреляция вы можете посчитать, используя numpy - этот метод вернет матрицу ковариации. Корреляция - базовый метод - есть гораздо более изощренные и, соответственно, сложные. Корреляция - супер крутая вещь. Всеядна, универсальна, проста как лопата - никогда не подведет. Твой лучший друг и товарищ на поприще анализа данных. Иной подход - найти наибольшую общую подпоследовательность в ваших данных. Данный абзац здесь появился только из-за того, что было упомянуто, что данные могут быть сдвинуты. В этом случае применим кольцевой хеш (rolling hash) или любые иные методы поиска подпоследовательности. Однако, в общем случае, на случайных данных правило "сдвига" не будет выполняться. Иная идея - самый что ни на есть обыкновенный XOR. Ваш пример: [0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0] XOR [0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0] = [0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0] Результатом имеем две единицы (то есть различающихся значений) из 11 - вот настолько две этих маски отличны (то есть данные одинаковы на 1 - 2 / 11 = 82%). Операция настолька быстра и дешева, что быстрее не найдете. Однако, опять-таки - не универсальна. Иной универсальный подход - косинус угла между векторами. Или же cosine similarity. Эта метрика изначально - мера "близости", похожести двух векторов (другой пример близости - Евклидово расстояние между ними). Также простая, классная вещь - единственный момент - ваши данные должны быть представимы как вектора. Вот есть интересный пример использования этой меры для сравнения похожести двух строк. Для ваших данных эта мера дает ответ 0.8 (1 - 0.2). Также всмотритесь повнимательнее - данная мера очень похожа на корреляцию. И неспроста. Вы можете посчитать "близость" данных используя Метод Наименьших Квадратов (МНК). Он также прост, причем он даже проще лопаты - он прост как ее древко. Он также универсален. Если ваши данные - это распределение вероятностей (это важно, метод не применим для обычных экспериментальных данных), то вам идеально подойдет расстояние землекопа. Как видно, с методов определения "близости" ОЧЕНЬ много и я лишь мельком затронул известные мне - какой выбрать - зависит только от ваших данных. И даже для "сложных", типа звука, изображений, текста лучше для начала попробовать простецкие методы - они хорошо изучены, просты - они дадут вам какой-то результат мгновенно. Известно на каких данных они работают "плохо", а на каких хорошо. Также ИНС - это классификатор, а не определятор похожести. Погружаясь в нейронные сети без понимания того, что это такое и как с этим работать вы рискуете надолго забуксовать. Даже несмотря на наличие приятных абстракций в стиле Tensorflow. Все-таки каждому инструменту свое применение. Помните, если долго смотреть в бездну - бездна посмотрит на вас.

Ответ 2



Если представить зависимость в виде строки символов то можно использовать алгоритмы нечеткого поиска Алгоритм Левенштейна

Ответ 3



К сожалению (и напрасно!) не было никакой активности по данному вопросу. Единственный ответ про алгоритм Левенштейна к сожалению не имеет отношения к вопросу. В качестве ответа приведу ссылку на статью с небольшими комментариями. Используется разложение в спектр, поиск взаимосвязанного набора характерных точек - дескриптор отдаленно напоминающий Bag Of Words в OCR. Затем обучение НС дескрипторам образцов, и затем оперативное вычисление дескрипторов и запрос НС на поиск соответствия. Используется TensorFlow - интересно куда это активные спецы в этой области подевались, только что были :-)

Комментариев нет:

Отправить комментарий