Wizualizacja danych do analizy wzorców (niezależna od języka, ale preferowana R)


11

Chcę wykreślić bajty z obrazu dysku, aby zrozumieć wzorzec w nich. Jest to głównie zadanie akademickie, ponieważ jestem prawie pewien, że ten wzorzec został stworzony przez program do testowania dysków, ale i tak chciałbym go przebudować.

Wiem już, że wzór jest wyrównany, z częstotliwością 256 znaków.

Mogę wyobrazić sobie dwa sposoby wizualizacji tej informacji: albo płaszczyznę 16 x 16 widzianą w czasie (3 wymiary), gdzie kolor każdego piksela to kod ASCII znaku, lub linię 256 pikseli dla każdego okresu (2 wymiary).

To jest migawka wzoru (możesz zobaczyć więcej niż jeden), widziane przez xxd(32x16):

Wzór do analizy

Tak czy inaczej, staram się znaleźć sposób wizualizacji tych informacji. Prawdopodobnie nie jest to trudne do analizy sygnałów, ale nie mogę znaleźć sposobu na użycie oprogramowania typu open source.

Chciałbym uniknąć Matlaba lub Mathematiki i wolę odpowiedź w języku R, ponieważ uczyłem się jej niedawno, ale mimo to każdy język jest mile widziany.


Aktualizacja, 2014-07-25: biorąc pod uwagę odpowiedź Emre poniżej, tak wygląda wzór, biorąc pod uwagę pierwsze 30 MB wzoru, wyrównane do 512 zamiast 256 (to wyrównanie wygląda lepiej):

Wzór graficzny

Wszelkie dalsze pomysły są mile widziane!


Przykład / fragment danych (może tylko kilka MB) może być interesujący.
Marco13,

Jeśli interesuje Cię okresowy charakter danych, spojrzenie na DFT danych może być odkrywcze.
mrmcgreg

@mrmcgreg: Będę musiał ponownie nauczyć się, jak działa DFT. Powinienem był zwrócić większą uwagę na klasy sygnałów i systemów :)
Valmiky Arquissandas

Odpowiedzi:


5

Użyłbym analizy wizualnej. Ponieważ wiesz, że powtarzane są co 256 bajtów, utwórz obraz o szerokości 256 pikseli o dowolnej głębokości i zakoduj dane przy użyciu jasności. W pytaniu (i) wyglądałoby to tak:

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);

Tak wygląda plik PDF:

Wizualizowany plik PDF

256-bajtowy wzór okresowy objawiłby się jako linie pionowe. Z wyjątkiem nagłówka i ogona wygląda dość głośno.


To wygląda tak, jak szukam. Studiuję teraz do finałów i nie mogę poświęcić czasu na przemyślenie tego ponownie, ale jak tylko będę mógł, dam ci znać. „256-bajtowy wzór okresowy objawiłby się jako linie pionowe”. - dokładnie o czym myślałem. Mogę również pokazać obraz, w którym umieszczam wszystkie 256 bajtów w tym samym wierszu, a to jest już oczywiste w tekście. Jestem bardzo ciekawy, co z tego wyjdzie :)
Valmiky Arquissandas

Nie mogę tego uruchomić w systemie Debian Linux. Zainstalowałem pakiety python-scitoolsi ipython. Komunikat o błędzie to ValueError: invalid literal for int() with base 10: '#'. Zobaczę, czy i tak mogę to zrobić ...
Valmiky Arquissandas

Udało mi się (poprzez uruchomienie kodu bezpośrednio wewnątrz ipythoni zmienia map(int, line)się map(ord, line), i aktualizowane na pytanie z nowym obrazem.
Valmiky Arquissandas

Zajęło mi to rok, ale zdecydowałem się przyjąć tę odpowiedź. Nadal nie wiem, co to za strumień bitów, ale prawdopodobnie się nie dowiem. Ma jednak ładny wzór!
Valmiky Arquissandas

1

Nie wiem prawie nic na temat analizy sygnałów, ale wizualizację dwuwymiarową można łatwo wykonać przy użyciu R. Szczególnie będziesz potrzebować reshape2i ggplot2pakietów. Zakładając, że twoje dane są szerokie (np. Rozmiar [n X 256]), najpierw musisz przekształcić je na długi format za pomocą melt()funkcji z reshape2pakietu. Następnie użyj geom_tilegeometrii z ggplot2. Oto fajny przepis z istotą .


2
To ponad 4 GB danych. Powinienem wykreślić to, czytając ze standardowego wejścia lub czegoś podobnego. Załadowanie wszystkiego do pamięci RAM jest złym pomysłem. Przyjrzę się temu, co powiedziałeś za kilka dni - i mam nadzieję, że pojawią się inne pomysły - i dam ci znać, jak poszło, dzięki!
Valmiky Arquissandas

Nie ładuj go i traktuj jak ramkę danych, nie jest to ramka danych, to strumień bajtów.
Spacedman

1

Chciałbym spojrzeć na rasteropakowaniu do tego, co można przeczytać w surowych danych binarnych i przedstawić go jako siatek NXM. Może nawet wyodrębniać podzbiory dużych siatek binarnych bez konieczności odczytywania całego pliku (sam obiekt rastrowy R jest jedynie proxy danych, a nie samych danych).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.