Візуалізація даних для аналізу шаблонів (незалежно від мови, але бажано R)


11

Я хочу побудувати байти з зображення диска, щоб зрозуміти в них візерунок. Це, головним чином, академічне завдання, оскільки я майже впевнений, що ця модель була створена програмою тестування дисків, але я хотів би все-таки реінжиніринг її.

Я вже знаю, що візерунок вирівняний, з періодичністю 256 символів.

Я можу передбачити два способи візуалізації цієї інформації: або площину 16х16, переглянуту через час (3 виміри), де кольором кожного пікселя є ASCII-код символу, або 256-піксельну лінію для кожного періоду (2 виміри).

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

Шаблон для аналізу

У будь-якому випадку я намагаюся знайти спосіб візуалізації цієї інформації. Це, мабуть, нікому не важко в аналізі сигналів, але я не можу знайти спосіб використання програмного забезпечення з відкритим кодом.

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


Оновлення, 2014-07-25: надаючи відповідь Емре нижче, ось так виглядає візерунок, враховуючи перші 30 Мб шаблону, вирівняні на 512 замість 256 (це вирівнювання виглядає краще):

Графічний візерунок

Будь-які подальші ідеї вітаються!


Приклад / уривок даних (може бути лише декілька МБ) може бути цікавим.
Marco13

Якщо вас цікавить періодичний характер даних, огляд DFT даних може виявити показовий характер.
mrmcgreg

@mrmcgreg: мені доведеться дізнатися, як працює DFT. Мені варто було б приділити більше уваги класам сигналів та систем :)
Valmiky Arquissandas

Відповіді:


5

Я б використав візуальний аналіз. Оскільки ви знаєте, що відбувається повторення кожні 256 байт, створіть зображення на 256 пікселів завширшки на скільки завгодно глибоких і кодуйте дані, використовуючи яскравість. У (i) 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 Аркіссандаш

Зайняв мене рік, але я вирішив прийняти цю відповідь. Я досі не знаю, що це за бітстрім, але я, мабуть, не дізнаюся. Він має приємний візерунок, хоча!
Valmiky Arquissandas

1

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


2
Це понад 4 ГБ даних. Я повинен побудувати це, прочитавши зі stdin чи щось подібне. Погана ідея завантажувати все в оперативну пам’ять. Я погляну на те, що ви сказали через пару днів - і, сподіваюся, будь-які інші ідеї, які можуть виникнути, - і дам вам знати, як все пройшло, дякую!
Valmiky Arquissandas

Не завантажуйте його в себе і ставитесь до нього як до фрейму даних, це не кадр даних, а потік байтів.
Spacedman

1

Я б дивився на raster пакет для цього, який може читати в необроблених бінарних даних і подавати їх у вигляді сіток NxM. Він може навіть витягувати підмножини великих бінарних сіток без необхідності читати у всьому файлі (сам R-растровий об'єкт є лише проксі до даних, а не самих даних).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.