Python: Vectơ, Ma trận và Mảng với NumPy

Python Vectors Matrices



Trong bài học này, chúng ta sẽ xem xét một số mẹo và thủ thuật nhỏ gọn để chơi với vectơ, ma trận và mảng bằng cách sử dụng thư viện NumPy trong Python. Bài học này là một điểm khởi đầu rất tốt nếu bạn đang bắt đầu vào Khoa học dữ liệu và cần một số tổng quan toán học giới thiệu về các thành phần này và cách chúng ta có thể chơi với chúng bằng cách sử dụng NumPy trong mã.

Thư viện NumPy cho phép chúng ta thực hiện các hoạt động khác nhau cần được thực hiện trên các cấu trúc dữ liệu thường được sử dụng trong Học máy và Khoa học dữ liệu như vectơ, ma trận và mảng. Chúng tôi sẽ chỉ hiển thị hầu hết các hoạt động phổ biến với NumPy được sử dụng trong rất nhiều đường ống của Học máy. Cuối cùng, xin lưu ý rằng NumPy chỉ là một cách để thực hiện các phép toán, do đó, các phép toán chúng tôi hiển thị là trọng tâm chính của bài học này chứ không phải chính gói NumPy. Bắt đầu nào.







Vector là gì?

Theo Google, Vectơ là một đại lượng có hướng cũng như độ lớn, đặc biệt là xác định vị trí của một điểm trong không gian so với một điểm khác.





Vectơ rất quan trọng trong Học máy vì chúng không chỉ mô tả độ lớn mà còn là hướng của các đối tượng địa lý. Chúng ta có thể tạo một vectơ trong NumPy bằng đoạn mã sau:





nhập khẩunhưví dụ

row_vector = np.array([1,2,3])
in(row_vector)

Trong đoạn mã trên, chúng tôi đã tạo một vectơ hàng. Chúng ta cũng có thể tạo một vectơ cột như sau:

nhập khẩunhưví dụ

col_vector = np.array([[1],[2],[3]])
in(col_vector)

Lập ma trận

Ma trận có thể hiểu đơn giản là một mảng hai chiều. Chúng ta có thể tạo ma trận với NumPy bằng cách tạo một mảng đa chiều:



ma trận = np.array([[1,2,3],[4,5,6],[7,số 8,9]])
in(ma trận)

Mặc dù ma trận hoàn toàn giống với mảng đa chiều, cấu trúc dữ liệu ma trận không được khuyến khích do hai lý do:

  1. Mảng là tiêu chuẩn khi nói đến gói NumPy
  2. Hầu hết các hoạt động với NumPy trả về mảng chứ không phải ma trận

Sử dụng ma trận thưa thớt

Để nhắc nhở, ma trận thưa thớt là ma trận trong đó hầu hết các mục bằng 0. Bây giờ, một kịch bản phổ biến trong xử lý dữ liệu và học máy là xử lý các ma trận trong đó hầu hết các phần tử đều bằng không. Ví dụ: hãy xem xét một ma trận có các hàng mô tả mọi video trên Youtube và các cột đại diện cho từng người dùng đã đăng ký. Mỗi giá trị đại diện cho việc người dùng đã xem video hay chưa. Tất nhiên, phần lớn các giá trị trong ma trận này sẽ bằng không. Các lợi thế với ma trận thưa thớt là nó không lưu trữ các giá trị bằng 0. Điều này dẫn đến một lợi thế lớn về tính toán và tối ưu hóa lưu trữ.

Hãy tạo ma trận tia lửa ở đây:

từ scipy nhập thưa thớt

original_matrix = np.array([[1,0,3],[0,0,6],[7,0,0]])
thưa_matrix = thưa.csr_matrix(original_matrix)
in(thưa_matrix)

Để hiểu mã hoạt động như thế nào, chúng ta sẽ xem kết quả đầu ra ở đây:

Trong đoạn mã trên, chúng tôi đã sử dụng hàm NumPy để tạo Đã nén hàng thưa thớt ma trận trong đó các phần tử khác 0 được biểu diễn bằng cách sử dụng các chỉ mục dựa trên 0. Có nhiều loại ma trận thưa thớt khác nhau, như:

  • Nén cột thưa thớt
  • Danh sách danh sách
  • Từ điển các phím

Chúng tôi sẽ không đi sâu vào các ma trận thưa thớt khác ở đây nhưng biết rằng mỗi công dụng của chúng là cụ thể và không ai có thể được gọi là 'tốt nhất'.

Áp dụng các phép toán cho tất cả các phần tử vectơ

Đó là một kịch bản phổ biến khi chúng ta cần áp dụng một phép toán chung cho nhiều phần tử vectơ. Điều này có thể được thực hiện bằng cách xác định một lambda và sau đó vectơ hóa giống nhau. Hãy xem một số đoạn mã cho cùng một đoạn mã:

ma trận = np.array([
[1,2,3],
[4,5,6],
[7,số 8,9]])

mul_5 = lambda x: x* 5
vectorized_mul_5 = np.vectorize(mul_5)

vectorized_mul_5(ma trận)

Để hiểu mã hoạt động như thế nào, chúng ta sẽ xem kết quả đầu ra ở đây:

Trong đoạn mã trên, chúng tôi đã sử dụng hàm vectorize là một phần của thư viện NumPy, để biến đổi một định nghĩa lambda đơn giản thành một hàm có thể xử lý từng phần tử của vectơ. Điều quan trọng cần lưu ý là vectơ hóa là chỉ là một vòng lặp qua các phần tử và nó không ảnh hưởng đến hiệu suất của chương trình. NumPy cũng cho phép phát thanh truyền hình , có nghĩa là thay vì đoạn mã phức tạp ở trên, chúng ta có thể chỉ cần thực hiện:

ma trận* 5

Và kết quả sẽ hoàn toàn giống nhau. Tôi muốn hiển thị phần phức tạp trước, nếu không bạn đã bỏ qua phần này!

Trung bình, Phương sai và Độ lệch Chuẩn

Với NumPy, có thể dễ dàng thực hiện các thao tác liên quan đến thống kê mô tả trên vectơ. Giá trị trung bình của một vectơ có thể được tính như sau:

np.mean(ma trận)

Phương sai của một vectơ có thể được tính như sau:

np.var(ma trận)

Độ lệch chuẩn của một vectơ có thể được tính như sau:

ví dụ: std(ma trận)

Kết quả của các lệnh trên trên ma trận đã cho được đưa ra ở đây:

Chuyển đổi một ma trận

Chuyển đổi là một hoạt động rất phổ biến mà bạn sẽ nghe đến bất cứ khi nào bạn bị bao quanh bởi các ma trận. Hoán vị chỉ là một cách để hoán đổi các giá trị cột và hàng của một ma trận. Xin lưu ý rằng một vectơ không thể được chuyển đổi như một vectơ chỉ là một tập hợp các giá trị mà các giá trị đó không được phân loại thành các hàng và cột. Xin lưu ý rằng việc chuyển đổi một vectơ hàng thành một vectơ cột không phải là chuyển vị (dựa trên các định nghĩa của đại số tuyến tính, nằm ngoài phạm vi của bài học này).

Bây giờ, chúng ta sẽ tìm thấy sự bình yên chỉ bằng cách chuyển đổi một ma trận. Rất đơn giản để truy cập chuyển vị của một ma trận với NumPy:

ma trận.T

Kết quả của lệnh trên trên ma trận đã cho ở đây:

Thao tác tương tự có thể được thực hiện trên một vectơ hàng để chuyển nó thành một vectơ cột.

Làm phẳng một ma trận

Chúng ta có thể chuyển đổi ma trận thành mảng một chiều nếu chúng ta muốn xử lý các phần tử của nó theo kiểu tuyến tính. Điều này có thể được thực hiện với đoạn mã sau:

matrix.flatten()

Kết quả của lệnh trên trên ma trận đã cho ở đây:

Lưu ý rằng ma trận làm phẳng là một mảng một chiều, đơn giản là tuyến tính theo kiểu thời trang.

Tính toán Eigenvalues ​​và Eigenvectors

Eigenvector được sử dụng rất phổ biến trong các gói Học máy. Vì vậy, khi một hàm biến đổi tuyến tính được trình bày dưới dạng ma trận, thì X, Eigenvectors là các vectơ chỉ thay đổi theo tỷ lệ của vectơ mà không thay đổi hướng của nó. Chúng ta có thể nói về điều đó:

Xv = γv

Ở đây, X là ma trận vuông và γ chứa các giá trị Eigen. Ngoài ra, v chứa các Eigenvectors. Với NumPy, thật dễ dàng để tính toán Eigenvalues ​​và Eigenvectors. Đây là đoạn mã mà chúng tôi chứng minh giống nhau:

đánh giá, evectors = np.linalg.eig(ma trận)

Kết quả của lệnh trên trên ma trận đã cho ở đây:

Sản phẩm chấm của Vectors

Tích của Vectơ là một cách nhân 2 vectơ. Nó cho bạn biết về có bao nhiêu vectơ cùng hướng , trái ngược với tích chéo cho bạn biết điều ngược lại, mức độ nhỏ của các vectơ cùng hướng (được gọi là trực giao). Chúng ta có thể tính tích số chấm của hai vectơ như đã cho trong đoạn mã tại đây:

a = np.array([3,5,6])
b = np.array([2. 3,mười lăm,1])

np.dot(a, b)

Đầu ra của lệnh trên trên các mảng đã cho được đưa ra ở đây:

Thêm, trừ và nhân ma trận

Thêm và Trừ nhiều ma trận là hoạt động khá đơn giản trong ma trận. Có hai cách để thực hiện điều này. Hãy xem đoạn mã để thực hiện các thao tác này. Với mục đích đơn giản, chúng ta sẽ sử dụng cùng một ma trận hai lần:

np.add(ma trận, ma trận)

Tiếp theo, hai ma trận có thể được trừ đi như sau:

np.subtract(ma trận, ma trận)

Kết quả của lệnh trên trên ma trận đã cho ở đây:

Như mong đợi, mỗi phần tử trong ma trận được cộng / trừ với phần tử tương ứng. Nhân ma trận tương tự như tìm tích số chấm như chúng ta đã làm trước đó:

np.dot(ma trận, ma trận)

Đoạn mã trên sẽ tìm giá trị nhân thực sự của hai ma trận, được cho là:

ma trận*ma trận

Kết quả của lệnh trên trên ma trận đã cho ở đây:

Phần kết luận

Trong bài học này, chúng ta đã đi qua rất nhiều phép toán liên quan đến Vectơ, Ma trận và Mảng thường được sử dụng Xử lý dữ liệu, thống kê mô tả và khoa học dữ liệu. Đây là một bài học nhanh chỉ bao gồm những phần phổ biến nhất và quan trọng nhất của rất nhiều khái niệm nhưng những hoạt động này sẽ cung cấp một ý tưởng rất tốt về những gì tất cả các hoạt động có thể được thực hiện khi xử lý các cấu trúc dữ liệu này.

Vui lòng chia sẻ phản hồi của bạn một cách thoải mái về bài học trên Twitter với @linuxhint@sbmaggarwal (chính là tôi!).