SVM做文本分类 降维时用PCA降维

君,已阅读到文档的结尾了呢~~
基于支持向量机的特征提取与目标跟踪算法的研究基于,研究,提取,特征提取,支持向量机,目标跟踪,特征,特征向量,跟踪算法,与目标跟踪
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于支持向量机的特征提取与目标跟踪算法的研究
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口用pca来对训练集与测试集分别降维并进行分类的问题? - 知乎7被浏览1753分享邀请回答12 条评论分享收藏感谢收起10083人阅读
这是楼主的第一篇博客文章,下决心写博客也是希望大家在相互交流中得到进步,楼主重大研一学生,菜鸟一名,我希望从一个菜鸟的角度出发来看待一些问题的解决,很多东西也都是针对初学者而言的。文章中可能有许多的错误,希望能看到此文章的博友,无论是高手还是初学者,看到错误能指正,遇到问题能提问,大家在交流中进步,再者楼主文笔拙计,一些语句看上去并不专业,也都是自己的理解,希望通俗易懂的表达出来,望见谅。不废话了,进入正题。
此文章将要描述一种基于MATLAB平台,运用PCA主成分分析方法对图片数据进行降维,运用SVM支持向量机分类器对降维后的图片数据进行分类处理,从而达到人脸识别的目的。
首先要感谢以下几篇文章的作者(后面引用会标识文章标号)
1.(A),matlab代码大部分都来自于A篇文章。并且其GUI界面值得借鉴,具体可参考(B).
2.(C)与(D),C篇对关于特征脸识别方法的步骤进行了详细的讲述,并且在一些关键细节问题中有着讲解,D篇对于PCA降维的原理有深入的剖析,都是非常不错的文章。
3.(E)与(F),E篇列出了具体的数据供大家检验,大家可以根据数据来验证数学过程,简单易懂。F篇与前篇有点相似,对初学者很有帮助。
4.(G)此篇文章对于大家了解协方差矩阵以及matlab实现很有作用。
1.编程平台:MATLAB。
& & 首先你得保证你的机器上安装有matlab,建议较高的版本。
2.libsvm工具箱。
& & 本人在对第一篇文章中代码关于SVM分类的部分没有运行成功,所以运用了libsvm工具箱对样本训练,测试,并没有运用第一篇文章的代码,如果你能成功可忽略,但建议安装此工具箱,其对SVM分类有很大帮助。如果你一样没有成功,这里推荐一个,有关于libsvm工具箱的安装配置的视频。
3.数据:ORL人脸库。
& & 这个数据为已经预处理的数据,格式为pgm,属于Linux格式,windows环境下无法直接打开,可以在matlab中打开,打开方式imshow(imread('图片路径'));数据是400张人脸图片,属于40个人,每个人10张,每张大小112*92像素,数据下载地址在第一篇文章中有,这里也给个,第四段两个链接都可下载。
4.主成分分析法PCA。
& & 主成分分析法是一种降维的方法,上面给出了几个有用的链接,本文只给出代码,以及代码说明,关于原理,大家尽可参照上面几个链接,写得非常详细也非常通俗。
5.SVM支持向量机分类器。
& & SVM支持向量机是一个二类分类器,但是本次人脸识别不仅只是分出两类,而是需要分出40个类别。本人以前有过一点机器学习基础,所以在支持向量机原理的理解上没有多大问题,如果读者没有SVM基础,可参考(H),以及写的非常给力的帖子,(I)。
& & 注:也许很多初学者看到这么多的资料,链接都已经晕了,失去了学习的动力。先别灰心,稍后我会把代码以及代码运行的结果和过程展示给大家,当大家看到这些图像的变换的美妙,就会有学习的兴趣。
编程实现:
& && 以下将要展示的是几个.m文件的代码,.m文件即是能在matlab上面打开运行的代码文件,可以在其中定义函数,如果matlab的当前路径指定在含有这些.m文件的文件夹中,运行时就可以调用这些文件中定义的函数。
首先展示第一个.m文件,便是图片数据读取函数ReadFace.m
function [f_matrix,realclass]=ReadFace(n_persons,flag)
%ORL人脸库。pgm格式的图片。40人,每人10幅图,图像大小为112*92像素。
%每个人有10幅照片,前5幅当作训练集,后5幅当作测试集
%输入变量flag:
flag是一个标识变量
当flag为0时,表示输入为训练集,flag为1时,表示输入为测试集
%输入变量n_persons:
n_persons标志着你想要识别的人脸个数
%输出变量realclass:
realclass是一个n_person*5行,1列的列向量。
realclass即是数据的标签,无论训练集测试集都进行了标签处理
%输出变量f_matrix:
f_matrix是一个n_person*5行,112*92列的矩阵
每一行便是每一张图片的灰度数据
将每一张图片列向量排成一个列向量后转置得到放入f_matrix各行当中
imgrow=112;imgcol=92;
%载入图片行数
%载入图片列数
realclass=zeros(n_persons*5,1);
f_matrix=zeros(n_persons*5,imgrow*imgcol);
for i=1:n_persons
%函数num2str(i)说明:将数字转化为字符
facepath=strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(i),'\');
%路径因不同情况而定
cachepath=
if flag==0
%函数strcat(a,b,...)说明:将输入字符a,b...连接成单个字符
facepath=strcat(facepath,num2str(j));
facepath=strcat(facepath,num2str(j+5));
realclass((i-1)*5+j)=i;
facepath=strcat(facepath,'.pgm');
%函数imread说明:读取输入路径的图片,将每个像素灰度值保存在输出的矩阵中
img=imread(facepath);
f_matrix((i-1)*5+j,:)=img(:)';
代码当中有着详细的注释,代码与第一篇文章中提供的代码大同小异,根据本人情况修改了一点路径的代码,以及增加了对训练集标签的标识,且增加了注释。现在对代码进行一些说明。
代码第一行有对函数的申明,function []=ReadFace(),中括号为函数的输出,小括号为函数的输入,函数名与文件名一致,一个.m文件当中可以有多个函数申明,但当外面的函数想要调用这个文件中的函数时,只能调用与文件名一致的函数。所以这个文件叫ReadFace.m。
何为训练集以及测试集?
& & 在机器学习方法当中,分为监督学习,非监督学习,强化学习。而SVM支持向量机是一种监督学习的算法。所谓监督学习,就是给予机器一套题目并附上标准答案,让它去做题,自己总结了一套做题的方法(这些方法就是建立的模型),它在根据已经学习好的方法来做一套新的题目,把题目做对,尽可能打高分。
& & 训练集就是给予机器的一套题目及标准答案,测试集就是给它的一套新题。而训练集有标签和数据之分,标签就是标准答案,标签有着1和0,就表示这些训练集中有两类,像我们的人脸数据有40种人脸,我们就用1到40来表示。数据就是有着多维的表征一个事物的数据,就是给机器的第一套题目。测试集也有数据,就是后面给机器测试的题目,如果测试集原本含有标签,这些标签就可以作为标准给机器前面训练总结的方法(模型)打分,查看准确率。
在这个人脸库中,每个人有10张图,我们将前5张作为训练集,就有200张图。用一个矩阵来表示这200张图,就形成了一个200*10304的矩阵。后5张图用来当测试集,可以看代码中的说明。
当flag为0时,找出训练集的标签realclass(200*1的矩阵)与数据f_matrix(200*10304的矩阵).
当flag为1时,就是找出测试集来测试分类效果,得出准确率。
SVM训练的目的就是利用训练集找到这么一个分类函数(模型),再在测试集中检测。关于SVM的具体原理查看上面的H和I篇。
--------------------------------分割线---------------------------------------
第二个.m文件的文件名为fastPCA.m,用于将样本进行降维处理,参考上面主成分分析PCA文章D,E,F篇,上面有通俗且具体的阐述。
function [ pcaA,V] = fastPCA( A,k,mA)
%快速PCA,主成份分析
%输入:A-样本矩阵,每行是一个样本,列是样本的维数
mA-图像矩阵f_matrix每一列的均值排成一个行向量,即mean(f_matrix)
%输出:pacA-降维后,训练样本在低维空间中的系数坐标表示
V-主成分分量,即低维空间当中的基
m=size(A,1);
%m为读取图片的张数
Z=(A-repmat(mA,m,1));
%中心化样本矩阵
%一般用中心化的矩阵代替原矩阵。为什么?因为将数据集的均值归零(预处理),也就是只取数据的偏差部分
T=Z*Z';
[V1,D]=eigs(T,k);%计算T的最大的k个特征值和特征向量
V=Z'*V1;
%协方差矩阵的特征向量
%这一点是关键步骤,很可能很多初学者无法理解:
%按理来讲,协方差矩阵的计算公式为(假设上面中心化的Z已经求出):
%V = (Z'*Z)./(size(Z,1)-1)(先不管单位化,V=Z'*Z)(这里是一行为一个样本,一列为一个维数的情况)
%协方差矩阵是N*N的方阵,维数N应该与原图片f_matrix(200*10304)维数相等
%f_matrix中行数200为图片个数,列数10304为维数
%那为什么这里是T=Z*Z',再求T的K个最大特征值和特征向量V1,再用V=Z'*V1来求协方差矩阵特征向量呢?
%因为我们如果求V=Z'*Z这个V就是一个的矩阵,MATLAB奔溃了,太复杂
%我们可以这样看P^-1*(Z*Z')*P=S等价于P^-1*(Z')^-1*Z'*Z*Z'*P=S等价于(Z'*P)^-1*(Z'*Z)*(Z'*P)=S
%注:P^-1是P的逆矩阵,(Z')^-1为Z'的逆矩阵,类推,建议大家写在纸上
%最后一个式子可以看出Z'*Z的特征向量矩阵为Z'*P,而Z*Z'的特征向量矩阵为P,即为程序中的V1
%这是一种简便方法,为的就是避免像V=Z'*Z这种维数太高的计算。
%可查看C篇文章步骤4
%特征向量单位化
l=norm(V(:,i));
V(:,i)=V(:,i)/l;
%单位化后的V才能是真正的低维空间的基,需要满足正交化单位化两个条件
%具体原因参考D篇文章
%线性变换,降至k维
,将中心化的矩阵投影到低维空间的基中,V就是低维空间的基
%pcaA为低维空间的坐标表示,即一个图像的判断依据
代码与第一篇文章代码没有不同,只是多加了注释,便于大家理解。
下面贴出原图,均值脸以及两者的差值图:
-------------------------------------------------分割线---------------------------------------------------------
第三个文件为scaling.m文件,其中的代码与原作者代码无二。略加注释。
function [ scaledface] = scaling( faceMat,lowvec,upvec )
%特征数据规范化
%即是将同一个样本中的不同维度归一化
%因为因为对于不同的属性,如果不归一化是不具有比较性的,两者不在一个量级上
%输入——faceMat需要进行规范化的图像数据,
lowvec原来图像数据中的最小值
upvec原来图像数据中的最大值
lownew=-1;
[m,n]=size(faceMat);
scaledface=zeros(m,n);
scaledface(i,:)=lownew+(faceMat(i,:)-lowvec)./(upvec-lowvec)*(upnew-lownew);
%将图像数据中一个样本的不同维度的值,最小值和最大值规范到-1和1,其他值按比例规范到(-1,1)
-----------------------------------------------------分割线-----------------------------------------------------
第四个文件visualize.m中为显示特征脸的代码,比较简单,并附上显示结果。
function visualize( B )
%显示特征脸(变换空间中的基向量,即单位特征向量)
%输入:B——每列是个主成分分量,显示的就是低维中每个基组成的图像
k——主成分的维数
img=zeros(imgrow,imgcol);
for i=1:20
img(:)=B(:,i);
subplot(4,5,i);
imshow(img,[])
因为降至20维,所以其在低维中的基便是这20张特征脸,其他所有的经过了降维的脸都可以由这20张特征脸线性表示,即我们要进行脸部识别时,把选择要识别的脸进行降维处理后,再右乘这些基(特征脸)所构成的矩阵,就能得到这些脸在低维中的线性表示。这些表示就是识别的依据。
特征脸截图:
-------------------------------------------------分割线---------------------------------------------------------
第五个文件recognition.m中的代码,在A篇文章当中没有,是我自己编写的脸部识别的小程序,比较简单,没有像A篇文章中一样做GUI界面。
function recognition(mA,V,model)
%函数作用:人脸识别模块,利用已经建好的模型,重新找一个样本进行识别
V-协方差矩阵特征向量
model-通过SVM对训练集训练得出的已经建立好的模型
%弹出输入框,选择要识别的图片
select_person_num=str2double(cell2mat(inputdlg('请输入想要识别的人的编号(总共40个人):')));%总共40个人
select_img_num=str2double(cell2mat(inputdlg('请输入此人图片的编号(总共10张):')));%总共10张图
%对图片信息进行处理,化为1*10304的行向量
disp('读取选择的图片...')
select_facepath=strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(select_person_num),'\',num2str(select_img_num),'.pgm');
select_img=imread(select_facepath);
select_matrix=zeros(1,imgrow*imgcol);
select_matrix(1,:)=select_img(:)';
select_matrix=(select_matrix-mA)*V;%PCA降维后的低维表示
%图形归一化
disp('规范化选择的图片...')
select_matrix = scaling( select_matrix,min(select_matrix),max(select_matrix));
%测试选择的图片,accuracy只有两个值,100%表示匹配正确,0%表示匹配错误
disp('测试选择的图片...')
[select_predict_label,accuracy,decision_values]=svmpredict(select_person_num,select_matrix,model);
%显示原有图片和匹配图片进行比较
disp('显示选择的图片...')
figure(2);
subplot(1,2,1);imshow(select_img);title('你选择的图片');
subplot(1,2,2);
imshow(imread(strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(select_predict_label),'\',num2str(1),'.pgm')));
title('匹配的图片');
程序运行到此会弹出输入框,让用户选择想要识别的图片,当Accuracy=100%表示识别正确,如果Accuracy=0%表示识别错误。
& & & & &&& & & & &&
输入编码后选择的图片,以及匹配到的图片对比。
-------------------------------------------------分割线---------------------------------------------------------
第六个文件face.m中的代码为主程序。读者想要看到整个效果,只需要将此文件中的程序全部选中按F9即可运行。
%主程序,程序从此开始
npersons=40;%选取40个人的脸
imgrow=112;
imgcol=92;
%读取训练数据
disp('读取训练数据...')
[f_matrix,train_label]=ReadFace(npersons,0);%读取训练数据
nfaces=size(f_matrix,1);%样本人脸的数量
disp('.................................................')
%低维空间的图像是(nperson*5)*k的矩阵,每行代表一个主成分脸,每个脸20维特征
%对训练集进行降维处理
disp('训练数据PCA特征提取...')
mA=mean(f_matrix);
k=20;%降维至20维
%按理来讲,协方差矩阵的维数是10304维,而训练集的样本数量只有200
%那么起作用的特征值对应的特征向量小于等于199个,其余的特征向量对应的特征值都为0
[train_pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取
disp('.................................................')
%显示主成分脸,即特征脸,低维的基
disp('显示主成分脸...')
visualize(V)%显示主分量脸
disp('.................................................')
%低维训练集归一化
disp('训练特征数据归一化...')
disp('.................................................')
lowvec=min(train_pcaface);
upvec=max(train_pcaface);
train_scaledface = scaling( train_pcaface,lowvec,upvec);
%SVM样本训练
%本人的程序叫源程序有改动,使用的是libsvm工具箱进行SVM分类
disp('SVM样本训练...')
disp('.................................................')
model = svmtrain(train_label,train_scaledface,'-t 0');
%读取测试数据
disp('读取测试数据...')
disp('.................................................')
[test_facedata,test_facelabel]=ReadFace(npersons,1);
%测试数据降维
%test_pcatestface-测试数据低维空间的表示
disp('测试数据特征降维...')
disp('.................................................')
m=size(test_facedata,1);
test_facedata(i,:)=test_facedata(i,:)-mA;
test_pcatestface=test_facedata*V;
%测试数据归一化
disp('测试特征数据归一化...')
disp('.................................................')
scaled_testface = scaling( test_pcatestface,lowvec,upvec);
%利用训练集建立的模型,对测试集进行分类
disp('SVM样本分类...')
disp('.................................................')
[predict_label,accuracy,decision_values]=svmpredict(test_facelabel,scaled_testface,model);
%人脸识别模块
disp('人脸识别模块')
disp('.................................................')
recognition(mA,V,model) ;
注:我的SVM分类器是用libsvm工具箱当中的函数实现的两个关键函数便是svmtrain和svmpredict,核函数选用线性核函数。
以上暂时是初稿,肯定还有很多需要修改的地方,如果读者有什么疑问或是看到什么错误,希望能留言,我会加以请教。大家相互学习,相互进步。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29514次
排名:千里之外
评论:22条&>&&>&&>&&>&基于PCA-HOG的人体检测代码-包括训练,PCA降维,线性、高斯检测
基于PCA-HOG的人体检测代码-包括训练,PCA降维,线性、高斯检测
上传大小:16.04MB
这个是原作者“xiaoxiaolishan”上传的毕业设计,由于资源分的原因(要价颇高,10分(⊙o⊙)),有些网友不太方便下载,特上传一份,免积分供大家下载。PS:希望原作者不要骂我啊!
“这是本人本科做的毕业设计,根据opencv里面人体检测的HOG代码改写,加上了完整的注释(opencv里面是没有任何注释的),并且增加了样本的训练(代码中只提供了PCA50-HOG的检测算子,如有其它需要可以自行训练),线性检测时使用线性SVM优化,高斯检测时使用PCA的降维。同时对候选区域整合代码做了简化处理。”...展开收缩
综合评分:4(4位用户评分)
所需积分:
下载次数:106
审核通过送C币
创建者:qq_
创建者:caozhy
创建者:zhaoyading
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
/*删除回复*/
$(".del_comment_r").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
评论共有1条
代码有点问题,调试好后可以运行,效果有一定提升
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
基于PCA-HOG的人体检测代码-包括训练,PCA降维,线性、高斯检测
会员到期时间:剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:网站已改版,请使用新地址访问:
mypca matlab下实现的pca降维算法,降低数据维数,保留 的主特征
254万源代码下载-
&文件名称: mypca& & [
& & & & &&]
&&所属分类:
&&开发工具: matlab
&&文件大小: 1 KB
&&上传时间:
&&下载次数: 22
&&提 供 者:
&详细说明:matlab下实现的pca降维算法,降低数据维数,保留数据的主特征-pca dimensionality reduction algorithm on matlab
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&[]:纯粹是垃圾
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站254万海量源码库中尽情搜索:
&[] - 关于matlab主元分析的一个简单的实例,可供初学者参考学习。
&[] - 一个很好的Matlab编制的数据降维处理软件
&[] - pca程序,PCA可以用于图像处理等方面
&[] - 主元分析,主要用于多维数据的降维处理,能够从多维数据中提取出最主要的元素,从线性变换的角度来说就是坐标表换到一个能够体现系统特征的基座标系上
&[] - 论文使用一种经典的特征提取方法―主成分分析法(PCA)进行特征提取,其基本思想是降维。降维后的数据除了计算工作量减少之外不会减少原始数据所包含的有效信息量。
&[] - LDA方法是一种对数据进行线性分解的降维方法
&[] - pca做特征降维,然后进行特征空间随机分割构造多个svm分类器,并行处理,对样本进行分类,基于特征空间的svm多分类器
&[] - PCA技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。
&[] - pca降维使用 程序短小精悍 上面附有中文简短介绍 希望大家可以很好利用改进 .cn 可以和我联系
&[] - PCA数据降维,利用MATLAB进行开发学习

我要回帖

更多关于 pca降维后分类 的文章

 

随机推荐