主成份分析(principal component analysis,pca)也叫做主成份變換、主分量分析或 —l(karhunen—loeve)變換,是建立在統計特徵基礎上的多維(如多波段)正交線
性變換。它是遙感影象處理中最常用也是最有用的變換演算法之一。
這次我要實現乙個主成分分析演算法,圖是做出來了,但是和著名的遙感軟體pci和envi的效果比起來很差。如第一主成分的圖如下:
上面噪音極多,而且看起來不合諧。我知道自己的演算法有問題,在排除了自己的讀取影象的問題後。我考慮到是不是求取特徵矩陣時出了問題,因為主成分的輸出資料是y=x*a。
其中x為原影象,y為目標影象,a為特徵向量矩陣。由此我懷疑我的特徵矩陣求取有問題。後來從網上找了一種求特徵矩陣的辦法,進行主成分分析的效果。下面是具體的實現**:
//計算特徵向量
/*pdblcof[in][out]-----協方差矩陣
lchannelcount[in]------影象的輸入波段數
pdblvects[out]----特徵向量矩陣
dbleps[in]----誤差範圍,我取為0.0000001
ljt[in]-----迴圈次數,我取為1000000
*/static
intijcobimatrixcharactervalue(double**pdblcof,longlchannelcount,std::vector&pdblvects,doubledbleps,longljt)
while(1)
}if(fmreturn1;
if(l>ljt)return0;
l+=1;
u=p*lchannelcount+q;w=p*lchannelcount+p;t=q*lchannelcount+p;s=q*lchannelcount+q;
x=-pdblcof[p][q];
y=(pdblcof[q][q]-pdblcof[p][p])/2.0;
omega=x/sqrt(x*x+y*y);
if(y<0)omega=-omega;
sn=1.0+sqrt(1.0-omega*omega);
sn=omega/sqrt(2.0*sn);
cn=sqrt(1.0-sn*sn);
fm=pdblcof[p][p];
pdblcof[p][p]=fm*cn*cn+pdblcof[q][q]*sn*sn+pdblcof[p][q]*omega;
pdblcof[q][q]=fm*sn*sn+pdblcof[q][q]*cn*cn-pdblcof[p][q]*omega;
pdblcof[p][q]=0.0;
pdblcof[q][p]=0.0;
for(j=0;jif((j!=p)&&(j!=q))
for(i=0;iif((i!=p)&&(i!=q))
for(i=0;i
}return1;
}//根據特徵值從大到小排列特徵向量矩陣
/*pfmatrix[in][out]-----上一步輸出的協方差矩陣
nbandnum[in]------影象的輸入波段數
pdblvects[out]----上一步輸出的特徵向量矩陣
*/static
voidsorteigenvector(double**pfmatrix,intnbandnum,std::vector&pfvector)
if(p!=i) }}
}執行上面兩步之後,所得到的特徵矩陣為用於和原影象相乘的矩陣a.
對一幅tm影象的第1,2,3,4,5,7通道執行pca操作,效果圖如下:
第一主成分:
第二主成分:
第三主成分:
第四主成分:
第五主成分:
第六主成分:
從上面可以看出,正確的影象看起來視覺非常和諧,毫無刺目的感覺。
主成分分析實現的乙個心得
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!主成份分析 principal component analysis,pca 也叫做主成份變換 主分量分析或 l karhunen loeve 變換,是建立在統計特徵基礎上的多維 如多波段 正交線 性變換。它是遙感影象處理中最常用也是最有用的變換演...
主成分分析Matlab實現
資料匯入及處理 clcclear all a xlsread coach.xlsx b2 h16 資料標準化處理 a size a,1 b size a,2 for i 1 b sa i a i mean a i std a i end 計算相關係數矩陣的特徵值和特徵向量 cm corrcoef s...
Python 實現主成分分析
python 實現主成分分析 主成分分析 principal component analysis,pca 是最常用的一種降維方法,通常用於高維資料集的探索與視覺化,還可以用作資料壓縮和預處理等。矩陣的主成分就是其協方差矩陣對應的特徵向量,按照對應的特徵值大小進行排序,最大的特徵值就是第一主成分,其...