在目前人工智能领域,模型的得出主要还是依靠数据驱动,面对几十万甚至上百万的数据,如何对数据进行清洗、提取有代表性的信息成了主要的选择。
在数据处理中PCA最主要的作用为:数据压缩、降维——将高维数据提取主成分,用主成分的性质代表数据的整体特征。通过降维可以减少大量的计算量、降低计算的复杂性。在本文中,我们就来分析一下"PCA"是如何把高维数据变为低维数据的。
一、PCA原理
PCA的思想为:通过分析数据的相同部分与不同部分,保持数据的主成分(数据固有特性)不变,同时对于对无关信息的损失,达到将高维数据降到低维数据的目的。
PCA的要点:(1)主成分不变;(2)细微的损失;(3)高维数据降到低微数据;
PCA降维的过程如图:
在图像中而言,通过PCA分析,可以提前图像的关键因素——重心;在另一个层面,对图像进行PCA分析,既可以实现对图像数据的降维,又可起到对图像特征的提取。
PCA降维过程描述为:
样本数据:样本数据可以是来自社会或生活中各种各样的数据,不论大小,只要可以用矩阵进行表述即可;
减去均值:对数据进行整体降低数值,降低计算难度;
计算协方差矩阵:求取协方差矩阵,大大降低了数据的维度;
计算特征值与特征向量:提取数据的主要特征,及整体特征,并依据特征值的大小保留特征当中最具代表性的特征;
形成新的数据样本:依据提取的K个主要特征便可重新生成具有相同特征的低维度的数据样本。
二、Opencv中PCA分析
在图像处理中如何使用PCA的呢?一般情况下,首先对图像进行轮廓提取,得到轮廓特征及其轮廓坐标构造二维特征。然后将二维轮廓特征组成二维轮廓数组进行PCA降维。
在此以寻找图像的重心为例来说明对PCA的使用。
分析的原始图像如下:
处理结果为:
分析:(1)图中的蓝色线即为“”第一“”的主成分;
(2)显示出了各个特征值及特征向量(即图像的主键)
(3)长线与短线分别代表主要特征与次要特征,可利用此特征对图像进行几何分析
主要代码粘贴如下:
double calcPCAOrientation(vector
&pts, Mat &image)
{
//对数据进行格式转换
int size = static_cast(pts.size());
Mat data_pts = Mat(size,2,CV_64FC1);
for (int i = 0; i
{
data_pts.at(i, 0) = pts[i].x;
data_pts.at(i, 1) = pts[i].y;
}
// 对符合格式的数据进行PCA分析
PCA pca_analysis(data_pts,Mat(),CV_PCA_DATA_AS_ROW);//PCA perform
//上面的API已经完成了PCA分析,以下为对PCA解析结果的分解
//每组数据的重心位置
circle(image ,cnt,2,Scalar(0,255,0),2,8,0);
vector
eigen_vectors(2);
vector eigen_vals(2);
//获取特征向量与特征值
for (int ii = 0; ii
{
printf("the %d eigen value : %.2f\n",ii,eigen_vals[ii]);
}
Point p1 = cnt +0.02* Point(static_cast(eigen_vectors[0].x*eigen_vals[0]), static_cast(eigen_vectors[0].y*eigen_vals[0]));
Point p2 = cnt -0.05*Point(static_cast(eigen_vectors[1].x*eigen_vals[1]), static_cast(eigen_vectors[1].y*eigen_vals[1]));
line(image,cnt,p1,Scalar(255,0,0),2,8,0);
line(image, cnt, p2, Scalar(255, 255, 0), 2, 8, 0);
double angle = atan2(eigen_vectors[0].y, eigen_vectors[0].x);
cout
return angle;
}
领取专属 10元无门槛券
私享最新 技术干货