K_Nearest_Neighbot(knn)方法及其Pyhon 实现
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就可以平滑掉这些绿色的异常点,会有较好的泛化效果。 - 距离的度量
- 分类决策规则: 多数表决。
- k值的选择: k值的减小就相当于是整体模型变得复杂,容易过拟合,k变大表示模型变的简单,k=N表示完全忽略了训练实例中的大量有用信息(这个时候只是单纯的根据训练数据集的标签来进行分类,新输入的数据属于训练集合中元素数比较多的类,根据标签来进行分类是很不靠谱的)。
- 当输入是两张图片时,可以将其转换成两个向量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 实现相关推荐
- matlab knn方法快速实现,手把手教学
目录 介绍 话不多说,进入实战 注意事项 KNN算法的优势和劣势 介绍 1968年,Cover和Hart提出K近邻算法.该算法既可以用于回归也可以用于分类,其用于分类时其输入为实例的特征向量,输出为实 ...
- python knnsearch_sklearn之KNN详解+GridSearchCV使用方法
在了解了KNN的基本原理之后,我们需要学习如何在sklearn中调用KNN算法以及如何用GridSearchCV进行调参 首先导入必要的库以及我们所使用的数据集:iris 1 from sklearn ...
- 对比图像分类五大方法:KNN、SVM、BPNN、CNN和迁移学习
选自Medium 机器之心编译 参与:蒋思源.黄小天.吴攀 图像分类是人工智能领域的基本研究主题之一,研究者也已经开发了大量用于图像分类的算法.近日,Shiyu Mou 在 Medium 上发表 ...
- sklearn之KNN详解+GridSearchCV使用方法
在了解了KNN的基本原理之后,我们需要学习如何在sklearn中调用KNN算法以及如何用GridSearchCV进行调参 首先导入必要的库以及我们所使用的数据集:iris 1 from sklearn ...
- K-最近邻法(KNN)简介
K-最近邻法(K-Nearest Neighbor, KNN)最初由Cover和Hart于1968年提出,是一个在理论上比较成熟的分类算法. KNN是一类可用于分类或回归的技术.作为一个非参数学习算法 ...
- K近邻算法(KNN)原理小结
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 1. KNN算法原理 2. KNN算法三要素 3. KNN算 ...
- 基于机器视觉的缺陷检测的原理与方法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 基于统计分类的方法: (1)基于KNN方法( ...
- 机器学习:基于Knn算法的用户属性判断方案设计
本文作者通过Knn算法进行了一次用户判断预测的流程,文章为作者根据自身经验所做出的总结,希望通过此文能够加深你对Knn算法的认识. knn算法简介 K最近邻(k-Nearest Neighbor,KN ...
- 通过KNN算法,确定球星的风格(很水)
KNN算法,故名思议,K个最邻近值的分类算法.监督学习中的一种,典型的懒人算法,通过计算所有的预测样本到学习样本的距离,选取其中K个最小值加入样本组中,样本组中的样本隶属于那个分类的个数最多,那么我们 ...
最新文章
- vue-cli3.0 移动端适配
- 30分钟掌握ES6/ES2015核心内容(上)
- PyQt5 笔记2 -- Qt Designer使用
- C语言的本质(3)——整数的本质与运算
- android raw 引用,Android 资源-raw和assets
- iphone的生命周期
- android数据持久化存储(2)
- DB2 pureScale在线备份恢复实例1
- 宾州州立大学计算机本科,2020年宾州州立大学本科读几年
- 计算机显卡排名,显卡天梯图_显卡性能天梯图_2021笔记本显卡天梯图-中关村在线...
- 2015年两化融合管理体系贯标试点企业
- 尚学堂马士兵servlet/JSP笔记(四、JSP)
- 维吉尼亚密码原理详解及算法实现
- 如何快速的将PDF文件转换成word?
- 英特尔AI医疗实战曝光:10倍加速辅助诊断、准确度高达90%
- linux防ddos攻击脚本,Linux IPTables防DDOS攻击Shell脚本
- oracle 客户端 sqlplus 命令行 问号 乱码
- 为什么ps里的液化工具里的部分功能用不了
- PPT2010封装为exe教程
- 【图论】关于邻接表建图
热门文章
- BJ-100型矩形波导传输TE10模,测得波导中相邻两个电场波节点之间的距离为19.88mm
- TP5.x——update更新成功但是返回是0
- 测试管理工具实践(小组作业)
- php.ini – 配置文件详解
- PHP正则表达式详解(三)
- mac机器下远程仓库添加完毕之后,却无法上传应有的内容。
- [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁
- Oracle logmnr使用
- nhibernate源码分析之六: Criteria数据加载
- Nuget包管理工具(程序包控制台执行语句)