2015-09-30 16 views
6

Tôi đang cố gắng thực hiện một cách để nhóm các điểm trong một tập dữ liệu thử nghiệm dựa trên sự tương đồng của chúng với tập dữ liệu mẫu, sử dụng khoảng cách Euclide. Bộ dữ liệu thử nghiệm có 500 điểm, mỗi điểm là một vectơ N chiều (N = 1024). Bộ dữ liệu đào tạo có khoảng 10000 điểm và mỗi điểm cũng là một vectơ 1024 mờ. Mục đích là để tìm khoảng cách L2 giữa mỗi điểm kiểm tra và tất cả các điểm mẫu để tìm mẫu gần nhất (không sử dụng bất kỳ hàm khoảng cách python nào). Kể từ khi mảng thử nghiệm và mảng đào tạo có kích cỡ khác nhau, tôi đã cố gắng sử dụng phát sóng:Chuẩn L2 hiệu quả của bộ nhớ bằng cách phát sóng Python

import numpy as np 
    dist = np.sqrt(np.sum((test[:,np.newaxis] - train)**2, axis=2)) 

nơi thử nghiệm là một loạt các hình dạng (500,1024) và đào tạo là một mảng của hình dạng (10000,1024). Tôi nhận được một MemoryError. Tuy nhiên, cùng một mã hoạt động cho các mảng nhỏ hơn. Ví dụ:

 test= np.array([[1,2],[3,4]]) 
    train=np.array([[1,0],[0,1],[1,1]]) 

Có cách nào hiệu quả hơn để thực hiện tính toán trên mà không có vòng lặp? Dựa trên các bài đăng trực tuyến, chúng ta có thể thực hiện L2-norm bằng cách sử dụng phép nhân nhân sqrt (X * X-2 * X * Y + Y * Y). Vì vậy, tôi thử như sau:

x2 = np.dot(test, test.T) 
    y2 = np.dot(train,train.T) 
    xy = 2* np.dot(test,train.T) 

    dist = np.sqrt(x2 - xy + y2) 

Kể từ khi các ma trận có hình dạng khác nhau, khi tôi đã cố gắng để phát sóng, có một không phù hợp kích thước và tôi không chắc chắn đúng cách để phát sóng là những gì (không có nhiều kinh nghiệm với Python phát thanh truyền hình). Tôi muốn biết cách nào đúng để thực hiện tính toán khoảng cách L2 như một phép nhân ma trận trong Python, nơi mà các ma trận có hình dạng khác nhau. Ma trận khoảng cách kết quả nên có khoảng cách [i, j] = Euclide giữa điểm kiểm tra i và điểm mẫu j.

nhờ

+0

Vì vậy, bạn đang tìm kiếm tổng cộng 5E6 khoảng cách cho vectơ có độ dài 1024? Hình dạng cuối cùng của bạn sẽ là (500, 10000) hoặc (10000, 500)? – wwii

+0

Nó sẽ là (500, 10000). Các điểm kiểm tra là các hàng, các điểm lấy mẫu là các cột của ma trận khoảng cách. – user1462351

Trả lời

1

Giản và phiên bản làm việc kể từ this answer:

x, y = test, train 

x2 = np.sum(x**2, axis=1, keepdims=True) 
y2 = np.sum(y**2, axis=1) 
xy = np.dot(x, y.T) 
dist = np.sqrt(x2 - 2*xy + y2) 

Vì vậy, các phương pháp mà bạn có trong tâm trí là đúng, nhưng bạn cần phải cẩn thận như thế nào bạn áp dụng nó.

Để làm cho cuộc sống của bạn dễ dàng hơn, hãy cân nhắc việc sử dụng các chức năng đã được kiểm tra và đã được chứng minh từ scipy hoặc scikit-learn.

12

Đây được phát sóng với hình dạng của các trung gian thực hiện rõ ràng:

m = x.shape[0] # x has shape (m, d) 
n = y.shape[0] # y has shape (n, d) 
x2 = np.sum(x**2, axis=1).reshape((m, 1)) 
y2 = np.sum(y**2, axis=1).reshape((1, n)) 
xy = x.dot(y.T) # shape is (m, n) 
dists = np.sqrt(x2 + y2 - 2*xy) # shape is (m, n) 

Các documentation trên phát thanh truyền hình có một số ví dụ khá tốt.

+0

chỉ cần sửa một chút ở dòng cuối 'dists = np.sqrt (x2 + y2 - 2 * x (y.T))' – Akash

0

Tôi nghĩ rằng những gì bạn đang yêu cầu đã tồn tại trong scipy dưới dạng chức năng cdist.

from scipy.spatial.distance import cdist 
res = cdist(test, train, metric='euclidean') 
Các vấn đề liên quan