Khoảng cách Euclide giữa hai điểm tương ứng với độ dài của đoạn thẳng giữa hai điểm. Giả sử rằng chúng ta có hai điểm A [x₁, y₁] và B [x₂, y₂], khoảng cách Euclide giữa các điểm được minh họa trong sơ đồ bên dưới
Euclidean Khoảng cách giữa hai điểm — Nguồn. Tác giả
Công thức toán học được sử dụng để tính khoảng cách euclide giữa hai điểm, được đưa ra dưới đây
d = √[[x₂ — x₁]² + [y₂ — y₁]²]
Trong hướng dẫn ngắn ngày hôm nay, chúng ta sẽ khám phá một vài cách khác nhau để bạn có thể tính Khoảng cách Euclide khi làm việc với mảng NumPy. Cụ thể hơn, chúng tôi sẽ giới thiệu cách thực hiện bằng cách sử dụng
- phương pháp
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
3
5.196152422706632 - gói
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
4
5.196152422706632 - và sự kết hợp của các phương pháp
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5 và
5.196152422706632euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
6
5.196152422706632
Trước tiên, hãy tạo một mảng NumPy mẫu mà chúng ta sẽ tham khảo trong các phần sau để minh họa một vài cách khác nhau để tính toán Khoảng cách Euclide
import numpy as npa = np.array[[1, 2, 3]]
b = np.array[[4, 5, 6]]print[a]
array[[1, 2, 3]]print[b]
array[[4, 5, 6]]
Tính khoảng cách Euclide bằng linalg. định mức[]
Tùy chọn đầu tiên chúng ta có khi tính toán khoảng cách Euclide là hàm
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]7, được sử dụng để trả về một trong tám định mức ma trận khác nhau
5.196152422706632
Khoảng cách Euclide thực sự là chuẩn l2 và theo mặc định, hàm
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]0 tính toán chuẩn thứ hai [xem đối số
5.196152422706632
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]1]
5.196152422706632
Do đó, để tính Khoảng cách Euclide, chúng ta chỉ cần chuyển hiệu của hai mảng NumPy cho hàm này
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
Tính khoảng cách Euclide bằng SciPy
Gói Scipy cung cấp một mô-đun có nhiều chức năng tính toán các loại số liệu khoảng cách khác nhau, bao gồm Khoảng cách Euclide. Cụ thể hơn, hàm
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]2 có thể tính Khoảng cách Euclide giữa hai mảng 1-D
5.196152422706632
from scipy.spatial.distance import euclideaneuclidean_distance = euclidean[a, b]print[euclidean_distance]
5.196152422706632
Viết chức năng của riêng chúng tôi
Cuối cùng, một giải pháp thay thế khác [một cách khá rõ ràng mà tôi muốn nói] là chỉ cần viết hàm rất riêng của chúng ta để có thể tính Khoảng cách Euclide giữa hai mảng đầu vào
Bây giờ chúng ta hãy xem lại định nghĩa toán học của Khoảng cách Euclide mà chúng ta đã thảo luận ở đầu bài viết
d = √[[x₂ — x₁]² + [y₂ — y₁]²]
Chức năng được chia sẻ bên dưới sẽ thực hiện chính xác điều này
def compute_euclidean[x, y]:
return np.sqrt[np.sum[[x-y]**2]]
Và cuối cùng, hãy đảm bảo rằng kết quả giống hệt với hai cách tiếp cận đã nói ở trên
euclidean_distance = compute_euclidean_distance[a, b]print[euclidean_distance]
5.196152422706632
Suy nghĩ cuối cùng
Trong bài viết hôm nay, chúng ta đã thảo luận về Khoảng cách Euclide và cách tính khoảng cách này khi làm việc với mảng NumPy và Python. Cụ thể hơn, chúng tôi đã giới thiệu cách tính toán nó bằng ba cách tiếp cận khác nhau;
Trở thành thành viên và đọc mọi câu chuyện trên Medium. Phí thành viên của bạn hỗ trợ trực tiếp cho tôi và các nhà văn khác mà bạn đọc. Bạn cũng sẽ có toàn quyền truy cập vào mọi câu chuyện trên Phương tiện
Tôi muốn giải thích về câu trả lời đơn giản với các ghi chú hiệu suất khác nhau. np. linalg. định mức có lẽ sẽ làm nhiều hơn bạn cần
________số 8Đầu tiên - chức năng này được thiết kế để hoạt động trên một danh sách và trả về tất cả các giá trị, e. g. để so sánh khoảng cách từ
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
8 đến tập hợp các điểm sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
9sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
Ghi nhớ vài điều
- Các cuộc gọi hàm Python rất tốn kém
- [Thông thường] Python không tra cứu tên trong bộ đệm
Cho nên
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]2
5.196152422706632
không ngây thơ như vẻ ngoài của nó
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]3
5.196152422706632
Đầu tiên - mỗi khi chúng ta gọi nó, chúng ta phải thực hiện tra cứu toàn cục cho "np", tra cứu theo phạm vi cho "linalg" và tra cứu theo phạm vi cho "norm" và chi phí cho việc gọi hàm đơn thuần có thể tương đương với hàng chục con trăn
Cuối cùng, chúng tôi đã lãng phí hai thao tác để lưu trữ kết quả và tải lại để trả về
Lần đầu tiên vượt qua cải tiến. tra cứu nhanh hơn, bỏ qua cửa hàng
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]4
5.196152422706632
Chúng tôi nhận được hợp lý hơn nhiều
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]5
5.196152422706632
Tuy nhiên, chi phí cuộc gọi chức năng vẫn chiếm một số công việc. Và bạn sẽ muốn thực hiện các điểm chuẩn để xác định xem liệu bạn có thể tự mình làm toán tốt hơn không
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]6
5.196152422706632
Trên một số nền tảng,
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]20 nhanh hơn
5.196152422706632
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]21. Số dặm của bạn có thể thay đổi
5.196152422706632
**** Ghi chú hiệu suất nâng cao
Tại sao bạn tính toán khoảng cách?
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]9
5.196152422706632
di chuyển dọc theo. Nhưng nếu bạn đang so sánh khoảng cách, thực hiện kiểm tra phạm vi, v.v. , tôi muốn thêm một số quan sát hiệu suất hữu ích
Hãy lấy hai trường hợp. sắp xếp theo khoảng cách hoặc chọn lọc danh sách các mục đáp ứng giới hạn phạm vi
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]0
5.196152422706632
Điều đầu tiên chúng ta cần nhớ là chúng ta đang sử dụng Pythagoras để tính khoảng cách [
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]22] vì vậy chúng ta đang thực hiện rất nhiều cuộc gọi
5.196152422706632
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]23. Toán 101
5.196152422706632
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]3
5.196152422706632
Nói ngắn gọn. cho đến khi chúng tôi thực sự yêu cầu khoảng cách theo đơn vị X chứ không phải X^2, chúng tôi có thể loại bỏ phần khó nhất của phép tính
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
0Tuyệt vời, cả hai chức năng không còn thực hiện bất kỳ căn bậc hai đắt tiền nào. Điều đó sẽ nhanh hơn nhiều, nhưng trước khi bạn đi xa hơn, hãy tự kiểm tra. tại sao sort_things_by_ distance lại cần tuyên bố từ chối trách nhiệm "ngây thơ" cả hai lần ở trên?
Chúng tôi có thể cải thiện in_range bằng cách chuyển đổi nó thành trình tạo
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
1Điều này đặc biệt có lợi nếu bạn đang làm điều gì đó như
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
2Nhưng nếu điều tiếp theo bạn sắp làm đòi hỏi một khoảng cách,
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
3xem xét năng suất bộ dữ liệu
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
4Điều này có thể đặc biệt hữu ích nếu bạn có thể kiểm tra phạm vi chuỗi ['tìm những thứ gần X và trong Nm của Y', vì bạn không phải tính lại khoảng cách]
Nhưng còn nếu chúng ta đang tìm kiếm một danh sách rất lớn gồm
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]24 và chúng ta dự đoán rằng rất nhiều trong số chúng không đáng để xem xét thì sao?
5.196152422706632
Thực sự có một tối ưu hóa rất đơn giản
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
5Điều này có hữu ích hay không sẽ phụ thuộc vào kích thước của 'mọi thứ'
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
6Và một lần nữa, hãy xem xét mang lại dist_sq. Ví dụ hotdog của chúng tôi sau đó trở thành
sP = set[points]
pA = point
distances = np.linalg.norm[sP - pA, ord=2, axis=1.] # 'distances' is a list
7[*a1. Phím sắp xếp của sort_things_by_ distance gọi distance_sq cho mọi mục đơn lẻ và phím trông vô tội đó là lambda, đây là hàm thứ hai phải được gọi. ]