【python-機器學習】2. 稀疏矩陣

在機器學習中,數據集往往非常龐大,但是很多情況下,其中包含大量的零元素。在矩陣中,若數值爲0的元素數目遠遠多於非0元素的數目,並且非0元素分佈沒有規律時,則稱該矩陣爲 稀疏矩陣;與之相反,若非0元素數目佔大多數時,則稱該矩陣爲 稠密矩陣

稀疏矩陣只保存矩陣中的非零元素,忽略值爲零的剩餘元素,這樣能節省大量的計算成本。

在壓縮的稀疏行(compressed sparse row, CSR) 矩陣中,可以使用下標標記矩陣元素中的非零值,在大型矩陣計算中,有明顯的優勢。

import numpy as np
from scipy import sparse

# 創建一個矩陣
matrix = np.array([[0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [3, 0, 0, 0, 0, 0]])

# 創建一個壓縮的稀疏行(compressed sparse row,CSR)矩陣
matrix_sparse = sparse.csr_matrix(matrix)

print(matrix_sparse)
# 結果:
#  (1, 1)	1
#  (2, 0)	3

在需要的時候,可以通過調用 todense() 函數將稀疏矩陣轉換回密集矩陣。

# 重建密集矩陣
B = matrix_sparse.todense()
print(B) 

當然,除了CSR外,還有許多其他類型的稀疏矩陣,比如,壓縮的稀疏列矩陣、表中表以及鍵值對詞典等,不同類型的稀疏矩陣適用於不同的場景,需要大家在學習及使用過程中多多比較、總結。

在許多情況中,需要先通過計算矩陣的稀疏性來判斷矩陣是稠密矩陣還是稀疏矩陣。雖然Numpy不提供直接計算矩陣稀疏性的函數。但是我們可以通過定義,利用矩陣中的非零值數量和矩陣大小來輕鬆地將稀疏度計算出來。

Numpy數組中的非零元素的數量可以由 count_nonzero() 函數給出,數組中的元素總個數可以由數組的 size 屬性給出。因此,可以將數組稀疏度計算爲:

sparsity = 1.0 - np.count_nonzero(matrix) / matrix.size

可得,上文中matrix矩陣的稀疏度爲0.8888888888888888。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章