2012-02-06 33 views
10

Tôi có một mảng đôi, khoảng 200.000 hàng bởi 100 cột và tôi đang tìm một thuật toán nhanh để tìm các hàng có chứa các chuỗi tương tự nhất với mẫu đã cho (mẫu có thể ở bất kỳ đâu từ 10 đến 100 phần tử). Tôi đang sử dụng python, do đó, phương pháp bạo lực (mã bên dưới: lặp qua mỗi hàng và chỉ mục cột bắt đầu, và tính toán khoảng cách Euclide tại mỗi điểm) mất khoảng ba phút.Thuật toán nhanh để tìm kiếm mẫu trong tệp văn bản

Chức năng numpy.correlate hứa hẹn sẽ giải quyết vấn đề này nhanh hơn nhiều (chạy trên cùng một tập dữ liệu trong chưa đầy 20 giây). Tuy nhiên, nó chỉ đơn giản là tính toán một sản phẩm chấm trượt của mẫu trên toàn bộ hàng, có nghĩa là để so sánh sự tương tự tôi sẽ phải chuẩn hóa kết quả trước tiên. Bình thường hóa mối tương quan chéo đòi hỏi tính toán độ lệch chuẩn của mỗi phần dữ liệu, điều này ngay lập tức phủ nhận việc cải thiện tốc độ sử dụng numpy.correlate ngay từ đầu.

Có thể tính toán tương quan chéo chuẩn hóa nhanh chóng trong python không? Hoặc tôi sẽ phải nghỉ mát để mã hóa phương pháp bạo lực trong C?

def norm_corr(x,y,mode='valid'): 
    ya=np.array(y) 
    slices=[x[pos:pos+len(y)] for pos in range(len(x)-len(y)+1)] 
    return [np.linalg.norm(np.array(z)-ya) for z in slices] 

similarities=[norm_corr(arr,pointarray) for arr in arraytable] 
+0

Tôi không biết gumpy tốt, vì vậy chỉ cần ném một ý tưởng: có thể có một phương pháp trượt nhanh hơn để tính toán stddev? – liori

+0

Tôi dự định chỉ để thêm một sự tò mò: Tôi đã thử mã của bạn trên máy tính của tôi và nó chạy trong 7 giây. Tôi sẽ đề nghị cố gắng không tạo ra số lượng các đối tượng mảng đã được cắt lát, nhưng tôi vẫn chưa biết cách làm như thế. –

Trả lời

1

Nếu dữ liệu của bạn nằm trong mảng 2D Numpy, bạn có thể lấy lát 2D từ cột 200.000 hàng (mẫu) và tính toán chỉ tiêu cho tất cả các hàng cùng một lúc. Sau đó trượt cửa sổ sang phải trong vòng lặp for.

ROWS = 200000 
COLS = 100 
PATLEN = 20 
#random data for example's sake 
a = np.random.rand(ROWS,COLS) 
pattern = np.random.rand(PATLEN) 

tmp = np.empty([ROWS, COLS-PATLEN]) 
for i in xrange(COLS-PATLEN): 
    window = a[:,i:i+PATLEN] 
    tmp[:,i] = np.sum((window-pattern)**2, axis=1) 

result = np.sqrt(tmp) 
+0

chính xác những gì tôi đang tìm kiếm, cảm ơn! – sbrother

Các vấn đề liên quan