糾刪碼(Erasure Code)中的數學知識
背景
在數據存儲領域,Hadoop采用三副本策略有效的解決了存儲的容錯問題,但是三副本策略中磁盤的利用效率比較低,僅有33%,而且副本帶來的成本壓力實在太高,后來適時的出現了糾刪碼的概念。當冗余級別為n+m時,將這些數據塊分別存放在n+m個硬盤上,這樣就能容忍m個(假設初始數據有n個)硬盤發生故障。當不超過m個硬盤發生故障時,只需任意選取n個正常的數據塊就能計算得到所有的原始數據。糾刪碼以更低的存儲成本備受青睞,目前Microsoft、Google、Facebook、Amazon、淘寶(TFS)都已經在自己的產品中采用了Erasure Code.
在以上背景的基礎上,本文在糾刪碼的編碼、解碼中采用的矩陣數學知識,以及矩陣分解中用到的LU分解等數學知識進行分析,並在文末給出相應的代碼示例。
糾刪碼工作原理簡介:
RS(Reed-Solomom)碼是一種比較常見的糾刪碼,它的兩個參數m和n分別代表校驗塊個數和原始數據塊個數。
糾刪碼編碼過程:
在圖中的編碼過程,C代表校驗塊,D代表原始的數據塊。
當丟失了部分數據,如圖
糾刪碼解碼過程:
Step1:在編碼矩陣中去掉丟失數據塊以及該數據塊對應的行。即B矩陣變為了n*n 維度的方陣,C與D組合的矩陣由(n+m)行變為n行,在上述假設過程中,我們得到新的矩陣以及對應的矩陣運算關系式,其中在丟失了部分數據塊后,D所代表的原始數據塊便成為了要求的目標。
Step2:求B’的逆矩陣。
Step3:可以采用對等式兩邊同時乘上B’的逆矩陣,於是得到所求解。
為了保證B’逆矩陣是存在的,必須保證B’矩陣是可逆的,在通常的計算過程中,用於校檢的黃色部分數據塊采用范德蒙矩陣。
函數Inverse[B′]代表B'的逆矩陣,I代表單位矩陣:
Inverse[B′]∗B′∗D=Inverse[B′]∗S I∗D=Inverse[B′]∗S D=Inverse[B′]∗S
Python模擬糾刪碼數據恢復的流程
# Erasure Code import numpy as np # 備份數量 backup_up = 2 # 原始數據 data = np.array([1, 2, 3, 4, 5]) # 根據糾刪碼原理生成的數據 vander_data = np.concatenate((np.identity(len(data)), np.vander(data, 3).transpose()::-1]), axis=0) storage_data = vander_data.dot(data) print('生成數據',storage_data) # 模擬數據丟失 loss_data = np.concatenate((storage_data[0:3], storage_data[5:7]), axis=0)print('丟失后數據', loss_data) # 恢復數據 recover_data = np.linalg.inv(np.concatenate((vander_data[0:3], vander_data[5:7]), axis=0)).dot(loss_data) print('恢復數據',recover_data) # 輸出結果 # 生成數據 [ 1. 2. 3. 4. 5. 15. 55. 225.] # 丟失后數據 [ 1. 2. 3. 15. 55.] # 恢復數據 [1. 2. 3. 4. 5.]
正交分解
矩陣的正交分解又稱為QR分解,是將矩陣分解為一個正交矩陣Q和一個上三角矩陣的乘積的形式。任意實數方陣A,都能被分解為 。這里的Q為正交單位陣,即 R是一個上三角矩陣。這種分解被稱為QR分解。 QR分解也有若干種算法,常見的包括Gram–Schmidt、Householder和Givens算法。 QR分解是將矩陣分解為一個正交矩陣與上三角矩陣的乘積。這里僅記錄一下第一種分解的計算過程(Matlab代碼以及例題計算過程)。
Schmidt正交化
定理1 設A是n階實非奇異矩陣,則存在正交矩陣Q和實非奇異上三角矩陣R使A有QR分解;且除去相差一個對角元素的絕對值(模)全等於1的對角矩陣因子外,分解是唯一的.
定理2 設A是m×n實矩陣,且其n個列向量線性無關,則A有分解A=QR,其中Q是m×n實矩陣,且滿足QHTQ=E,R是n階實非奇異上三角矩陣該分解除去相差一個對角元素的絕對值(模)全等於1的對角矩陣因子外是唯一的.用Schmidt正交化分解方法對矩陣進行QR分解時,所論矩陣必須是列滿秩矩陣。
算法步驟
- 寫出矩陣的列向量;
- 列向量按照Schmidt正交化正交;
- 得出矩陣的Q′,R′;
- 對R′的列向量單位化得到Q,R′的每行乘R′每列的模
matlab代碼
function[X,Q,R] = QRSchmidt(A,b)
%方陣的QR的Gram-Schmidt正交化分解法,並用於求解AX=b方程組[m,n]=size(A);
if m~=n
%如果不是方陣,則不滿足QR分解要求
disp('不滿足QR分解要求');
end
Q=zeros(m,n);
X=zeros(n,1);
R=zeros(n);
for k=1:nR(k,k)=norm(A(:,k));
if R(k,k)==0
break;
end
Q(:,k)=A(:,k)/R(k,k);
for j=k+1:n
R(k,j)=Q(:,k)'*A(:,j);
A(:,j)=A(:,j)-R(k,j)*Q(:,k);
end
if nargin==2
b=Q'* b;
X(n)=b(n)/R(n,n);
for i=n-1:-1:1
X(i)=(b(i)-sum(R(i,i+1:n).*X(i+1:n)'))/R(i,i);
end
else
X=[];
end
end
手撕計算過程
matlab自帶方法
%產生一個3*3大小的魔方矩陣
A=magic(3)
[Q,R]=qr(A)