KNN算法检测手势动作

KNN算法原理:

KNN(k-nearest neighbor)是一个简单而经典的机器学习分类算法,通过度量”待分类数据”和”类别已知的样本”的距离(通常是欧氏距离)对样本进行分类。 
这话说得有些绕口,且来分解一番: 
(1)分类问题都是监督(supervised)问题,也就是说一定数量的样本类别是已知的。 
(2)既然我们已经有了一批分好类的样本,那么接下来的工作自然应该是通过已知样本训练分类器(通过调节分类器的参数,使分类器能够正确对训练样本分类),把分类器训练好以后用于对未知样本的分类(或类别预测)。 
看上去就是这么回事,问题的关键在于分类器的训练。 
但对于KNN分类器来说,事情并不是这个样子的。其实KNN并没有这么复杂。因为KNN并没有什么参数要调,换句话说,KNN其实并不需要训练! 
作为最简单也最好理解的分类器,KNN只是假设数据都分布在欧式的特征空间内(以特征值为坐标区分不同样本的空间),然后我们恰好又知道全部数据在这个空间中的位置以及其中一部分数据的类别。那么现在我们怎么判断剩余那些数据的类别呢? 
为了让分类进行下去,这里其实我们假设:空间中距离越近的点属于一类的可能性越大。 
有了这条“公理”,那事情就好办多了。我们只需要计算每个待分类数据到全部已知类别数据的距离就好了。如图: 

有正方形和三角形两个已知类,假如中间的圆形我们不知道它到底是三角形还是正方形。按照上面说的,我们可以正儿八经计算一下它到其他所有点的距离。在这里为了简便,我们目测一下发现它离旁边的三角形最近,好嘞,那么我们就把它归为三角形一类的。 
注意这里我们把未知点和离它最近的那一个点归为一类。这样的分类器,准确来说叫最近邻分类器(nearest-neighbor,NN)。这是KNN的特殊情况,是K=1的情况。 
那么K近邻,顾名思义,就是要一个未知点参考离它最近的前k个一直类别的点,看在这k个点里面,属于哪个类别的点最多,就认为未知点属于哪一类。还是上面的图,以圆形未知点为圆心,在实线画出的圆中,相当于k=3,也就是选了前三个离得最近的点,其中三角形2个,方形1个,所以未知点归到三角形一类。但是当考虑虚线范围内时,也就是k=5时,我们发现方形3个,三角形2个,所以这个时候未知点归到方形一类了。 
所以我们可以发现,不同的最近邻个数往往会导致不同的分类结果,一般来说,我们在实际应用中要根据实际情况和经验确定k的取值。

原理部分参考自博文:https://blog.csdn.net/weixin_41988628/article/details/80369850

使用KNN分类器实现分类一个简单的二维例子

创建二维点集的代码部分如下:

通过随机生成的方式,创建两个不同的二维点集class1和class2,每个点集有两类,分别是正态分布和绕环状分布,正态分布的范围主要通过代码中参数的调节实现,该参数越大,数据点范围越大,就更分散.

   绕环分布的范围,半径r决定了外圈数据集的集中程度,当r越大时,数据范围越大,就越分散

下载PCV库并安装
git clone https://github.com/jesolem/PCV.git
cd PCV
python setup.py install

   打开  Python2.7 测试 能否导入

import PCV

 

通过训练的数据识别出手势的代码如下:

运行完后结果会用显示正确率对于给定的测试集有多少图像是正确分类的,但是它并没有告诉我们哪些手势难以分类,或者犯哪些错误。这时,我们可以通过混淆矩阵来显示错误分类的情况。混淆矩阵是一个可以显示每类有多少个样本被分在每一类中的矩阵,它可以显示错误的分布情况,以及哪些类是经常相互“混淆”的

import os
from PIL import Image
from numpy import *
from pylab import *
import pickle
from scipy.cluster.vq import *
import pca
import dsift
import sift
import knn
from svmutil import *import sys
reload(sys)
sys.setdefaultencoding('utf-8')def read_features_labels(path):# create list of all files ending in .dsiftfeatlist = [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.dsift')]# read the featuresfeatures = []for featfile in featlist:l,d = sift.read_features_from_file(featfile)features.append(d.flatten())features = array(features)# create labelslabels = [int(featfile.split('\\')[-1][0:3])/50 for featfile in featlist]return features,array(labels)imlist = []
path = 'C:\\Users\\RubyLyu\\PycharmProjects\\PictureDB\\data'
imlist=[os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
print imlistfor filename in imlist:featfile = filename[:-3]+'dsift'dsift.process_image_dsift(filename,featfile,10,5,resize=(150,200))imlist = []
path = 'C:\\Users\\RubyLyu\\PycharmProjects\\PictureDB\\src\\data'
imlist=[os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]for filename in imlist:featfile = filename[:-3]+'dsift'dsift.process_image_dsift(filename,featfile,10,5,resize=(150,200))features,labels = read_features_labels('C:\\Users\\RubyLyu\\PycharmProjects\\PictureDB\\data')#print features
test_features,test_labels = read_features_labels('C:\\Users\\RubyLyu\\PycharmProjects\\PictureDB\\src\\data')features = map(list,features)
test_features = map(list,test_features)
prob = svm_problem(labels,features)
param = svm_parameter('-t 2')
m = svm_train(prob,param)
svm_save_model("C:\\Users\\RubyLyu\\PycharmProjects\\untitled1\\svmDsift200.model",m)
res = svm_predict(labels,features,m)
res = svm_predict(test_labels,test_features,m)
#how does it perform on the test set?
# m = svm_load_model("C:\\Users\\RubyLyu\\PycharmProjects\\untitled1\\svmDsift.model")
#
# res = svm_predict(test_labels[:5],test_features[:5],m)

运行的结果如下:

结果显示分类的正确率达到81.3%

混淆矩阵竖着看,比如A列,分类正确的有26,将A分错成V有三个

A、B、C、F、V的分类结果都比较好,错误率较低

而P类错分成V的概率很高

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS负载均衡(转)

在大型Web应用系统中,由于请求的数据量过大以及并发的因素,导致Web系统会出现宕机的现象,解决这一类问题的方法我个人觉得主要在以下几个方面: 1.IIS 负载均衡。 2.数据库 负载均衡。 3.系统架构优化,比如报表服务器…

maven报错Non-resolvable parent POM for com.wpbxin:springboot2-first-example:0.0.1-SNAPSHOT: Could not

文章目录 一、maven报错二、一些说明三、出现问题的原因和几种解决方法 忽略SSL证书检查生成证书并导入到 JRE security 中使用默认的 maven 中央仓库使用 http 的镜像库四、参考链接 记录使用 maven 时遇到的问题。第一种方法最方便,亲测能用。 一、maven报错 mav…

计算机科技与技术对应岗位,计算机技术与软件专业技术资格名称及岗位基本任职条件...

超越梦想:计算机技术与软件专业技术资格名称及岗位基本任职条件专业资格名称对应专业技术职务等级学位或学历要求资历要求信息系统项目管理师、系统分析师、系统架构设计师、网络规划设计师、系统规划与管理师高级博士学位聘任工程师满2年硕士学位聘任工程师满4年本…

Intellij idea 出现错误 error:java: 无效的源发行版: 11解决方法

Select the project, then File > ProjectStructure > ProjectSettings > Modules -> sources You probably have the Language Level set at 9: Just change it to 8 借用下别人的图片, 我的默认是11报的错, 改成8后就好了

计算机房机柜标准尺寸,有哪些参数和尺寸符合机房机柜的安装要求

现如今服务器机房越来越多,不管是自己托管服务器还是租用服务器,机房机柜的选择是很重要的。机房机柜也会跟其高度厚度尺寸等相关。对于需要运行环境和要求高的机房,还需要选择有智能系统的机柜才行。还需要根据一些机房机柜的参数来考虑是否…

9月第1周国内IT技术类网站:CSDN覆盖数持续走低

根据国际统计机构Alexa公布的最新数据显示,9月第1周(2013-09-02至2013-09-08),国内IT技术类网站排行榜中,CSDN以1710居于榜首,第二位是1170的博客园,第三位是670的51CTO。下面是具体情况&#x…

YOLOv3改进方法增加特征尺度和训练层数

YOLOv3改进方法 YOLOv3的改进方法有很多,本文讲述的是增加一个特征尺度。 以YOLOv3-darknet53(ALexeyAB版本)为基础,增加了第4个特征尺度:104*104。原版YOLOv3网络结构: YOLOv3-4l网络结构: 即…

uva 610(tarjan的应用)

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id23727 思路&#xff1a;首先是Tarjan找桥&#xff0c;对于桥&#xff0c;只能是双向边&#xff0c;而对于同一个连通分量而言&#xff0c;只要重新定向为同一个方向即可。 1 #include<ios…

Win7搭建NodeJs开发环境以及HelloWorld展示—图解

Windows 7系统下搭建NodeJs开发环境&#xff08;NodeJsWebStrom&#xff09;以及Hello World&#xff01;展示&#xff0c;大体思路如下&#xff1a;第一步&#xff1a;安装NodeJs运行环境。第二步&#xff1a;安装WebStrom开发工具。第三步&#xff1a;创建并运行NodeJs项目展…

计算机一级windows7操作,计算机等级一级:Windows7应用之小技巧

为了帮助广大考生更好的复习&#xff0c;帮考网综合整理提供了计算机等级考试一级微机知识:Windows7应用之小技巧&#xff0c;以供各位考生复习参考&#xff0c;希望对考生复习有所帮助。从年初开始&#xff0c;断断续续的&#xff0c;windows7使用也有一段时间&#xff0c;碰到…

MySQL5.6忘记root密码(win平台)

1、首先net stop mysql服务&#xff0c;并且切换到任务管理器&#xff0c;有与mysql有关的&#xff0c;最好关闭进程。 2、运行CMD命令切换到MySql安装bin目录&#xff0c;下面是我的mysql安装目录 cd C:\Program Files\MySQL\MySQL Server 5.6\bin 接着执行mysqld --skip-gra…

单片机四位数加减计算机程序,51单片机简易计算器程序 实现数字的加减乘除运算...

//头文件#define uint unsigned int#define uchar unsigned charsbit lcdenP1^1; //LCD1602控制引脚sbit rsP1^0;sbit rwP1^2;sbit busyP0^7;//LCD忙char i,j,temp,num,num_1;long a,b,c; //a,第一个数 b,第二个数 c,得数float a_c,b_c;uchar flag,fuhao;//flag表示是否有运…

在pandas中遍历DataFrame行

有如下 Pandas DataFrame&#xff1a; import pandas as pd inp [{c1:10, c2:100}, {c1:11,c2:110}, {c1:12,c2:120}] df pd.DataFrame(inp) print df 上面代码输出&#xff1a; c1 c2 0 10 100 1 11 110 2 12 120 现在需要遍历上面DataFrame的行。对于每一行&#x…

MySQL索引的Index method中btree和hash的区别

2019独角兽企业重金招聘Python工程师标准>>> 在MySQL中&#xff0c;大多数索引&#xff08;如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT&#xff09;都是在BTREE中存储&#xff0c;但使用memory引擎可以选择BTREE索引或者HASH索引&#xff0c;两种不同类型的索引各自有其…

Oracle 11g数据库管理与开发指南

为什么80%的码农都做不了架构师&#xff1f;>>> Oracle 11g数据库管理与开发指南 本书内容系统而全面&#xff0c;详细讲解了Oracle数据库的管理、开发、性能优化、以及PL/SQL 编程的相关知识&#xff0c;面面俱到&#xff1b;注重实战&#xff0c;为每个知识…

SQL Server 跨网段(跨机房)复制

一.本文所涉及的内容&#xff08;Contents&#xff09; 本文所涉及的内容&#xff08;Contents&#xff09;背景&#xff08;Contexts&#xff09;解决方案&#xff08;Solution&#xff09;搭建过程&#xff08;Process&#xff09;注意事项&#xff08;Attention&#xff09;…

Twitter Storm安装配置(Ubuntu系统)单机版

要使用storm首先要安装以下工具&#xff1a;JDK、Python、zookeeper、zeromq、jzmq、storm &#xff08;注&#xff1a;各个模块都是独立的&#xff0c;如果安装失败或者卡顿可以单独百度某个模块的安装&#xff0c;都是可以的。&#xff09; JDK1.7安装 参见上篇《Ubuntu下安…

计算机中隐藏的文件找不到了怎么办,隐藏文件夹找不到了怎么办【图解】

在今天&#xff0c;越来越多的人利用电脑来办公。甚至有一些工作&#xff0c;已经与电脑密切相关了。电脑以其强大的功能辅助人们工作&#xff0c;但有时在操作过程中会碰到这样或那样的问题。这个时候人们就会叹其操作的复杂性。就好比如有时你隐藏了一个文件&#xff0c;可是…

CentOS6 配置 yum 阿里源

一、CentOS6停止维护更新日期2020年11月30日 二、2020年12月2日下架了包括官方所有的CentOS6源&#xff08;包括国内的镜像站&#xff09; 三、CentOS6也完成了它的历史使命 在生产的环境中依旧由很多CentOS6系统依然在坚持&#xff0c;那么可以采取挂载光盘或者使用centos-va…

使用ab进行页面的压力测试

ab是apache自带的一个很好用的压力测试工具&#xff0c;当安装完apache的时候&#xff0c;就可以在bin下面找到ab 参数说明及示例 我们可以模拟100个并发用户&#xff0c;对一个页面发送1000个请求 输入命令&#xff1a;ab -n1000 -c100 http://stone_w.cnblogs.com/ 其中-n代…