91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 5.94MB
    文件類型: .7z
    金幣: 1
    下載: 0 次
    發布日期: 2023-11-07
  • 語言: C/C++
  • 標簽: PCA??代碼??Opencv??

資源簡介

對主成分分析(PCA)的C++代碼實現,里面有對PCA實現步驟的詳細講解,并把自己寫的PCA代碼與Opencv自帶的PCA函數的運行結果進行了對比。

資源截圖

代碼片段和文件信息


#include
#include
#include“Eigen/Eigen“??
#include
using?namespace?Eigen;??
using?namespace?std;
using?namespace?cv;
void?BubbleSort(float?*pData?int?Count);//冒泡排序??
const?int?num?=?5;????//?樣本數量
const?int?dim?=?10;????//?樣本的維度(一張圖片的維度)??
const?int?pca_dim?=?4;//?pca?dimension?of?each?sample??

int?main()
{
//?原始數據:每一行代表一個樣本(這里為了測試時隨機生成的)
MatrixXf?data?=MatrixXf::Random(num?dim);
//?求每一維度上的平均值,即每一列的平均值,最后求出來是一個行向量
MatrixXf?mean?=data.colwise().mean();?????
cout<<“------------------Orignal?data-------------------------\n“< //cout<<“----------------Mean------------------\n“<
MatrixXf?C(num?dim);??//?data-mean
MatrixXf?C_T(dim?num);//?C的轉置
for(int?i=0;?i {
C.row(i)?=data.row(i)-mean;??//C=?data-mean
}
C_T?=C.transpose();?
/*
協方差矩陣A的維度為dim*dim,這里除不除dim最后結果都一樣,
在書中的定義中是要除的,估計是有數學含義的。
*/
MatrixXf?A?=C_T*C;
EigenSolver?sol_A;
????sol_A.compute(A);
//求協方差矩陣的特征值和特征向量
MatrixXf?eigenvals_A?=sol_A.eigenvalues().real();
MatrixXf?eigenvecs_A?=sol_A.eigenvectors().real();
//排序
float?a[dim]={0.0};
for(int?i=0;?i {
a[i]?=eigenvals_A(i?0);
}
BubbleSort(a?dim);?
MatrixXf?sorted_eigenvals_A(dim?1);
MatrixXf?sorted_eigenvecs_A(dim?dim);
//對特征值從大到小排序
for(int?i=0;?i {
sorted_eigenvals_A(i?0)?=a[i];
}
//對應的改變特征向量的排序
for(int?i=0;?i {
for(int?j=0;?j {
if(eigenvals_A(i?0)?==?a[j])
{
sorted_eigenvecs_A.col(j)?=eigenvecs_A.col(i);
}
}
}

//求PCA的投影矩陣及降維結果
MatrixXf?project_mat(dim?pca_dim);?//投影矩陣
MatrixXf?res(num?pca_dim);?????????//最終輸出,維度為num*pca_dim
for(int?i=0;?i {
project_mat.col(i)?=sorted_eigenvecs_A.col(i);
}

/*
res就是原始數據降維后的矩陣
特別注意,這里是C*project_mat即(data-mean)*project_mat
在網上看到很多人這里都是直接用的data*project_mat那樣是不對的
*/
res?=C*?project_mat;????

//-----------------------------OpenCV中的PCA--------------------------------//
CvMat?*pca_input?????????=cvCreateMat(?num?dim?CV_32FC1);???????????????//?輸入
CvMat?*pca_avg???????????=cvCreateMat(?1?dim?CV_32FC1); ??????????//?平均值?
CvMat?*pca_eigenvalue????=cvCreateMat(?1?std::min(num?dim)?CV_32FC1);??//?特征值??
CvMat?*pca_eigenvector???=cvCreateMat(?std::min(num?dim)?dim?CV_32FC1);//?特征向量
CvMat?*pca_eigenvector_T?=cvCreateMat(dim?std::min(num?dim)?CV_32FC1);?//?特征向量
CvMat?*pca_output????????=cvCreateMat(num?pca_dim?CV_32FC1);????????????//?輸出
//?數據導入
for(int?i=0;?i {
for(int?j=0;?j {
cvSetReal2D(pca_input?i?j?data(i?j));
}
}
cvCalcPCA(pca_input?pca_avg?pca_eigenvalue?pca_eigenvector?CV_PCA_DATA_AS_ROW);


cout<<“\n---------------Eeigen?Tool降維結果-----------------“< cout<
cout<<“---------------OpenCV?Tool降維結果---------------“< cvProjectPCA(pca_input?pca_avg?pca_eigenvector?pca_output);
//?數據輸出
for(i

評論

共有 條評論