在本文中,我將嘗試解釋 SVD 背后的數(shù)學(xué)及其幾何意義,還有它在數(shù)據(jù)科學(xué)中的最常見的用法,圖像壓縮。
奇異值分解是一種常見的線性代數(shù)技術(shù),可以將任意形狀的矩陣分解成三個(gè)部分的乘積:U、S、V。原矩陣A可以表示為:
具體來說,A矩陣中的奇異值就是\Sigma矩陣中的對(duì)角線元素,它們是矩陣A的特征值的平方根,表示A矩陣在各個(gè)主方向上的拉伸程度。U矩陣是AAT的特征向量構(gòu)成的正交矩陣,表示數(shù)據(jù)集在降維后的新的坐標(biāo)系中的投影。V矩陣是ATA的特征向量構(gòu)成的正交矩陣,表示每個(gè)數(shù)據(jù)點(diǎn)在降維后的新坐標(biāo)系中的坐標(biāo)。
一個(gè)矩陣的奇異值(singular values)是指其奇異值分解中的\Sigma矩陣的對(duì)角線上的元素,也就是特征值的平方根。換句話說,矩陣的奇異值是矩陣的奇異值分解中量度矩陣對(duì)輸入矩陣進(jìn)行的線性變換的尺度因子。
奇異值在很多應(yīng)用中都有廣泛的應(yīng)用,例如在圖像處理中,它可以用來對(duì)圖像進(jìn)行壓縮和降噪;在推薦系統(tǒng)中,它可以用來對(duì)用戶的偏好進(jìn)行建模和推薦相關(guān)的產(chǎn)品或服務(wù);在自然語言處理中,它可以用來對(duì)文本數(shù)據(jù)進(jìn)行降維和特征提取等。
數(shù)學(xué)原理
如果我們有一個(gè)矩陣A
要計(jì)算 SVD,首先需要通過找到 AA^{T} 的特征值來計(jì)算奇異值。
上述矩陣的特征方程為:
所以得到的奇異值是:
奇異向量就是 ATA 的正交特征向量集。ATA 的特征值是 25、9 和 0,由于 ATA 是對(duì)稱的,我們知道特征向量是正交的。
所以,先計(jì)算 λ=25
然后進(jìn)行化簡:
其方向的單位向量為:
同理 對(duì)于 λ = 9,特征向量為:
對(duì)于第三個(gè)特征向量 0,我們可以使用它垂直于 v1 和 v2 的屬性:
求解上述方程得到第三個(gè)特征向量
現(xiàn)在,我們計(jì)算 U,得到
這樣就得到了最終的 SVD 方程:
圖像壓縮
通過僅保留最重要的奇異值及其對(duì)應(yīng)的奇異向量,SVD 被用于圖像壓縮以減小圖像的大小。這可以從根本上減少在不丟失其最重要的視覺數(shù)據(jù)的情況下存儲(chǔ)圖像所需的額外存儲(chǔ)量。
我們將使用下面的圖像進(jìn)行圖像壓縮:
導(dǎo)入庫和讀取圖片十分簡單
import requests
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.bmp')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_image = gray_image.astype(np.float64)
這里我們將圖像轉(zhuǎn)換成灰度圖,執(zhí)行奇異值分解
U, s, V = np.linalg.svd(gray_image, full_matrices=False)
numpy中就包含了該方法,所有我們直接調(diào)用即可,我們看看前 10 個(gè)奇異值
top_10_singular_values = s[:10]
可視化
plt.plot(range(1, len(s) + 1), s, 'r-')
plt.xlabel("Rankings")
plt.ylabel("Singular Values")
plt.title("Singular Values versus their Rankings")
plt.savefig("Singular_values_vs_rankings.png")
plt.show()
從奇異值和排序圖中可以注意到圖像的大部分值都包含在少量奇異值中,所以可以得出到較高的奇異值包含的圖像信息水平非常低,這也說明使用奇異值分解進(jìn)行降維和圖像壓縮是可行的。
現(xiàn)在,讓我們嘗試重建和顯示圖像。
k_values = [10, 50, 100]
plt.figure(figsize=(12,6))
for i in range(len(k_values)):
low_rank = U[:, :k_values[i]] @ np.diag(s[:k_values[i]]) @ V[:k_values[i], :]
plt.subplot(2,3,i+1),
plt.imshow(low_rank, cmap='gray'),
plt.title(f"For K value = {k_values[i]}")
plt.savefig("Reconstruction_with_k_values.png")
可以注意到具有不同 K 值的所有圖像都有顯著差異。使用了前 10 個(gè)奇異值,結(jié)果圖像一點(diǎn)也不清晰。使用了前 50 個(gè)奇異值,生成的圖像比之前的圖像清晰多了,但是還有一些輕微的模糊。當(dāng)我們使用前 100 個(gè)奇異值時(shí),圖像比前兩張圖像越來越清晰,基本和原圖很接近了。隨著 K 值的增加,圖像的清晰度也會(huì)增加。
總結(jié)
本文介紹了奇異值分解 (SVD) 的數(shù)學(xué)原理和一個(gè)實(shí)際的應(yīng)用案例,可以看到SVD是一種強(qiáng)大的圖像壓縮方法,有助于在減小圖像尺寸的同時(shí)保留大部分重要的視覺信息。
https://avoid.overfit.cn/post/f0a675aad6994b61a2aa93fb647a0633文章來源:http://www.zghlxwxcb.cn/news/detail-409081.html
作者:Neokai文章來源地址http://www.zghlxwxcb.cn/news/detail-409081.html
到了這里,關(guān)于奇異值分解(SVD)和圖像壓縮的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!