GREAT THANKS TO: http://cs231n.github.io/classification/

  • 1.近邻算法

    • 给定一个训练数据集合,对新的输入实例,在训练数据集中找到与该实例最近邻的k个实例,这k个实例多数属于某个类,就把这个实例划分为某个类。k=1时,称为最近邻算法。
    • k近邻算法的三个基本要素:
      • k值的选择: k值的减小就相当于是整体模型变得复杂,容易过拟合,k变大表示模型变的简单,k=N表示完全忽略了训练实例中的大量有用信息(这个时候只是单纯的根据训练数据集的标签来进行分类,新输入的数据属于训练集合中元素数比较多的类,根据标签来进行分类是很不靠谱的)。

        上图中NN Classifier是最近邻算法(k==1),可以看到它把蓝色点集中的几个绿色的异常点(Outlier)也区分了出来,这样的模型很容易表现出过拟合,泛化的效果比较差。而最右边的5-NN classifier就可以平滑掉这些绿色的异常点,会有较好的泛化效果。
      • 距离的度量
      • 分类决策规则: 多数表决。
    • 当输入是两张图片时,可以将其转换成两个向量I1I1I_1和I2I2I_2,这里先选用L1L1L_1距离,d1(I1,I2)=∑p∣∣Ip1−Ip2∣∣d1(I1,I2)=∑p|I1p−I2p|d_1 (I_1, I_2) = \sum_{p} \left| I^p_1 - I^p_2 \right|,其过程可视化为:
    • 还可以使用L2L2L_2距离,其几何意义是两个向量之间的欧氏距离,d2(I1,I2)=∑p(Ip1−Ip2)2‾‾‾‾‾‾‾‾‾‾‾‾‾√d2(I1,I2)=∑p(I1p−I2p)2d_2 (I_1, I_2) = \sqrt{\sum_{p} \left( I^p_1 - I^p_2 \right)^2}
    • 近邻算法的有点和缺点(pros and cons)
      • 优点:易于实现和理解,无需训练
      • 缺点:测试花费的时间太长
      • 缺点: 当输入数据的维度很高时,譬如图片很大,像L2距离这些并没有感官上的直接联系。
        如下图,
        基于像素的高维数据的距离是非常不直观的,上图中最左侧是原始图像,右侧三张与其的L2距离是相同的,但很显然从视觉效果上和语义上它们三个之间并没什么相关性。L1和L2距离只是和图片背景和颜色分布有较强的相关性。
    • 2.代码实现
     #!/usr/bin/env python2## -*- coding: utf-8 -*-"""Created on Thu Aug  2 09:46:44 2018@author: rd"""from __future__ import divisionimport numpy as npclass KNearestNeighbor(object):""" a kNN classifier with L2 distance """def __init__(self):pass"""In kNearestNeighbor,training means store the training data"""def train(self, X, Y):self.X_train = Xself.Y_train = Ydef predict(self, X, k=1, num_loops=0):if num_loops == 0:dists = self.compute_distances_no_loops(X)elif num_loops == 1:dists = self.compute_distances_one_loop(X)elif num_loops == 2:dists = self.compute_distances_two_loops(X)else:raise ValueError('Invalid value %d for num_loops' % num_loops)return self.predict_labels(dists, k=k)def compute_distances_two_loops(self, X):num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))for i in range(num_test):for j in range(num_train):dists[i][j]=np.sum(np.square(self.X_train[j,:] - X[i,:]))return distsdef compute_distances_one_loops(self,X):num_test = X.shape[0]num_train = self.X_train.shape[0]dists = np.zeros((num_test, num_train))for i in range(num_test):dists[i]=np.sum(np.square(self.X_train-X[i]),axis=1)return distsdef compute_distances_no_loops(self,X):squa_sum_X=np.sum(np.square(X),axis=1).reshape(-1,1)squa_sum_Xtr=np.sum(np.square(self.X_train),axis=1)inner_prod=np.dot(X,self.X_train.T)dists = -2*inner_prod+squa_sum_X+squa_sum_Xtrreturn distsdef predict_labels(self, dists, k=1):num_test = dists.shape[0]y_pred = np.zeros(num_test)for i in range(num_test):pos=np.argsort(dists[i])[:k]closest_y = self.Y_train[pos]y_pred[i]=np.argmax(np.bincount(closest_y.astype(int)))return y_pred"""This dataset is part of MNIST dataset,but there is only 3 classes,classes = {0:'0',1:'1',2:'2'},and images are compressed to 14*14 pixels and stored in a matrix with the corresponding label, at the end the shape of the data matrix is num_of_images x 14*14(pixels)+1(lable)"""def load_data(split_ratio):tmp=np.load("data216x197.npy")data=tmp[:,:-1]label=tmp[:,-1]mean_data=np.mean(data,axis=0)train_data=data[int(split_ratio*data.shape[0]):]-mean_datatrain_label=label[int(split_ratio*data.shape[0]):]test_data=data[:int(split_ratio*data.shape[0])]-mean_datatest_label=label[:int(split_ratio*data.shape[0])]return train_data,train_label,test_data,test_labeldef main():train_data,train_label,test_data,test_label=load_data(0.4)knn=KNearestNeighbor()knn.train(train_data,train_label)Yte=knn.predict(test_data,k=2)print "The accuracy is {}".format(np.mean(Yte==test_label))if __name__=="__main__":main()>>>python knn.pyThe accuracy is 0.976744186047#数据很少,图片是单通道尺寸也很小,所以分类结果还不错 

K_Nearest_Neighbot(knn)方法及其Pyhon 实现相关推荐

  1. matlab knn方法快速实现,手把手教学

    目录 介绍 话不多说,进入实战 注意事项 KNN算法的优势和劣势 介绍 1968年,Cover和Hart提出K近邻算法.该算法既可以用于回归也可以用于分类,其用于分类时其输入为实例的特征向量,输出为实 ...

  2. python knnsearch_sklearn之KNN详解+GridSearchCV使用方法

    在了解了KNN的基本原理之后,我们需要学习如何在sklearn中调用KNN算法以及如何用GridSearchCV进行调参 首先导入必要的库以及我们所使用的数据集:iris 1 from sklearn ...

  3. 对比图像分类五大方法:KNN、SVM、BPNN、CNN和迁移学习

     选自Medium 机器之心编译 参与:蒋思源.黄小天.吴攀 图像分类是人工智能领域的基本研究主题之一,研究者也已经开发了大量用于图像分类的算法.近日,Shiyu Mou 在 Medium 上发表 ...

  4. sklearn之KNN详解+GridSearchCV使用方法

    在了解了KNN的基本原理之后,我们需要学习如何在sklearn中调用KNN算法以及如何用GridSearchCV进行调参 首先导入必要的库以及我们所使用的数据集:iris 1 from sklearn ...

  5. K-最近邻法(KNN)简介

    K-最近邻法(K-Nearest Neighbor, KNN)最初由Cover和Hart于1968年提出,是一个在理论上比较成熟的分类算法. KNN是一类可用于分类或回归的技术.作为一个非参数学习算法 ...

  6. K近邻算法(KNN)原理小结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 1. KNN算法原理 2. KNN算法三要素 3. KNN算 ...

  7. 基于机器视觉的缺陷检测的原理与方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 基于统计分类的方法: (1)基于KNN方法( ...

  8. 机器学习:基于Knn算法的用户属性判断方案设计

    本文作者通过Knn算法进行了一次用户判断预测的流程,文章为作者根据自身经验所做出的总结,希望通过此文能够加深你对Knn算法的认识. knn算法简介 K最近邻(k-Nearest Neighbor,KN ...

  9. 通过KNN算法,确定球星的风格(很水)

    KNN算法,故名思议,K个最邻近值的分类算法.监督学习中的一种,典型的懒人算法,通过计算所有的预测样本到学习样本的距离,选取其中K个最小值加入样本组中,样本组中的样本隶属于那个分类的个数最多,那么我们 ...

最新文章

  1. vue-cli3.0 移动端适配
  2. 30分钟掌握ES6/ES2015核心内容(上)
  3. PyQt5 笔记2 -- Qt Designer使用
  4. C语言的本质(3)——整数的本质与运算
  5. android raw 引用,Android 资源-raw和assets
  6. iphone的生命周期
  7. android数据持久化存储(2)
  8. DB2 pureScale在线备份恢复实例1
  9. 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
  10. 计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...
  11. 2015年两化融合管理体系贯标试点企业
  12. 尚学堂马士兵servlet/JSP笔记(四、JSP)
  13. 维吉尼亚密码原理详解及算法实现
  14. 如何快速的将PDF文件转换成word?
  15. 英特尔AI医疗实战曝光:10倍加速辅助诊断、准确度高达90%
  16. linux防ddos攻击脚本,Linux IPTables防DDOS攻击Shell脚本
  17. oracle 客户端 sqlplus 命令行 问号 乱码
  18. 为什么ps里的液化工具里的部分功能用不了
  19. PPT2010封装为exe教程
  20. 【图论】关于邻接表建图

热门文章

  1. BJ-100型矩形波导传输TE10模,测得波导中相邻两个电场波节点之间的距离为19.88mm
  2. TP5.x——update更新成功但是返回是0
  3. 测试管理工具实践(小组作业)
  4. php.ini – 配置文件详解
  5. PHP正则表达式详解(三)
  6. mac机器下远程仓库添加完毕之后,却无法上传应有的内容。
  7. [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
  8. Oracle logmnr使用
  9. nhibernate源码分析之六: Criteria数据加载
  10. Nuget包管理工具(程序包控制台执行语句)