糾刪碼簡介


糾刪碼(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分解時,所論矩陣必須是列滿秩矩陣。

算法步驟

  1. 寫出矩陣的列向量;
  2. 列向量按照Schmidt正交化正交;
  3. 得出矩陣的Q′,R′;
  4. 對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)

參考文獻:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM