《模式识别与智能计算》基于PCA的模板匹配法

《模式识别与智能计算》基于PCA的模板匹配法


前言:此篇博客主要介绍《模式识别与智能计算》中代码如何使用。


先决条件:《模式识别与智能计算》—MATLAB技术实现 软件配置
                 《模式识别与智能计算》第2章 特征的选择与优化

      我假设你环境配置出错!不能运行手写识别程序。但是你要下载成功此数据:下载:《模式识别与智能计算》MATLAB技术实现(光盘文件)之后,可以在 手写数字分类文件夹内找到templet.mat数据。
      软件选择0类别对应templet中的pattern(1).feature;

需要条件:1. templet.mat
                   2.allsamples.mat:此文件下载后,内容是我自己的手写体识别;
2中数据可自行保存,保存方法如下:
这里写图片描述
allsamples.mat解释:
这里写图片描述       这里写图片描述
左图,分别是0~9结构体,每个数字有5个样本;右图,打开数字0样本,25*5,每一列为1个样本;

基于PCA的模板匹配法

在使用模板匹配法之前,先对特征进行主成分分析。按照一定的贡献值,提取前m个主分量,用较低维数的特征来进行分类。

1.实现步骤

这里写图片描述

2.编程代码

pcapro.m文件:

%  %  %  %  %  %  %  %  %  %  %  %  %  %  %  %
%函数名称::pcapro()
%参数:sample:待识别样品特征
%返回值:y1:样品库经过主成分分析后的主分量矩阵;y2:样品库经过主成分分析后的主分量向量
%函数功能:对样品库和待测样品用主成分分析法进行降维
%  %  %  %  %  %  %  %  %  %  %  %  %  %  %  %
function [y1,y2]=pcapro(sample)
load templet pattern;%加载样品库
mixedsig=[];
sum1=0;
%将所有类别的所有样品合并到mixedsig
for i=1:10
    sum1=sum1+pattern(i).num;
    mixedsig=[mixedsig pattern(i).feature];
end
[Dim,NumofSampl]=size(mixedsig);%Dim为特征数,NumofSampl为样品总个数
dsig_cov=cov(mixedsig');%求mixedsig的协方差矩阵
%利用pcacov()函数从大到小排好序的协方差矩阵的特征值latent和相应特征向量pc
[pc,latent,tspuare]=pcacov(dsig_cov);
temp=0;con=0;m=0;
%根据贡献率取舍特征向量
sum2=sum(latent);
for i=1:25
    if(con<0.9)
        temp=temp+latent(i);
        con=temp/sum2;
        m=m+1;
    else
        break;
    end
end
pc(:,m+1:25)=[];
%求待测样品主成分
x=sample'*pc;       %此处和书中不同,因为我的数据是按照列 如按行可改为x=sample*pc;
%求样品库品成分
y=mixedsig'*pc;
y1=y';
y2=x';

pcaneartemplet.m文件:

%函数名称:pcaneartemplet()
%参数:sample:待识别样品特征
%返回值:y:待识别样品所属类别
%函数功能:按照使用PCA的模板匹配法计算待测样品与样品库中的样品相似度
%  %  %  %  %  %  %  %  %  %  %  %  %  %  %  %  %
function y=pcaneartemplet(sample);
clc;
load templet pattern;
%对样品和样品库进行主成分分析
[pcapat,pcasamp]=pcapro(sample);
temp=0;
for i=1:10
    pattern(i).feature=pcapat(:,temp+1:temp+pattern(i).num);
    temp=temp+pattern(i).num;
end
d=0;%距离
min=[inf,0];
for i=1:10
    for j=1:pattern(i).num
        %计算待测样品与样品库间的最小距离
        d=sqrt(sum((pattern(i).feature(:,j)-pcasamp).^2));
        %求最小距离及其类号
        if min(1)>d
            min(1)=d;
            min(2)=i-1;
        end
    end
end
%输出类别
y=min(2);

3.运行方法和结果

将pcaneartemplet.m、pcapro.m、templet.mat和allsamples.mat放同一目录下。输入:
这里写图片描述
运行结果:

ans = 0;

因为输入的样本为0,分类结果也为0,故分类正确!!!

扫描二维码关注公众号,回复: 2259325 查看本文章

猜你喜欢

转载自blog.csdn.net/missxy_/article/details/81085364