Visualisasi data untuk analisis pola (tidak tergantung bahasa, tetapi lebih disukai R)

11

Saya ingin memplot byte dari image disk untuk memahami pola di dalamnya. Ini terutama tugas akademis, karena saya hampir yakin pola ini dibuat oleh program pengujian disk, tetapi saya tetap ingin merekayasa baliknya.

Saya sudah tahu bahwa polanya selaras, dengan periodisitas 256 karakter.

Saya dapat membayangkan dua cara memvisualisasikan informasi ini: baik bidang 16x16 dilihat melalui waktu (3 dimensi), di mana setiap warna piksel adalah kode ASCII untuk karakter, atau garis 256 piksel untuk setiap periode (2 dimensi).

Ini adalah snapshot dari pola (Anda dapat melihat lebih dari satu), terlihat melalui xxd(32x16):

Pola untuk dianalisis

Apa pun itu, saya mencoba menemukan cara memvisualisasikan informasi ini. Ini mungkin tidak sulit bagi siapa pun untuk melakukan analisis sinyal, tetapi sepertinya saya tidak dapat menemukan cara menggunakan perangkat lunak sumber terbuka.

Saya ingin menghindari Matlab atau Mathematica dan saya lebih suka jawaban dalam R, karena saya telah mempelajarinya baru-baru ini, tapi tetap saja, bahasa apa saja boleh diterima.


Pembaruan, 2014-07-25: berdasarkan jawaban Emre di bawah ini, polanya terlihat seperti ini, diberikan 30 MB pertama dari pola, sejajar pada 512 dan bukan 256 (perataan ini terlihat lebih baik):

Pola grafis

Ada ide lebih lanjut!

Valmiky Arquissandas
sumber
Contoh / kutipan data (mungkin hanya beberapa MB) bisa menarik.
Marco13
Jika Anda tertarik pada sifat periodik data, lihat DFT data yang bisa diungkapkan.
mrmcgreg
@ mrmcgreg: Saya harus mempelajari kembali cara kerja DFT. Saya seharusnya lebih memperhatikan kelas sinyal & sistem :)
Valmiky Arquissandas

Jawaban:

5

Saya akan menggunakan analisis visual. Karena Anda tahu ada pengulangan setiap 256 byte, buat gambar 256 piksel selebar berapa pun dalamnya, dan enkode data menggunakan kecerahan. Dalam (i) python akan terlihat seperti ini:

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

Seperti inilah bentuk PDF:

File PDF divisualisasikan

Pola periodik 256 byte akan memanifestasikan dirinya sebagai garis vertikal. Kecuali untuk tajuk dan ekornya, itu terlihat sangat berisik.

Emre
sumber
Ini terlihat seperti apa yang saya cari. Saya belajar untuk final sekarang dan tidak dapat mengambil waktu untuk memikirkan hal ini lagi, tetapi begitu saya bisa, saya akan memberi tahu Anda. "Pola periodik 256 byte akan bermanifestasi sebagai garis vertikal." - persis apa yang aku pikirkan. Saya juga bisa menampilkan gambar di mana saya meletakkan semua 256 byte di baris yang sama, dan itu sudah jelas dalam teks. Saya cukup ingin tahu tentang apa yang akan keluar darinya :)
Valmiky Arquissandas
Sepertinya saya tidak bisa menjalankan ini di Debian Linux. Saya menginstal paket python-scitoolsdan ipython. Pesan kesalahannya adalah ValueError: invalid literal for int() with base 10: '#'. Saya akan melihat apakah saya bisa membuatnya bekerja ...
Valmiky Arquissandas
Saya berhasil (dengan menjalankan kode langsung di dalam ipython, dan mengubah map(int, line)ke map(ord, line), dan memperbarui pertanyaan dengan gambar baru.
Valmiky Arquissandas
Butuh waktu satu tahun, tetapi saya memutuskan untuk menerima jawaban ini. Saya masih tidak tahu apa itu bitstream, tapi saya mungkin tidak akan tahu. Itu memang memiliki pola yang bagus!
Valmiky Arquissandas
1

Saya hampir tidak tahu tentang analisis sinyal, tetapi visualisasi 2 dimensi dapat dengan mudah dilakukan menggunakan R. Khususnya Anda akan membutuhkan reshape2dan ggplot2paket. Dengan asumsi data Anda lebar (misalnya ukuran [n X 256]), pertama-tama Anda perlu mengubahnya menjadi format panjang menggunakan melt()fungsi dari reshape2paket. Kemudian gunakan geom_tilegeometri dari ggplot2. Ini resep bagus dengan intisari .

sobach
sumber
2
Ini lebih dari 4 GB data. Saya harus merencanakannya dengan membaca dari stdin atau yang serupa. Itu ide yang buruk untuk memuat semuanya ke RAM. Saya akan melihat apa yang Anda katakan dalam beberapa hari - dan mudah-mudahan, ide-ide lain yang mungkin muncul - dan saya akan memberitahu Anda bagaimana hasilnya, terima kasih!
Valmiky Arquissandas
Jangan memuatnya dan memperlakukannya seperti kerangka data, ini bukan kerangka data, ini aliran byte.
Spacedman
1

Saya akan melihat rasterpaket untuk ini, yang dapat membaca data biner mentah dan menyajikannya sebagai kisi NxM. Ia bahkan dapat mengekstrak himpunan bagian dari kotak biner besar tanpa harus membaca keseluruhan file (objek R raster itu sendiri hanyalah proksi ke data, bukan data itu sendiri).

Spacedman
sumber