【scipy 基础】--稀疏矩阵
稀疏矩陣是一種特殊的矩陣,其非零元素數(shù)目遠(yuǎn)遠(yuǎn)少于零元素數(shù)目,并且非零元素分布沒有規(guī)律。
這種矩陣在實際應(yīng)用中經(jīng)常出現(xiàn),例如在物理學(xué)、圖形學(xué)和網(wǎng)絡(luò)通信等領(lǐng)域。
稀疏矩陣其實也可以和一般的矩陣一樣處理,之所以要把它區(qū)分開來進(jìn)行特殊處理,是因為:
一方面稀疏矩陣的存儲空間開銷通常比稠密矩陣要小得多,可以節(jié)省存儲空間;
另一方面,在計算稀疏矩陣時,可以利用其特殊的結(jié)構(gòu),采用專門的算法,提高計算效率和準(zhǔn)確性。
因此,稀疏矩陣在Scipy庫中被單獨作為一個模塊,以便被更好地處理和應(yīng)用。
1. 主要功能
稀疏矩陣子模塊(scipy.sparse)的主要功能包括:
| 類別 | 說明 |
|---|---|
| 稀疏數(shù)組類 | 支持各種格式的稀疏數(shù)組 |
| 稀疏矩陣類 | 支持各種格式的稀疏矩陣 |
| 稀疏矩陣工具 | 構(gòu)建,保存,加載以及識別稀疏矩陣的各種函數(shù) |
| 其他 | 包含壓縮稀疏圖例程,稀疏線性代數(shù)等子模塊,以及一些異常處理方法 |
這里有個需要注意的地方是稀疏數(shù)組和稀疏矩陣的區(qū)別。
這兩個類別中的很多函數(shù)名稱也類似,比如:bsr_array和bsr_matrix,coo_array和coo_matrix等等。
只要區(qū)別在于:***_matrix類的函數(shù)是一種基于Compressed Sparse Row(CSR)和Compressed Sparse Column(CSC)格式的塊稀疏矩陣表示方法。
它使用一個字典來存儲非零元素,其中每個元素對應(yīng)于一個包含三個值的元組,分別表示該元素的行索引、列索引和非零元素的值。
這種數(shù)據(jù)結(jié)構(gòu)可以提供更好的計算性能和內(nèi)存使用效率,特別適合于大規(guī)模的塊稀疏矩陣計算。
而***_array 類的函數(shù)雖然類似于***_matrix的數(shù)據(jù)結(jié)構(gòu),但它允許更大的靈活性。***_array 可以表示任意的稀疏數(shù)組,而不僅僅是塊稀疏矩陣。
它使用一個具有三個數(shù)組的元組來表示稀疏數(shù)組,其中第一個數(shù)組存儲行索引,第二個數(shù)組存儲列索引,第三個數(shù)組存儲非零元素的值。
這種數(shù)據(jù)結(jié)構(gòu)適用于更通用的稀疏數(shù)組計算,但可能不如***_matrix高效。
總之,***_matrix和***_array都是用于表示塊稀疏矩陣或稀疏數(shù)組的數(shù)據(jù)結(jié)構(gòu)。***_matrix更適合于大規(guī)模的塊稀疏矩陣計算,而***_array適用于更通用的稀疏數(shù)組計算。
2. 使用示例
稀疏矩陣之所以成為單獨的一個模塊,是因為它的稀疏的特性在很多領(lǐng)域多有廣泛的應(yīng)用。scipy.sparse子模塊中提供了大概7種:
- csc_matrix: 壓縮稀疏列格式(Compressed Sparse Column)
- csr_matrix: 壓縮稀疏行格式(Compressed Sparse Row)
- bsr_matrix: 塊稀疏行格式(Block Sparse Row)
- lil_matrix: 列表格式的列表(List of Lists format)
- dok_matrix: 鍵格式字典(Dictionary of Keys)
- coo_matrix: 坐標(biāo)格式(又名 IJV,三元組格式)
- dia_matrix: 對角線格式(DIAgonal format)
2.1. 使用稀疏矩陣
稀疏矩陣其實在運算上和使用普通矩陣一樣。
首先,構(gòu)造一個創(chuàng)建矩陣的方法create_matrix,這個方法會生成一個10x10的矩陣,
方法的參數(shù)N表示隨機在矩陣的N個位置中生成值。
from scipy import sparse
import numpy as np
# 創(chuàng)建一個10x10矩陣,其中有值的元素不超過N個
def create_matrix(N):
data = np.zeros((10, 10))
for _ in range(N):
row = np.random.randint(0, 10, 1)
col = np.random.randint(0, 10, 1)
data[row, col] = np.random.randint(1, 100, 1)
return data
create_matrix創(chuàng)建的是普通矩陣,我們將生成的矩陣轉(zhuǎn)換為稀疏矩陣后,計算方式差不多。
# 創(chuàng)建兩個普通矩陣
m1 = create_matrix(8)
m2 = create_matrix(6)
# 計算點積
m1.dot(m2) # 返回m1和m2的點積結(jié)果
# 將普通矩陣變?yōu)橄∈杈仃?#(這里的演示用了7種類型中的一種bsr)
d1 = sparse.bsr_matrix(m1)
d2 = sparse.bsr_matrix(m2)
# 計算點積后,用toarray方法轉(zhuǎn)換為二維數(shù)組
d1.dot(d2).toarray()
從上面的代碼可以看出,用scipy.sparse中的稀疏矩陣和使用一般矩陣差不多。
2.2. 稀疏矩陣的性能
我們使用稀疏矩陣,就是因為其運算性能比使用一般矩陣強,否則還不如直接用一般矩陣。
下面,簡單測試下scipy.sparse模塊下稀疏矩陣的性能。
先看其內(nèi)存占用是否有減少,為了讓性能差別能顯著看出,
先擴大測試矩陣為 1000x1000。
import sys
def create_matrix(N):
data = np.zeros((1000, 1000))
for _ in range(N):
row = np.random.randint(0, 1000, 1)
col = np.random.randint(0, 1000, 1)
data[row, col] = np.random.randint(1, 100, 1)
return data
m1 = create_matrix(8)
m2 = create_matrix(6)
d1 = sparse.csr_matrix(m1)
d2 = sparse.csr_matrix(m2)
print("一般矩陣 m1 占用的空間:{}".format(sys.getsizeof(m1)))
print("一般矩陣 m2 占用的空間:{}".format(sys.getsizeof(m2)))
print("一般矩陣 d1 占用的空間:{}".format(sys.getsizeof(d1)))
print("一般矩陣 d2 占用的空間:{}".format(sys.getsizeof(d2)))
# 運行結(jié)果:
一般矩陣 m1 占用的空間:8000128
一般矩陣 m2 占用的空間:8000128
一般矩陣 d1 占用的空間:56
一般矩陣 d2 占用的空間:56
可以看出占用的空間明顯縮小了。
再看點積的運算性能:(運行10輪,每輪100次)
%%timeit -r 10 -n 100
m1.dot(m2)
# 運行結(jié)果:
10.6 ms ± 136 μs per loop (mean ± std. dev. of 10 runs, 100 loops each)
稀疏矩陣的點積運算:
%%timeit -r 10 -n 100
d1.dot(d2)
# 運行結(jié)果:
137 μs ± 14.3 μs per loop (mean ± std. dev. of 10 runs, 100 loops each)
可以看出,運算性能差別非常大,一個是毫秒級別(10.6ms)的,一個是微秒級別(137 μs)的。
3. 總結(jié)
稀疏矩陣在矩陣中只是一種特殊的矩陣,然而在實際應(yīng)用領(lǐng)域中,卻應(yīng)用極廣,比如:
在數(shù)值計算中,可以用于解決大規(guī)模線性代數(shù)方程組、大規(guī)模非線性方程組和非線性優(yōu)化問題,以及求解大規(guī)模約束規(guī)劃問題。
在模式識別中,如人臉識別、手寫數(shù)字識別、文本分類等任務(wù),可用于表示高維數(shù)據(jù),提取特征并進(jìn)行降維,提高識別準(zhǔn)確率和計算效率。
在推薦系統(tǒng)中,處理大量用戶和物品的數(shù)據(jù)時,稀疏矩陣可以有效地表示這些數(shù)據(jù)。
在社交網(wǎng)絡(luò)中,因為一般社交關(guān)系都是稀疏的,所以可用于分析社交網(wǎng)絡(luò)的結(jié)構(gòu)和行為,例如社區(qū)檢測、影響力傳播。
此外,還可以用在計算機視覺,自然語言處理,生物信息學(xué)等等領(lǐng)域。
所以,研究稀疏矩陣有其重要的實際意義。
總結(jié)
以上是生活随笔為你收集整理的【scipy 基础】--稀疏矩阵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个性签名爱情宣言
- 下一篇: 设计模式(十四)命令