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 Show 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
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
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)) 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 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ố euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)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) Tính khoảng cách Euclide bằng SciPyGó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 from scipy.spatial.distance import euclideaneuclidean_distance = euclidean(a, b)print(euclidean_distance) Viết chức năng của riêng chúng tôiCuố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
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): 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) Suy nghĩ cuối cùngTrong 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ừ 8 đến tập hợp các điểm 9
Ghi nhớ vài điều
Cho nên euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)2 không ngây thơ như vẻ ngoài của nó euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)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)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 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 Trên một số nền tảng, euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)20 nhanh hơn euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)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)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)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)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)23. Toán 101 euclidean_distance = np.linalg.norm(a - b)print(euclidean_distance)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 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 1Điều này đặc biệt có lợi nếu bạn đang làm điều gì đó như 2Nhưng nếu điều tiếp theo bạn sắp làm đòi hỏi một khoảng cách, 3xem xét năng suất bộ dữ liệu 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? Thực sự có một tối ưu hóa rất đơn giản 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ứ' 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 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. ) |