Tag: eigen

[Code] Mixture-of-Gaussian C++ 实现

一个拟合高斯混合模型(GMM)的C++实现: https://github.com/CVLearner/Mixture-of-Gaussians 只依赖于Eigen,但是因为Eigen可以用到MKL的LAPACK/BLAS实现,所以间接地可以利用MKL加速。相比于OpenCV的实现,一个好处是可以用到多核。所以目前速度尚可,但还有提升空间。感觉上Eigen并没有完全利用到MKL的速度。

PCA的实现

PCA,全称是Principal component analysis,中文叫做主成分分析,是一种常用的数据处理手段。 直观的说,PCA是一种降维的手法。比如现在我们有1000个数据点,每个数据点是一个128维的向量,存储上可以是一个1000×128维的数组。经过PCA处理,我们仍然得到1000个数据点,但是每个数据点是一个小于128维的向量,比如我们用PCA将128维的数据降到64维。 PCA可以保证,在降维之后,数据表示的信息损失最小。 “损失最小”具体怎么定义? 还是以1000个128维的点为例,这1000个点,也就是1000个向量在一个128维的空间中。从在任何一维,也就是一个方向上来看,如果在这个方向上,各个向量大小差异很大,那么这个方向是很重要的。 也就是,反过来看,如果在某个方向上,每一个向量大小都很接近,那么如果不考虑这个方向,也就是去掉这一维的数据,对我们分析这1000个点并没有多大的影响。所以,“损失最小”对应着“差异最小”。 那么具体怎么做呢? 这里是两种常用的方法: SVD分解和EIG分解(特征值分解)。 共同点在于先从数据得到一个矩阵M,M的特征值个数对应着数据的维度,特征值越大那么对应的这一维越重要,也就是“差异越大”。 SVD分解, matlab sub_input_data = (input_data - repmat(mean(input_data),count,1))/sqrt(count-1); [U,S,V] = svd(sub_input_data); % First out_dim columns as PCA bases pcaV = V(:,1:out_dim); output_data = input_data * pcaV; EIG分解, matlab mean_input_data = mean(input_data); sub_input_data = input_data - repmat(mean_input_data, count,1); mean_mat = sub_input_data' * sub_input_data ./ (count