邻近算法(KNN算法)
-
邻近算法
锁定
- 中文名
- k最邻近分类算法
- 外文名
- k-NearestNeighbor
- 用 途
- 用于分类,对未知事物的识别
目录
- 1 简介
- 2 算法流程
- 3 优点
- 4 缺点
- 5 改进策略
简介
算法流程
优点
缺点
改进策略
一、算法概述
最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数据,对于新的数据则直接和训练数据匹配,如果存在相同属性的训练数据,则直接用它的分类来作为新数据的分类。这种方式有一个明显的缺点,那就是很可能无法找到完全匹配的训练记录。
kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。
2、代表论文
Discriminant Adaptive Nearest Neighbor Classification
Trevor Hastie and Rolbert Tibshirani
IEEE TRANSACTIONS ON PAITERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 18, NO. 6, JUNE 1996
http://www.stanford.edu/~hastie/Papers/dann_IEEE.pdf
3、行业应用
客户流失预测、欺诈侦测等(更适合于稀有事件的分类问题)
二、算法要点
1、指导思想
kNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断出你的类别。
计算步骤如下:
1)算距离:给定测试对象,计算它与训练集中的每个对象的距离
2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻
3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类
2、距离或相似度的衡量
什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。
觉的距离衡量包括欧式距离、夹角余弦等。
对于文本分类来说,使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适。
3、类别的判定
投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。
加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)
三、优缺点
1、优点
简单,易于理解,易于实现,无需估计参数,无需训练
适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好
2、缺点
懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
可解释性较差,无法给出决策树那样的规则。
四、常见问题
1、k值设定为多大?
k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响)
k值通常是采用交叉检验来确定(以k=1为基准)
经验规则:k一般低于训练样本数的平方根
2、类别如何判定最合适?
投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。
3、如何选择合适的距离衡量?
高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。
变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。
4、训练样本是否要一视同仁?
在训练集中,有些样本可能是更值得依赖的。
可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。
5、性能问题?
kNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。
懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。
已经有一些方法提高计算的效率,例如压缩训练样本量等。
6、能否大幅减少训练样本量,同时又保持分类精度?
浓缩技术(condensing)
编辑技术(editing)
1. 综述
2. 利用Python的机器学习库sklearn: SkLearnExample.pyfrom sklearn import neighbors
from sklearn import datasetsknn = neighbors.KNeighborsClassifier()iris = datasets.load_iris()print irisknn.fit(iris.data, iris.target)predictedLabel = knn.predict([[0.1, 0.2, 0.3, 0.4]])print predictedLabel3. KNN 实现Implementation:# Example of kNN implemented from Scratch in Pythonimport csv
import random
import math
import operatordef loadDataset(filename, split, trainingSet=[] , testSet=[]):with open(filename, 'rb') as csvfile:lines = csv.reader(csvfile)dataset = list(lines)for x in range(len(dataset)-1):for y in range(4):dataset[x][y] = float(dataset[x][y])if random.random() < split:trainingSet.append(dataset[x])else:testSet.append(dataset[x])def euclideanDistance(instance1, instance2, length):distance = 0for x in range(length):distance += pow((instance1[x] - instance2[x]), 2)return math.sqrt(distance)def getNeighbors(trainingSet, testInstance, k):distances = []length = len(testInstance)-1for x in range(len(trainingSet)):dist = euclideanDistance(testInstance, trainingSet[x], length)distances.append((trainingSet[x], dist))distances.sort(key=operator.itemgetter(1))neighbors = []for x in range(k):neighbors.append(distances[x][0])return neighborsdef getResponse(neighbors):classVotes = {}for x in range(len(neighbors)):response = neighbors[x][-1]if response in classVotes:classVotes[response] += 1else:classVotes[response] = 1sortedVotes = sorted(classVotes.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedVotes[0][0]def getAccuracy(testSet, predictions):correct = 0for x in range(len(testSet)):if testSet[x][-1] == predictions[x]:correct += 1return (correct/float(len(testSet))) * 100.0def main():# prepare datatrainingSet=[]testSet=[]split = 0.67loadDataset(r'D:\MaiziEdu\DeepLearningBasics_MachineLearning\Datasets\iris.data.txt', split, trainingSet, testSet)print 'Train set: ' + repr(len(trainingSet))print 'Test set: ' + repr(len(testSet))# generate predictionspredictions=[]k = 3for x in range(len(testSet)):neighbors = getNeighbors(trainingSet, testSet[x], k)result = getResponse(neighbors)predictions.append(result)print('> predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))accuracy = getAccuracy(testSet, predictions)print('Accuracy: ' + repr(accuracy) + '%')main()
邻近算法(KNN算法)相关推荐
- 基于KD树的K近邻算法(KNN)算法
文章目录 KNN 简介 KNN 三要素 距离度量 k值的选择 分类决策规则 KNN 实现 1,构造kd树 2,搜索最近邻 3,预测 用kd树完成最近邻搜索 K近邻算法(KNN)算法,是一种基本的分类与 ...
- 机器学习算法—KNN算法原理
机器学习算法-KNN算法原理 概述: KNN算法一般也会经常被称为K邻近算法,其核心思想是根据训练集中的样本分类计算测试集中样本与训练集中所有样本的距离,根据所设定的K值选取前K个测试样本与训练样本最 ...
- 分类算法matlab实例,数据挖掘之分类算法---knn算法(有matlab例子)
knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.注意,不是聚类算法.所以这种分类算法 必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒 ...
- 人工智能算法--KNN算法(C++实现)
# 上面的图片是在网上随手翻到的-很符合主题-侵权删 # 蹭热度ing Knn算法,用于分类. 通过得到逻辑上的相近程度实现判断,K值的大小体现的是一个容错的过程. 提高预测准确度的方法: 调整K值, ...
- 最近邻算法(KNN算法)
原理:找到k个与新数据最近的样本取样本中最多的一个类别作为新数据的类别 距离最近的那个类就是新数据属于的类别 最近距离计算(欧式距离,曼哈顿距离,切比雪夫距离,马氏距离) 优点:简单易实习,对于边界不 ...
- 数据挖掘原理与算法 kNN算法
用于在不清楚具体分组的情况下,给待分配数据分一个组,遍历一遍所有数据即可实现,先选择前面的k个元素作为训练基础,再用后面的数据和待分配数据结合,根据距离不断替换集合里面的元素,最后得到分组,代码并不难 ...
- 机器学习的练功方式(四)——KNN算法
文章目录 致谢 致歉 4 KNN算法 4.1 sklearn转换器和估计器 4.1.1 转换器 4.1.2 估计器 4.2 KNN算法 4.2.1 概述 4.2.2 电影类型分析 4.2.3 算法实现 ...
- 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题
本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...
- 基于python的简单KNN算法(K- Nearest Neighbor)的实现与改进
最近在自学python的数据分析,还想稍微蹭一蹭深度学习,于是不可避免地接触到了最简单的机器学习算法--KNN算法.该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近) ...
最新文章
- 首批国家级一流本科专业公布,至少64所高校计算机相关专业入选,AI专业不够推荐资格...
- 详解:Drools规则引擎探究
- left join(左联接) left join(左联接) left join(左联接)
- springboot静态网页放哪里_STEP4.1 第一个SpringBoot项目
- java中怎么把生成文件到项目根目录_[SpringBoot2.X] 02- 项目结构介绍
- FixedThreadPool 使用方法测试
- [转]MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别
- Java 学习笔记(官方不推荐写法篇)
- 计算机视觉实战(五)图像梯度计算
- linux 服务器长ping 加时间戳
- [CTF]天下武功唯快不破
- 区分计算机网络和互联网的概念,网络的概念,网络与互联网的区别
- 使用opencv识别同心圆
- 從檔案讀16進位字串轉成字元
- linux下autocad完美替代品ARES Commander的安装运行
- “科林明伦杯”哈尔滨理工大学第十届部分题解
- USB扫码枪二维码读取(二)——MFC篇
- 头颅ct有伪影_颅脑CT怎么看?正常和异常影像分别是什么
- codevs 2833 奇怪的梦境
- 实验一段有趣的js代码。
热门文章
- 现代软件工程系列 结对编程 两周写好3D 陆战棋
- yii schema.mysql.sql_YII学习,初体验 ,对YII的一些理解.
- javascript实现图片轮播_第2章 第9节 JavaScript(四)
- android 代码 shape,Android Shape控件美化实现代码
- freemarker ftl模板_效率提升百分之四十,AS模板也太好用了吧
- linux协议栈劫持,Linux系统优化之TCP协议栈优化-基本篇1
- yolov4 开发环境搭建_YOLOv4 的各种新实现、配置、测试、训练资源汇总
- python异常值删除_python数据清洗中,是如何识别和处理异常值的?
- c语言 指针_C 语言指针详解
- python 最短路径算法_python Dijkstra算法实现最短路径问题的方法