Визуализация данных для анализа паттернов (не зависит от языка, но предпочтительнее для R)

11

Я хочу построить байты из образа диска, чтобы понять в них закономерность. Это в основном академическая задача, так как я почти уверен, что этот шаблон был создан программой тестирования диска, но я все равно хотел бы его перепроектировать.

Я уже знаю, что шаблон выровнен с периодичностью 256 символов.

Я могу представить два способа визуализации этой информации: либо плоскость 16x16, просматриваемая во времени (3 измерения), где цвет каждого пикселя является кодом ASCII для символа, либо строка 256 пикселей для каждого периода (2 измерения).

Это снимок шаблона (вы можете увидеть более одного), видимый через xxd(32x16):

Шаблон для анализа

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

Я хотел бы избегать Matlab или Mathematica, и я предпочел бы ответ на R, так как я изучал его недавно, но, тем не менее, любой язык приветствуется.


Обновление, 2014-07-25: с учетом приведенного ниже ответа Эмре, вот как выглядит шаблон, учитывая первые 30 МБ шаблона, выровненные по 512 вместо 256 (это выравнивание выглядит лучше):

Графический рисунок

Любые дальнейшие идеи приветствуются!

Valmiky Arquissandas
источник
Пример / выдержка из данных (может быть, только несколько МБ) может быть интересным.
Marco13
Если вы интересуетесь периодической природой данных, взгляните на ДПФ данных.
mrmcgreg
@mrmcgreg: мне придется заново изучить, как работает DFT. Я должен был уделить больше внимания классам сигналов и систем :)
Valmiky Arquissandas

Ответы:

5

Я бы использовал визуальный анализ. Поскольку вы знаете, что каждые 256 байт повторяются, создайте изображение шириной 256 пикселей и глубиной, и закодируйте данные с использованием яркости. В (я) Python это будет выглядеть так:

import os, numpy, matplotlib.pyplot as plt

%matplotlib inline

def read_in_chunks(infile, chunk_size=256):
    while True:
        chunk = infile.read(chunk_size)
        if chunk:
            yield chunk
        else:
            # The chunk was empty, which means we're at the end
            # of the file
            return

fname = 'enter something here'
srcfile = open(fname, 'rb')
height = 1 + os.path.getsize(fname)/256
data = numpy.zeros((height, 256), dtype=numpy.uint8)    

for i, line in enumerate(read_in_chunks(srcfile)):
    vals = list(map(int, line))
    data[i,:len(vals)] = vals

plt.imshow(data, aspect=1e-2);

Вот как выглядит PDF:

PDF-файл визуализируется

256-байтовый периодический шаблон проявился бы как вертикальные линии. За исключением заголовка и хвоста это выглядит довольно шумно.

Эмре
источник
Это похоже на то, что я ищу. Сейчас я готовлюсь к финалу и не могу снова подумать об этом, но как только смогу, я дам вам знать. «256-байтовый периодический шаблон проявился бы как вертикальные линии». - именно то, о чем я думал. Я также могу показать изображение, где я помещаю все 256 байтов в одну строку, и это уже очевидно в тексте. Мне очень любопытно, что из этого получится :)
Valmiky Arquissandas
Я не могу запустить это на Debian Linux. Я установил пакеты python-scitoolsи ipython. Сообщение об ошибке ValueError: invalid literal for int() with base 10: '#'. Я посмотрю, смогу ли я заставить это работать в любом случае ...
Valmiky Arquissandas
Мне удалось (путем выполнения кода непосредственно внутри ipython, и изменения map(int, line)к map(ord, line), и уточнен вопрос с новой картины.
Valmiky Аркиссандаш
У меня ушел год, но я решил принять этот ответ. Я до сих пор не знаю, что это за поток битов, но, вероятно, не узнаю. У этого есть хороший образец, все же!
Валмики Аркиссандас
1

Я почти ничего не знаю об анализе сигналов, но 2-мерная визуализация может быть легко выполнена с использованием R. В частности, вам понадобятся reshape2и ggplot2пакеты. Предполагая, что ваши данные широки (например, размер [n X 256]), сначала вам нужно преобразовать их в длинный формат, используя melt()функцию из reshape2пакета. Тогда используйте geom_tileгеометрию из ggplot2. Вот хороший рецепт с сущностью .

sobach
источник
2
Это более 4 ГБ данных. Я должен построить это, читая из stdin или что-то подобное. Это плохая идея загружать все в оперативную память. Я посмотрю на то, что вы сказали через пару дней - и, надеюсь, любые другие идеи, которые могут возникнуть - и я дам вам знать, как все прошло, спасибо!
Valmiky Arquissandas
Не загружайте его и не рассматривайте как фрейм данных, это не фрейм данных, это поток байтов.
Spacedman
1

Я бы посмотрел на rasterпакет для этого, который может читать необработанные двоичные данные и представлять его в виде сетки NxM. Он может даже извлекать подмножества больших двоичных сеток, не считывая весь файл (сам растр R является просто прокси для данных, а не для самих данных).

Spacedman
источник