Python ma trận khoảng cách euclide

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]
    5.196152422706632
    3
  • gói
    euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
    5.196152422706632
    4
  • 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.196152422706632
    5 và
    euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
    5.196152422706632
    6

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]
5.196152422706632
7, được sử dụng để trả về một trong tám định mức ma trận khác nhau

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]
5.196152422706632
0 tính toán chuẩn thứ hai [xem đối số
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
1]

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]
5.196152422706632
2 có thể tính Khoảng cách Euclide giữa hai mảng 1-D

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
9

sP = 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]
5.196152422706632
2

không ngây thơ như vẻ ngoài của nó

euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
3

Đầ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]
5.196152422706632
4

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.196152422706632
5

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]
5.196152422706632
6

Trên một số nền tảng,

euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
20 nhanh hơn
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
21. Số dặm của bạn có thể thay đổi

**** 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]
5.196152422706632
9

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]
5.196152422706632
0

Đ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]
5.196152422706632
22] vì vậy chúng ta đang thực hiện rất nhiều cuộc gọi
euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
23. Toán 101

euclidean_distance = np.linalg.norm[a - b]print[euclidean_distance]
5.196152422706632
3

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
0

Tuyệ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
2

Như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
3

xem 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]
5.196152422706632
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?

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
6

Và 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. ]

Chủ Đề