医院网站建设的要求,wordpress主题更新提醒,杭州餐饮vi设计,中小企业网站建设框架KNN算法原理#xff1a;
KNN#xff08;k-nearest neighbor#xff09;是一个简单而经典的机器学习分类算法#xff0c;通过度量”待分类数据”和”类别已知的样本”的距离#xff08;通常是欧氏距离#xff09;对样本进行分类。 这话说得有些绕口#xff0c;且来分解…KNN算法原理
KNNk-nearest neighbor是一个简单而经典的机器学习分类算法通过度量”待分类数据”和”类别已知的样本”的距离通常是欧氏距离对样本进行分类。 这话说得有些绕口且来分解一番 1分类问题都是监督supervised问题也就是说一定数量的样本类别是已知的。 2既然我们已经有了一批分好类的样本那么接下来的工作自然应该是通过已知样本训练分类器通过调节分类器的参数使分类器能够正确对训练样本分类把分类器训练好以后用于对未知样本的分类或类别预测。 看上去就是这么回事问题的关键在于分类器的训练。 但对于KNN分类器来说事情并不是这个样子的。其实KNN并没有这么复杂。因为KNN并没有什么参数要调换句话说KNN其实并不需要训练 作为最简单也最好理解的分类器KNN只是假设数据都分布在欧式的特征空间内以特征值为坐标区分不同样本的空间然后我们恰好又知道全部数据在这个空间中的位置以及其中一部分数据的类别。那么现在我们怎么判断剩余那些数据的类别呢 为了让分类进行下去这里其实我们假设空间中距离越近的点属于一类的可能性越大。 有了这条“公理”那事情就好办多了。我们只需要计算每个待分类数据到全部已知类别数据的距离就好了。如图 有正方形和三角形两个已知类假如中间的圆形我们不知道它到底是三角形还是正方形。按照上面说的我们可以正儿八经计算一下它到其他所有点的距离。在这里为了简便我们目测一下发现它离旁边的三角形最近好嘞那么我们就把它归为三角形一类的。 注意这里我们把未知点和离它最近的那一个点归为一类。这样的分类器准确来说叫最近邻分类器nearest-neighborNN。这是KNN的特殊情况是K1的情况。 那么K近邻顾名思义就是要一个未知点参考离它最近的前k个一直类别的点看在这k个点里面属于哪个类别的点最多就认为未知点属于哪一类。还是上面的图以圆形未知点为圆心在实线画出的圆中相当于k3也就是选了前三个离得最近的点其中三角形2个方形1个所以未知点归到三角形一类。但是当考虑虚线范围内时也就是k5时我们发现方形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]dsiftdsift.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]dsiftdsift.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的概率很高