PCA降维demo

PCA(Principal Components Analysis)主成分分析法是一种常用的减小数据维度的算法。

能力有限在这里就不做过多的数学分析了,具体原理可参见http://ufldl.stanford.edu/tutorial/unsupervised/PCAWhitening/ 以及更具体的CS229

这里结合网上代码做个简单的示例

static Mat formatImagesForPCA(const vector<Mat> &data)
{
    Mat dst(static_cast<int>(data.size()), data[0].rows*data[0].cols, CV_32F);
    for (unsigned int i = 0; i < data.size(); i++)
    {
        Mat image_row = data[i].clone().reshape(1, 1);
        Mat row_i = dst.row(i);
        image_row.convertTo(row_i, CV_32F);
    }
    return dst;
}

static Mat toGrayscale(InputArray _src) {
    Mat src = _src.getMat();
    // only allow one channel
    if (src.channels() != 1) {
        CV_Error(CV_StsBadArg, "Only Matrices with one channel are supported");
    }
    // create and return normalized image
    Mat dst;
    cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
    return dst;
}

void main(int argc, char** argv)
{
    Mat src1 = imread("F:\\cha_classification\\train\\c0.jpg");
    Mat src2 = imread("F:\\cha_classification\\train\\c1.jpg");
    Mat src3 = imread("F:\\cha_classification\\train\\c2.jpg");

    Mat g1, g2, g3;
    vector<Mat> gray;

    cvtColor(src1, g1, CV_RGB2GRAY);
    gray.push_back(g1);
    cvtColor(src2, g2, CV_RGB2GRAY);
    gray.push_back(g2);
    cvtColor(src3, g3, CV_RGB2GRAY);
    gray.push_back(g3);

    imshow("g1", g1);
    //waitKey(0);

    Mat data = formatImagesForPCA(gray);//data矩阵大小为:3*(18*18)//  cout << pcaSet << endl;
    PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW, 0.99);
    //PCA pca(data, Mat(), 200 );
    cout << pca.eigenvalues << endl;
    cout << endl;
    //cout << pca.eigenvectors << endl;

    // 将PCA降维的效果用第一张图片来显示出来。
    Mat point = pca.project(data.row(0)); // project into the eigenspace, thus the image becomes a "point"
    Mat reconstruction = pca.backProject(point); // re-create the image from the "point"
    reconstruction = reconstruction.reshape(gray[0].channels(), gray[0].rows); // reshape from a row vector into image shape
    reconstruction = toGrayscale(reconstruction); // re-scale for displaying purposes
    namedWindow("r", WINDOW_NORMAL);
    imshow("r", reconstruction);

    waitKey(0);
    //return 0;
}

简单的读取三张汉字的图片转换为灰度图像后将图片转为行的形式储存。利用opencv中pca进行分析后取

显示第一张图只降了一个维度看起来跟原图一样

时间: 2024-10-25 20:13:52

PCA降维demo的相关文章

[综] PCA降维

http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction 設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mxn matrix.若資料的維度太大時, 可能不利於分析, 例如這m筆資料用作機器學習. PCA的想法是算出這mxn matrix的斜方差矩陣, 此矩陣大小為nxn, 計算此矩陣n個特徵值(eigen value)及其對應的特徵向量(eigen vector), 依eigen value大小由小到大排

机器学习公开课笔记(8):k-means聚类和PCA降维

K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis) 管理计算机集群(Organize Computer Clusters) 天文学数据分析(Astronomical Data Analysis) K-Means算法属于非监督式学习的一种,算法的输入是:训练数据集$\{x^{(1)},x^{(2)},\ldots, x^{(m)}\}$(其中$x^

sklearn pca降维

PCA降维 一.原理 这篇文章总结的不错PCA的数学原理. PCA主成分分析是将原始数据以线性形式映射到维度互不相关的子空间.主要就是寻找方差最大的不相关维度.数据的最大方差给出了数据的最重要信息. 二.优缺点 优:将高维数据映射到低维,降低数据的复杂性,识别最重要的多个特征 不足:不一定需要,且可能损失有用信息 适用数值型数据 三.步骤 1.原始数据X,对于每列属性,去平均值(也可以对数值进行标准分化) 2.计算样本点的协方差矩阵(列间两两计算相关性) 3.求出协方差矩阵的特征值和对应的特征向

PCA降维

1.1算法流程 假设有m个samples,每个数据有n维. 1. 计算各个feature的平均值,计μj ;(Xj(i)表示第i个样本的第j维特征的value) μj = Σm Xj(i)/m meanVals = mean(dataMat, axis=0) 2. 将每一个feature scaling:将在不同scale上的feature进行归一化: 3. 将特征进行mean normalization Xj(i)= (Xj(i)-μj)/sj meanRemoved = dataMat -

PCA降维 ——最大方差角度看

最大方差法  PCA降维(欢迎讨论) 在上一篇的基础上继续讨论: 首先,得出原空间的中心点: 假设u1为投影向量,投影之后的方差为: 令方差最大(即:投影之后的点比较分散,没有相关性.以达到一个很好的降维效果),采用拉格朗日乘数法,U1T U1=1为约束条件. 则关于UT的方差表达式可以写成: 将上式求导对UT,使之为0,得到: 这样便得到了线性代数求特征值和特征向量的问题了.

PCA 降维算法详解 以及代码示例

转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analysis ( 主成分分析) 最近发现我的一篇关于PCA算法总结以及个人理解的博客的访问量比较高, 刚好目前又重新学习了一下PCA (主成分分析) 降维算法, 所以打算把目前掌握的做个全面的整理总结, 能够对有需要的人有帮助. 自己再看自己写的那个关于PCA的博客, 发现还是比较混乱的, 希望这里能过做好

用PCA降维 (Principal Component Analysis,主成分分析)

参考资料:Mastering Machine Learning With scikit-learn 降维致力于解决三类问题.第一,降维可以缓解维度灾难问题.第二,降维可以在压缩数据的同时让信息损失最 小化.第三,理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解 PCA简介 主成分分析也称为卡尔胡宁-勒夫变换(Karhunen-Loeve Transform),是一种用于探索高维数据结 构的技术.PCA通常用于高维数据集的探索与可视化.还可以用于数据压缩,数据预处理等.PCA可

Python 之 sklearn 实现 PCA 降维

关于 PCA 算法的讲解文章不胜枚举,这里主要谈一谈 基于 Python 中 sklearn 模块的 PCA 算法实现.Explained Variance 累计贡献率 又名 累计方差贡献率 不要简单理解为 解释方差,它是 PCA 降维维度的重要指标,一般选取累计贡献率在90%左右的维度作为PCA 降维的参考维度.在识别算法的实现过程中,当我们求得某一数据库各类别特征参考维度时,取最大维度作为每一类特征的维度,即可实现数据降维.现对数据求取累计贡献率,算法实现如下. import numpy f

PCA降维简介

PCA全称为principal componentanalysis,即主成成分分析,用于降维.对数据进行降维有很多原因.比如: 1:使得数据更易显示,更易懂 2:降低很多算法的计算开销 3:去除噪声 一:基本数学概念 1:方差 均值太简单了,不说了.方差是各个数据分别与其和的平均数之差的平方的和的平均数,用字母D表示.计算公式如下: 其中x-为均值,也可以表示为EX,则方差计算又可写成: 2:协方差及协方差矩阵 协方差用于衡量两个变量的总体误差情况,可以说方差是协方差的一种特殊情况,即当两个变量