Vector trong Python

Như đã hứa, ở bài viết này mình sẽ chia sẻ đến các bạn những vấn đề nâng cao hơn về ma trận cũng như các hàm xử lý chúng bằng thư viện Numpy của Python. Mọi người có thể theo dõi lại bài viết trước của mình tại đây nếu chưa đọc hoặc có lỡ quên phần kiến ​​thức nào nha. Các vấn đề được đề cập trong bài viết này có lẽ sẽ hơi khó hiểu với những bạn chưa từng tìm hiểu về Đại số tuyến tính. Tuy nhiên, mình sẽ cố gắng truyền tải đến các bạn một cách dễ hiểu nhất

Change the size of the battle with Reshape

Khi làm việc với ma trận, chúng ta thường phải sử dụng các thao tác thay đổi kích thước của chúng. Trong Numpy, ta có thể thực hiện qua chức năng. định hình lại

Chuyển từ một mảng thành hai chiều ma trận

A = np.array[[1, 2, 3, 4, 5, 6, 7, 8, 9]]
print[A.reshape[3, 3]]

Trong đoạn mã trên, mình thử chuyển một mảng một chiều có 9 phần tử sang một ma trận hai chiều có 3 hàng và 3 cột. Kết quả thu được như sau

[[1 2 3]
 [4 5 6]
 [7 8 9]]

Tất nhiên, khi chuyển đổi từ một mảng thành hai chiều, số lượng phần tử được giữ nguyên, do đó ta cần chú ý đến số hàng và cột số của màn hình hai chiều để tránh lỗi nha

Chuyển từ hai chiều ma trận về một mảng

Ngược lại, ta có thể chuyển hai chiều ma trận về một chiều bằng phương thức. định hình lại [-1]

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
print[A.reshape[-1]]

Kết quả thu được là

[1 2 3 4 5 6 7 8 9]

Thay đổi số hàng, số cột của ma trận

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]]
print[A.reshape[3, 4]]

Trong đoạn code trên, mình thử chuyển ma trận A gồm 4 hàng và 3 cột thành 3 hàng và 4 cột. Cùng xem kết quả ra sao nhé

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

Class of ma trận

Hạng của ma trận, được định nghĩa là hạng cao nhất của định thức con khác 0 của ma trận đó. Người ta còn định nghĩa của ma trận là số vector độc lập tuyến tính tối đa khác 0 có trong A. Tuy nhiên, mình thấy cách định nghĩa này hơi khó gần đối với những bạn chưa tìm hiểu về Đại số tuyến tính

Xếp hạng ký hiệu của trận đấu A là hạng[A]

Có nhiều phương pháp để xác định hạng của trận đấu. Ta có thể thực hiện các biến đổi sơ cấp cho phép để đưa ra lệnh cấm bắt đầu về một ma trận hình thang. Các biến được phép chuyển đổi cấp độ thông thường sử dụng đó là

  • Đổi 2 hàng hoặc 2 cột cho nhau
  • Nhân phần tử của cùng 1 hàng hoặc cột với một số thực khác 0
  • Cộng vào các phần tử của 1 hàng hoặc cột các phần tử tương ứng của hàng khác hoặc cột khác cùng nhân với một số

Để mọi người dễ hình dung, mình sẽ thử biến đổi sơ cấp để tính điểm của ma trận sau

Đến đây thì mọi người đã có cái nhìn rõ hơn về hạng của mẹ rồi nhỉ. Tất nhiên là có nhiều phương pháp để xác định hạng của ma trận, bên ngoài phương pháp biến đổi sơ cấp như trên.  

Trong Numpy, ta có thể sử dụng hàm. linalg. matrix_rank[] to find the Xếp hạng của ma trận như sau

A = np.array[[[-2, 1, 0, 2, 3, -1], [4, 2, -1, 0, -2, 1], [6, 5, -2, 2, -1, 1], [-6, -1, 1, 2, 5, -2]]]
print[np.linalg.matrix_rank[A]]

Kết quả trả về vẫn sẽ là 2

Vết sẹo của ma trận

Vết [dấu vết] của một ma trận hình vuông, được định nghĩa bằng tổng các phần tử trên đường chéo chính của ma trận đó.  

Trong Numpy, ta có thể sử dụng 2 cách sau để tính vết của ma trận

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
# trace
print[np.trace[A]]
print[A.trace[]]

Kết quả trả lại sẽ bằng 15.  

Chuẩn bị cho trận đấu

Trong tọa độ Oxy, chúng ta thường sử dụng khoảng cách Euclide [thông qua định lý Pythagoras quen thuộc] để tính khoảng cách giữa 2 điểm, hay là tính độ dài của một vectơ,nhằm xem điểm này gần với điểm nào, 2 điểm nào . Mở rộng ra cho không gian nhiều chiều, tức là vector nhiều chiều, chúng ta cũng cần có một công thức để tính "khoảng cách" giữa chúng. Điều này dẫn tới sự ra đời của khái niệm về chuẩn mực [norm]. Có nhiều tiêu chuẩn khác nhau ứng với các không gian khác nhau, tuy nhiên, trong bài viết này, mình sẽ đề cập đến ba tiêu chuẩn thường dùng đối với một ma trận hàng n cột bất kỳ

Các bạn thấy Frobenius chuẩn không có thuộc tính nào. Công thức tính chuẩn Frobenius của một ma trận khá tương đồng với các công thức tính khoảng cách giữa 2 điểm trong hệ tọa độ Oxy, hay độ dài của 1 véc tơ mà mình đã học trong chương trình THPT. Đối với tiêu chuẩn này, mình còn có thể sử dụng vết của ma trận để tính như sau

Đối với hàng chuẩn, ta dùng câu lệnh như sau

________số 8

Kết quả thu được là 33. 0

Đối với cột tiêu chuẩn, ta sử dụng câu lệnh sau

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]]
print[np.linalg.norm[A, ord=1]]

Kết quả trả về là 30. 0

Đối với tiêu chuẩn Frobenius, ta tính theo cách sau

[[1 2 3]
 [4 5 6]
 [7 8 9]]
0

Ta thử dùng công thức tính theo vết ma trận để tính Frobenius theo tiêu chuẩn nào nhé

[[1 2 3]
 [4 5 6]
 [7 8 9]]
1

Kết quả trả lại đều sẽ là 25. 495097567963924

Chuẩn của ma trận được sử dụng rất nhiều để đánh giá sai số trong thuật toán giải quyết hệ thống phương pháp, tìm ma trận nghịch đảo,. như đánh giá tính toán đúng đắn trong thuật toán Máy học, đặc biệt là chuẩn Frobenius. Cách tính cũng rất đơn giản phải không nào, nên các bạn hãy nắm chắc nha

Private and vector private of the ma trận

Cho ma trận A level n. Ta có định nghĩa sau về giá trị riêng và vector riêng

Từ công thức kia, ta có một cách biến đổi quen thuộc trong Đại số tuyến tính như sau

Như vậy, để tồn tại các véc tơ X khác 0, ta có điều kiện sau

Giải phương trình [**] ta thu được các giá trị riêng và ứng với đó, thay vào phương trình [*] ta được các vector riêng tương ứng. Tất nhiên, cách giải công nghệ này chỉ có thể áp dụng được với các ma trận cỡ nhỏ thôi, vì cấp của ma trận ngày càng lớn thì khối lượng phép tính cũng sẽ tăng lên rất nhiều. Có một số phương pháp giúp tìm giá trị riêng và vector riêng mà các bạn có thể tham khảo như phương pháp Danilevsky, phương pháp tích lũy hay phương pháp xuống thang,. Việc tìm giá trị riêng và vector riêng có nghĩa là vô cùng lớn, đặc biệt là ứng dụng trong nén hình ảnh, giảm dung lượng của hình ảnh [Các bạn học machine learning chắc chắn sẽ gặp bài toán khai thác SVD -  Singular Value Decomposition]

Có một số tính chất sau mà ta cần lưu ý

Đặc biệt hơn, ta có mối liên hệ giữa định thức và giá trị riêng như sau

Trong Numpy, ta có thể tính giá trị riêng và vector riêng theo cách như sau

[[1 2 3]
 [4 5 6]
 [7 8 9]]
2

Kết quả trả lại sẽ là

[[1 2 3]
 [4 5 6]
 [7 8 9]]
3

Ma trận đồng dạng

Cho hai ma trận A và B cùng cấp n. Ta nói ma trận A đơn dạng với ma trận B [A ~ B] nếu tồn tại ma trận T không suy biến [có định thức khác 0] sao cho

 

Một tính chất quan trọng mà chúng ta cần biết, đó là hai ma trận đồng dạng có cùng giá trị riêng, do đó chúng có cùng các véc tơ riêng tương ứng với các giá trị riêng đó. Làm như vậy, thay vì đi tìm giá trị riêng của ma trận ban đầu [vốn dĩ có thể vô cùng phức tạp], chúng ta có thể tìm thấy một ma trận đơn giản hơn và đồng dạng với nó. Các bạn có thể đọc thêm về phương pháp Danilevsky, ở đây người ta sẽ biến đổi về một ma trận đặc biệt, được gọi là ma trận Frobenius

Một vài hàm thao tác với hàng, cột và trên toàn màn hình

hàm np. Tổng[]

Để tính tổng tất cả các phần tử của ma trận, ta sử dụng hàm np. sum[] as after

[[1 2 3]
 [4 5 6]
 [7 8 9]]
4

Kết quả trả về là 45

Để tính tổng các phần tử trên từng cột, ta làm như sau

[[1 2 3]
 [4 5 6]
 [7 8 9]]
5

Kết quả thu được là

[[1 2 3]
 [4 5 6]
 [7 8 9]]
6

Tương tự như vậy, ta có thể tính tổng số phần tử trên mỗi hàng

[[1 2 3]
 [4 5 6]
 [7 8 9]]
7

Kết quả trả lại là

[[1 2 3]
 [4 5 6]
 [7 8 9]]
8

hàm np. phút[]

hàm np. min[] để tính phần tử nhỏ nhất của một màn hình như sau

[[1 2 3]
 [4 5 6]
 [7 8 9]]
9

Kết quả trả lại là 1

Tương tự như trên, ta có thể thêm vào axis=0 để tính phần tử nhỏ nhất của từng cột và axis=1 để tính phần tử nhỏ nhất của từng hàng

hàm np. tối đa[]

Chúng ta có thể đoán được tác dụng của hàm này rồi nhỉ, đảo ngược với hàm np. min[] return value nhỏ nhất, then function np. max[] return phần tử lớn nhất trên cả trận, trên từng hàng hay từng cột

hàm np. bần tiện[]

hàm np. mean[] sẽ trả về trung bình cộng các phần tử của toàn bộ ma trận, trung bình cộng của từng hàng hay từng cột

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
print[A.reshape[-1]]
0

Kết quả trả lại là

A = np.array[[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
print[A.reshape[-1]]
1

Tổng kết

Như vậy, qua bài viết này, các bạn đã biết nhiều hơn các kiến ​​thức về ma trận cũng như các hàm xử lý chúng. Tất nhiên, những gì mình chia sẻ ở trên không phải là quá đủ, nhưng  mình nghĩ đó là những gì cần thiết nhất về ma trận mà các bạn cần bám trụ trước khi bắt đầu học về Machine Learning. Mọi người sai sót cũng như thắc mắc về bài viết của mình mong các bạn để lại comment phía bên dưới.  

Chủ Đề