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';
<