資源簡介
請參考我的關于PCA的博客,再運行該代碼,也附帶有一張用于測試的圖。

代碼片段和文件信息
#encoding:GBK
“““
Created?on?2019/09/23?16:19:11
@author:?Sirius_xuan
“““
‘‘‘
基于PCA的圖像降維及重構
‘‘‘
import?numpy?as?np
import?cv2?as?cv
def?Z(dataMat):
rowscols=dataMat.shape
meanVal?=?np.mean(dataMat?axis=0)??#?按列求均值,即求各個特征的均值
meanVal?=?np.tile(meanVal(rows1))
stdVal?=?np.std(dataMat?axis=0)?#?按列求標準差,即求各個特征的標準差
stdVal?=?np.tile(stdVal(rows1))
newdata?=?(dataMat-meanVal)?/?stdVal
return?newdata?meanVal
#數據中心化
def?Z_centered(dataMat):
rowscols=dataMat.shape
meanVal?=?np.mean(dataMat?axis=0)??#?按列求均值,即求各個特征的均值
meanVal?=?np.tile(meanVal(rows1))
‘‘‘
stdVal?=?np.std(dataMat?axis=0)?#?按列求標準差,即求各個特征的標準差
stdVal?=?np.tile(stdVal(rows1))
newdata?=?(dataMat-meanVal)?/?stdVal
‘‘‘
newdata?=?dataMat-meanVal
return?newdata?meanVal
#協方差矩陣
def?Cov(dataMat):
meanVal?=?np.mean(data0)?#壓縮行,返回1*cols矩陣,對各列求均值
meanVal?=?np.tile(meanVal?(rows1))?#返回rows行的均值矩陣
Z?=?dataMat?-?meanVal
Zcov?=?(1/(rows-1))*Z.T?*?Z
return?Zcov
#最小化降維造成的損失,確定k
def?Percentage2n(eigVals?percentage):
sortArray?=?np.sort(eigVals)??#?升序
sortArray?=?sortArray[-1::-1]??#?逆轉,即降序
arraySum?=?sum(sortArray)
tmpSum?=?0
num?=?0
for?i?in?sortArray:
tmpSum?+=?i
num?+=?1
if?tmpSum?>=?arraySum?*?percentage:
return?num
#得到最大的k個特征值和特征向量
def?EigDV(covMat?p):
D?V?=?np.linalg.eig(covMat)?#?得到特征值和特征向量
k?=?Percentage2n(D?p)?#?確定k值
print(“保留99%信息,降維后的特征個數:“+str(k)+“\n“)
eigenvalue?=?np.argsort(D)
K_eigenValue?=?eigenvalue[-1:-(k+1):-1]
K_eigenVector?=?V[:K_eigenValue]
return?K_eigenValue?K_eigenVector
#得到降維后的數據
def?getlowDataMat(DataMat?K_eigenVector):
return?DataMat?*?K_eigenVector
#重構數據
def?Reconstruction(lowDataMat?K_eigenVector?meanVal):
reconDataMat?=?lowDataMat?*?K_eigenVector.T?+?meanVal
return?reconDataMat
#PCA算法
def?PCA(data?p):
dataMat?=?np.float32(np.mat(data))
#數據中心化
dataMat?meanVal?=?Z_centered(dataMat)
#計算協方差矩陣
#covMat?=?Cov(dataMat)
covMat?=?np.cov(dataMat?rowvar=0)
#得到最大的k個特征值和特征向量
D?V?=?EigDV(covMat?p)
#得到降維后的數據
lowDataMat?=?getlowDataMat(dataMat?V)
#重構數據
reconDataMat?=?Reconstruction(lowDataMat?V?meanVal)
return?reconDataMat
def?main():
imagePath?=?‘D:/desktop/banana.jpg‘
image?=?cv.imread(imagePath)
image=cv.cvtColor(imagecv.COLOR_BGR2GRAY)
rowscols=image.shape
print(“降維前的特征個數:“+str(cols)+“\n“)
print(image)
print(‘----------------------------------------‘)
reconImage?=?PCA(image?0.99)
reconImage?=?reconImage.astype(np.uint8)
print(reconImage)
cv.imshow(‘test‘reconImage)
cv.waitKey(0)
cv.destroyAllWindows()
if?__name__==‘__main__‘:
main()
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????37701??2019-09-22?16:01??banana.jpg
?????文件???????2918??2019-09-23?19:21??PCA_TEST.py
-----------?---------??----------?-----??----
????????????????40619????????????????????2
- 上一篇:用Qt5寫的天氣預報界面
- 下一篇:無線信道的介紹
評論
共有 條評論