Trực quan hóa dữ liệu để phân tích mẫu (độc lập với ngôn ngữ, nhưng ưu tiên R)


11

Tôi muốn vẽ các byte từ một hình ảnh đĩa để hiểu một mẫu trong đó. Đây chủ yếu là một nhiệm vụ học tập, vì tôi gần như chắc chắn mô hình này được tạo ra bởi một chương trình kiểm tra đĩa, nhưng dù sao tôi cũng muốn thiết kế lại nó.

Tôi đã biết rằng mô hình được căn chỉnh, với chu kỳ 256 ký tự.

Tôi có thể hình dung hai cách trực quan hóa thông tin này: mặt phẳng 16x16 được xem qua thời gian (3 chiều), trong đó mỗi màu của pixel là mã ASCII cho ký tự hoặc dòng 256 pixel cho mỗi khoảng thời gian (2 chiều).

Đây là ảnh chụp nhanh của mẫu (bạn có thể thấy nhiều hơn một), nhìn qua xxd(32x16):

Mô hình để phân tích

Dù bằng cách nào, tôi đang cố gắng tìm cách hình dung thông tin này. Điều này có lẽ không khó cho bất kỳ ai trong việc phân tích tín hiệu, nhưng dường như tôi không thể tìm ra cách sử dụng phần mềm nguồn mở.

Tôi muốn tránh Matlab hoặc Mathematica và tôi muốn có câu trả lời trong R, vì tôi đã học nó gần đây, nhưng dù sao, bất kỳ ngôn ngữ nào đều được chào đón.


Cập nhật, 2014 / 07-25: đưa ra câu trả lời của Emre bên dưới, đây là mẫu trông như thế nào, với 30 MB đầu tiên của mẫu, được căn chỉnh ở 512 thay vì 256 (căn chỉnh này có vẻ tốt hơn):

Mô hình đồ họa

Bất kỳ ý tưởng hơn nữa đều được chào đón!


Một ví dụ / đoạn trích dữ liệu (có thể chỉ vài MB) có thể thú vị.
Marco13

Nếu bạn quan tâm đến tính chất định kỳ của dữ liệu, hãy xem DFT của dữ liệu có thể được tiết lộ.
mrmcgreg

@mrmcgreg: Tôi sẽ phải tìm hiểu lại cách hoạt động của DFT. Tôi nên chú ý nhiều hơn đến các lớp tín hiệu & hệ thống :)
Valmiky Arquissandas

Câu trả lời:


5

Tôi sẽ sử dụng một phân tích trực quan. Vì bạn biết rằng cứ sau 256 byte lại có một sự lặp lại, hãy tạo một hình ảnh rộng 256 pixel bằng nhiều độ sâu và mã hóa dữ liệu bằng độ sáng. Trong (i) python nó sẽ trông như thế này:

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

Đây là bản PDF trông như sau:

Một tệp PDF được hiển thị

Một mẫu tuần hoàn 256 byte sẽ có biểu hiện là các đường thẳng đứng. Ngoại trừ tiêu đề và đuôi nó trông khá ồn ào.


Điều này trông khá giống những gì tôi đang tìm kiếm. Bây giờ tôi đang học cho trận chung kết và không thể dành thời gian để suy nghĩ về điều này một lần nữa, nhưng ngay khi tôi có thể, tôi sẽ cho bạn biết. "Một mẫu tuần hoàn 256 byte sẽ có biểu hiện là các đường thẳng đứng." - chính xác những gì tôi đã nghĩ đến. Tôi cũng có thể hiển thị một hình ảnh trong đó tôi đặt tất cả 256 byte vào cùng một dòng và điều đó đã rõ ràng trong văn bản. Tôi khá tò mò về những gì sẽ xảy ra từ nó :)
Valmiky Arquissandas 22/07/14

Tôi dường như không thể chạy cái này trên Debian Linux. Tôi đã cài đặt các gói python-scitoolsipython. Thông báo lỗi là ValueError: invalid literal for int() with base 10: '#'. Tôi sẽ xem liệu tôi có thể làm cho nó hoạt động được không ...
Valmiky Arquissandas

Tôi đã thành công (bằng cách chạy mã trực tiếp bên trong ipython, và thay đổi map(int, line)đến map(ord, line), và cập nhật các câu hỏi với hình ảnh mới.
Valmiky Arquissandas

Mất tôi một năm, nhưng tôi quyết định chấp nhận câu trả lời này. Tôi vẫn không biết dòng bit đó là gì, nhưng có lẽ tôi sẽ không tìm ra. Nó có một mô hình đẹp, mặc dù!
Valmiky Arquissandas 20/07/2015

1

Tôi gần như không biết gì về phân tích tín hiệu, nhưng trực quan 2 chiều có thể dễ dàng thực hiện bằng R. Đặc biệt bạn sẽ cần reshape2ggplot2các gói. Giả sử dữ liệu của bạn rộng (ví dụ: kích thước [n X 256]), trước tiên bạn cần chuyển đổi nó sang định dạng dài bằng cách sử dụng melt()chức năng từ reshape2gói. Sau đó sử dụng geom_tilehình học từ ggplot2. Đây là một công thức tốt đẹp với ý chính .


2
Đó là hơn 4 GB dữ liệu. Tôi nên vẽ nó bằng cách đọc từ stdin hoặc một cái gì đó tương tự. Đó là một ý tưởng tồi để tải mọi thứ vào RAM. Tôi sẽ xem những gì bạn nói trong một vài ngày - và hy vọng, bất kỳ ý tưởng nào khác có thể phát sinh - và tôi sẽ cho bạn biết nó đã diễn ra như thế nào, cảm ơn!
Valmiky Arquissandas

Đừng tải nó vào và coi nó như một khung dữ liệu, nó không phải là một khung dữ liệu, đó là một luồng byte.
Spainedman

1

Tôi sẽ xem xét rastergói này, có thể đọc dữ liệu nhị phân thô và trình bày dưới dạng lưới NxM. Nó thậm chí có thể trích xuất các tập hợp con của lưới nhị phân lớn mà không cần phải đọc trong toàn bộ tệp (bản thân đối tượng raster R chỉ là proxy cho dữ liệu, không phải dữ liệu).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.