Tìm thành viên chung: Chuyển vị
Có thể bạn đã nhận ra: khi chuyển sang biểu diễn ma trận thưa, bạn sẽ mất metadata từ đồ thị. Bây giờ bạn sẽ học cách gán lại metadata để có thể khám phá thêm về thành viên chung.
user_matrix mà bạn đã tính ở bài trước đã được nạp sẵn vào không gian làm việc của bạn.
Ở đây, hàm np.where() sẽ rất hữu ích. Cách hoạt động như sau: với một mảng, ví dụ a = [1, 5, 9, 5], nếu bạn muốn lấy các chỉ số có giá trị bằng 5, bạn có thể dùng idxs = np.where(a == 5). Kết quả trả về là một mảng trong một tuple, (array([1, 3]),). Để truy cập các chỉ số đó, bạn cần đánh chỉ mục vào tuple như idxs[0].
Bài tập này là một phần của khóa học
Phân tích mạng nâng cao với Python
Hướng dẫn bài tập
- Tìm tên những người là thành viên của nhiều câu lạc bộ nhất.
- Để làm điều này, trước tiên tính
diagbằng phương thức.diagonal()trênuser_matrix. - Sau đó, dùng
np.where()để chọn các chỉ số nơidiagbằngdiag.max(). Hàm này trả về một tuple: Hãy chắc rằng bạn truy cập đúng các chỉ số bằng cách đánh chỉ mục vào tuple với[0]. - Lặp qua
indicesvà in ra từng chỉ sốicủapeople_nodesbằng hàmprint()đã cho.
- Để làm điều này, trước tiên tính
- Đặt đường chéo về 0 và chuyển nó sang "định dạng ma trận tọa độ". Đoạn mã này đã được cung cấp sẵn trong phần đáp án.
- Tìm các cặp người dùng có số câu lạc bộ chung nhiều nhất.
- Dùng
np.where()để lấy các chỉ số màusers_coo.databằngusers_coo.data.max(). - Lặp qua
indices2và in ra từng chỉ sốidxcủausers_coo.rowvàusers_coo.coltrongpeople_node.
- Dùng
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
import numpy as np
# Find out the names of people who were members of the most number of clubs
diag = ____
indices = np.where(____ == ____)[0]
print('Number of clubs: {0}'.format(diag.max()))
print('People with the most number of memberships:')
for i in indices:
print('- {0}'.format(____))
# Set the diagonal to zero and convert it to a coordinate matrix format
user_matrix.setdiag(0)
users_coo = user_matrix.tocoo()
# Find pairs of users who shared membership in the most number of clubs
indices2 = np.where(____ == ____)[0]
print('People with most number of shared memberships:')
for idx in indices2:
print('- {0}, {1}'.format(people_nodes[____.____[____]], people_nodes[____.____[____]]))