Matlab k-means聚类手势识别【源码 GUI】

Matlab k-means聚类手势识别

一、简介

根据手的特征,提取手部轮廓特征,k-means聚类算法,训练得到手势识别的模型,然后用测试数据测试。

1 K-means算法原理介绍
K-means算法是最常用的一种聚类算法。算法的输入为一个样本集(或者称为点集),通过该算法可以将样本进行聚类,具有相似特征的样本聚为一类。

针对每个点,计算这个点距离所有中心点最近的那个中心点,然后将这个点归为这个中心点代表的簇。一次迭代结束之后,针对每个簇类,重新计算中心点,然后针对每个点,重新寻找距离自己最近的中心点。如此循环,直到前后两次迭代的簇类没有变化。

下面通过一个简单的例子,说明K-means算法的过程。如下图所示,目标是将样本点聚类成3个类别。
2 基本的步骤为:

step1:选定要聚类的类别数目k(如上例的k=3类),选择k个中心点。

step2:针对每个样本点,找到距离其最近的中心点(寻找组织),距离同一中心点最近的点为一个类,这样完成了一次聚类。

step3:判断聚类前后的样本点的类别情况是否相同,如果相同,则算法终止,否则进入step4。

step4:针对每个类别中的样本点,计算这些样本点的中心点,当做该类的新的中心点,继续step2。

3 上述步骤的关键两点是:

找到距离自己最近的中心点。

更新中心点。

二、源代码

%------------------hand shape analysis

%

close all

format long     %显示小数点后4位的数据

%读入hand的landmark数值

fid=fopen('shapes.txt');

hand=fscanf(fid, '%g %g',[40,inf]); %  X(1,1)X(2,1)...X(56,1);X(1,2)X(2,2)...X(56,2)

% choose 40 shapes as a row column

Shape=600*hand;

%-----------------------------------------------------

%   shape 矩阵每行112列,对应一个手的数据,

%   前56列对应X坐标 后56列对应Y坐标

%   Odata中所有形状的质点已经平移到原点

temp=Shape;

[temp,X,Y]=show2D(temp);             

% %--------Show unaligned shape  

% plot(X,Y,'r*');

% title('unaligned hands');

%------------------Compute the shape metric---------------------------

%-------------------------计算each Shape Size-------------------------

T=temp*temp';                             % Diag的对角元素为∑(x^2+y^2)

V=diag(T);                                % compute 对角线

size=sqrt(V);                             % Size 为40×1矩阵

%------------------------将Size归一化--------------------------------

%%%         根据形状大小的函数满足S(ax)=aS(x),每个坐标都除以对应Size的值

for i=1:40

  preHand(i,:)=temp(i,:)/size(i);               % preHand 为已经对准质点和大小

end

% -------------------------将各个形状以hand1为mean旋转------------------------

x1=preHand(1,:);      % vector 1*40

x1=reshape(x1,56,2);

x2=preHand(2,:);

for i=2:40

    x3=preHand(i,:);

    x2=reshape(x3,56,2);

    XD=x1'*x2;

    [U,S,V]=svd(XD);

    I=x2*V*U';

    preHand(i,:)=reshape(I,1,112);

end

aligned=preHand;

for i=1:40

for j=1:56

     XX(i,j)=aligned(i,j);            % the mean x-axis coordinate of every landmark  

     YY(i,j)=aligned(i,j+56);         % the mean y-axis coordinate of every landmark

end   

end

plot(XX,YY,'ro')

%-----------------compute the mean shape coordinates

%   every column of colm is the mean cooridnate of all the 40 hands'

%   coordinate respectively

colm=mean(aligned);              % mean(X) 求每一列元素的均值

for i=1:56

     XX(i)=colm(i);            % the mean x-axis coordinate of every landmark  

     YY(i)=colm(i+56);         % the mean y-axis coordinate of every landmark

end  

% subplot(1,2,1);

% figure;

% plot(XX,YY,'g-',XX,YY,'rx');               % show the mean shape of 40 hands

% title('the Mean Shape of Aligned');

% title('b1=0');

%---------------------------------------------------------------

%   tangent space projection

absx=colm*colm';absx=absx*absx;

for i=1:40

    xo=dot(colm,aligned(i,:));          % 矩阵点乘

    xt(i,:)=absx*aligned(i,:)/xo;

end    

%---------------------------------------------------------------

%    PCA

[signals,PC,V] = pca1(xt');

% eAB=xt*xt';       % 应该减去均值球协方差矩阵

% eAb=xt*xt'/39;

% % eBA=xt'*xt;

% [PC,V]=eig(eAB);

% [PC1,V1]=eig(eAb);

% V=diag(V);

% V1=diag(V1);

% sumV=40*mean(V);

%   compute the eigenvector of eBA

% PC1=xt'*PC;

% figure(2)

% bar(V);

% title('Shape eigenvalue');

% xlabel('Eigenvalue');

% ylabel('variance expansion factor(percent)');

%   now the shape model can be x=xmean+PC1*B,

%   where b {-3*sqrt(λ),3*sqrt(λ)}

% Pb=PC(:,1)*3*sqrt(V1(1));

% Xz=colm+Pb1';

% Xz=colm-Pb1';

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值