OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA示例

1、OpenCV中LDA类的声明

//contrib.hpp

class CV_EXPORTS LDA
    {
    public:
        // Initializes a LDA with num_components (default 0) and specifies how
        // samples are aligned (default dataAsRow=true).
        LDA(int num_components = 0) :
            _num_components(num_components) {};

        // Initializes and performs a Discriminant Analysis with Fisher's
        // Optimization Criterion on given data in src and corresponding labels
        // in labels. If 0 (or less) number of components are given, they are
        // automatically determined for given data in computation.
        LDA(const Mat& src, vector<int> labels,
                int num_components = 0) :
                    _num_components(num_components)
        {
            this->compute(src, labels); //! compute eigenvectors and eigenvalues
        }

        // Initializes and performs a Discriminant Analysis with Fisher's
        // Optimization Criterion on given data in src and corresponding labels
        // in labels. If 0 (or less) number of components are given, they are
        // automatically determined for given data in computation.
        LDA(InputArrayOfArrays src, InputArray labels,
                int num_components = 0) :
                    _num_components(num_components)
        {
            this->compute(src, labels); //! compute eigenvectors and eigenvalues
        }

        // Serializes this object to a given filename.
        void save(const string& filename) const;

        // Deserializes this object from a given filename.
        void load(const string& filename);

        // Serializes this object to a given cv::FileStorage.
        void save(FileStorage& fs) const;

            // Deserializes this object from a given cv::FileStorage.
        void load(const FileStorage& node);

        // Destructor.
        ~LDA() {}

        //! Compute the discriminants for data in src and labels.
        void compute(InputArrayOfArrays src, InputArray labels);

        // Projects samples into the LDA subspace.
        Mat project(InputArray src);

        // Reconstructs projections from the LDA subspace.
        Mat reconstruct(InputArray src);

        // Returns the eigenvectors of this LDA.
        Mat eigenvectors() const { return _eigenvectors; };

        // Returns the eigenvalues of this LDA.
        Mat eigenvalues() const { return _eigenvalues; }

    protected:
        bool _dataAsRow;
        int _num_components;
        Mat _eigenvectors;
        Mat _eigenvalues;

        void lda(InputArrayOfArrays src, InputArray labels);
    };

2、示例

// LDA.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <contrib\contrib.hpp>
#include <cxcore.hpp>
using namespace cv;
using namespace std;

int main(void)
{
	//sampledata
	double sampledata[6][2]={{0,1},{0,2},{2,4},{8,0},{8,2},{9,4}};
	Mat mat=Mat(6,2,CV_64FC1,sampledata);
	//labels
	vector<int>labels;
	for(int i=0;i<mat.rows;i++)
	{
		if(i<mat.rows/2)
		{
			labels.push_back(0);
		}
		else
		{
			labels.push_back(1);
		}
	}

	//do LDA
	LDA lda=LDA(mat,labels);
	//get the eigenvector
	Mat eivector=lda.eigenvectors().clone();

	cout<<"The eigenvector is:"<<endl;
	for(int i=0;i<eivector.rows;i++)
	{
		for(int j=0;j<eivector.cols;j++)
		{
			cout<<eivector.ptr<double>(i)[j]<<" ";
		}
		cout<<endl;
	}

	//针对两类分类问题,计算两个数据集的中心
	int classNum=2;
	vector<Mat> classmean(classNum);
	vector<int> setNum(classNum);

	for(int i=0;i<classNum;i++)
	{
		classmean[i]=Mat::zeros(1,mat.cols,mat.type());
		setNum[i]=0;
	}

	Mat instance;
	for(int i=0;i<mat.rows;i++)
	{
		instance=mat.row(i);
		if(labels[i]==0)
		{
			add(classmean[0], instance, classmean[0]);
			setNum[0]++;
		}
		else if(labels[i]==1)
		{
			add(classmean[1], instance, classmean[1]);
			setNum[1]++;
		}
		else
		{}
	}
	for(int i=0;i<classNum;i++)
	{
		classmean[i].convertTo(classmean[i],CV_64FC1,1.0/static_cast<double>(setNum[i]));
	}

	vector<Mat> cluster(classNum);
	for(int i=0;i<classNum;i++)
	{
		cluster[i]=Mat::zeros(1,1,mat.type());
		multiply(eivector.t(),classmean[i],cluster[i]);
	}

	cout<<"The project cluster center is:"<<endl;
	for(int i=0;i<classNum;i++)
	{
		cout<<cluster[i].at<double>(0)<<endl;
	}

	system("pause");
	return 0;
}


OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA示例,布布扣,bubuko.com

时间: 2024-12-21 19:49:10

OpenCV LDA(Linnear Discriminant analysis)类的使用---OpenCV LDA示例的相关文章

LDA (Linear Discriminant Analysis) 线性判别分析

[1] http://blog.csdn.net/ffeng271/article/details/7353834

线性判别分析(Linear Discriminant Analysis, LDA)算法初识

LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的.性鉴别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳

线性判别分析(Linear Discriminant Analysis,LDA)

一.LDA的基本思想 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的.线性鉴别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性. 如

线性判别分析(Linear Discriminant Analysis, LDA)算法分析

LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的.性鉴别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳

【转】LDA-linear discriminant analysis

分类问题也可以用降维来理解,比如一个D维的数据点x,我们可以采用下面的映射进行线性的降维, y=θTx 在计算出y后,就可以选择一个阈值h,来进行分类.正如我们在前面的PCA模型中看到的,降维会有信息的损失,可能会在降维过程中,丢失使数据可分的特征,导致分类的效果不理想. 那采用什么样的降维方式,可以尽量的在低维空间中保存原来数据在高维空间中的可分性(区分类别的特征).一个常用的模型 linear discriminant analysis(LDA)就是用来做这个工作的,下面就具体的看一下LDA

【转载】线性判别分析(Linear Discriminant Analysis)(二)

线性判别分析(Linear Discriminant Analysis)(二) 4. 实例 将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果. PCA与LDA的降维对比: PCA选择样本点投影具有最大方差的方向,LDA选择分类性能最好的方向. LDA既然叫做线性判别分析,应该具有一定的预测功能,比如新来一个样例x,如何确定其类别? 拿二值分来来说,我们可以将其投影到直线上,得到y,然后看看y是否在超过某个阈值y0,超过是某一类,否则是另一类.而怎么寻找这个y0呢? 看 根

线性判别分析(Linear Discriminant Analysis)

线性判别分析(Linear Discriminant Analysis) 标签(空格分隔): 监督学习 @author : [email protected] @time : 2016-07-11 线性判别分析Linear Discriminant Analysis 线性分类器 判别式函数discriminant functions 从判别式或后验概率到决策面 线性判别分析Linear Discriminant Analysis 二次判别分析QDA Fisher判别式 类间距离 类内距离 Fis

高斯判别分析 Gaussian Discriminant Analysis

如果在我们的分类问题中,输入特征xx是连续型随机变量,高斯判别模型(Gaussian Discriminant Analysis,GDA)就可以派上用场了. 以二分类问题为例进行说明,模型建立如下: 样本输入特征为x∈Rnx∈Rn,其类别y∈{0,1}y∈{0,1}: 样本类别yy服从参数为??的伯努力分布,即y∼Bernoulli(?)y∼Bernoulli(?): 两类样本分别服从不同的高斯分布,即x|y=0∼N(μ0,Σ),x|y=1∼N(μ1,Σ)x|y=0∼N(μ0,Σ),x|y=1∼

【转载】线性判别分析(Linear Discriminant Analysis)(一)

线性判别分析(Linear Discriminant Analysis)(一) 1. 问题 之前我们讨论的PCA.ICA也好,对样本数据来言,可以是没有类别标签y的.回想我们做回归时,如果特征太多,那么会产生不相关特征引入.过度拟合等问题.我们可以使用PCA来降维,但PCA没有将类别标签考虑进去,属于无监督的. 比如回到上次提出的文档中含有“learn”和“study”的问题,使用PCA后,也许可以将这两个特征合并为一个,降了维度.但假设我们的类别标签y是判断这篇文章的topic是不是有关学习方