思路:如果一个样本在特征空间中的k个最相近的样本中大多数属于某个类别,则该样本也属于该类别;

这段话中涉及到KNN的三要素:K、距离度量、决策规则

  • K:KNN的算法的结果很大程度取决于K值的选择;

If it's too small, the we gain efficiency but become susceptible to noise and outlier data points.

If it's too large, the we are at risk of over-smoothing our classification results and increasing bias.

  • 距离度量:

欧式距离:

\[d(x,y)=\sqrt{\sum_{k=1}^{n}(x_k-y_k)^2}
\]

曼哈顿距离:

\[d(x,y)=\sqrt{\sum_{k=1}^{n}|x_k-y_k|}
\]

  • 决策规则:

    • 空间中距离越近的点属于一类的可能性就越大;
    • 使用前K个样本中多数类别;

算法过程描述:

  1. 计算测试样本与训练数据之间的距离;
  2. 得到距离按照递增关系排序;
  3. 选取距离最小的K个样本;
  4. 确定选择的K个样本中类别出现的频率;
  5. 选择出现频率最大的类别作为测试样本的类别;

KNN算法的优缺点:

优点:

  • 精度高,对异常值不敏感、无数据输入假定;
  • 简单有效,易理解;

缺点:

  • 计算复杂度高、空间复杂度高;
  • 无法给出任何数据的基础结构信息;

训练简单,测试难;

k-NN更适合低维特征空间,而不适合图片,图片是高维特征空间;

不能进行学习,也就说如果犯错误了,不能变得更聪明;

仅仅依赖于n维空间的distance做分类

KNN算法实现(Python):

默认:已经获取到训练数据\(dataSet \in R^{m \times n}\)、训练集标签\(labels \in R^n\)、测试样本\(inX \in R^{1 \times n}\);

def classify(inX, dataSet, labels, k=3):
# 首先计算测试样本与训练数据之间的欧式距离
m = dataSet.shape[0]
diffMat = np.tile(inX, (m, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistance = sqDiffMat.sum(dim=1)
distance = sqDistance ** 0.5 # 排序,并选择距离最近的前k中样本中类别数目最多的类别
sortedDistanceIndex = distance.argsort()
classCount = {} # 保存距离最近的前k个样本中的类别个数
for i in range(k):
votelabel = labels[sortedDistanceIndex[i]]
classCount[votelabel] = classCount.get(votelabel, 0) + 1 # 有则返回,无则置0
sortedClassCount = np.sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]

sklearn中使用KNN:

# *- coding: utf-8 -*

"""
使用sklearn实现knn
"""
# ===================================== from sklearn import neighbors
from sklearn import datasets # load dataset
iris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target # model
knn = neighbors.KNeighborsClassifier() # 训练
knn.fit(iris_x, iris_y) # 预测
predictedLabel = knn.predict(iris_x) error = sum(abs(predictedLabel - iris_y)) / len(iris_y)
print(error)

reference

Machine Learning-KNN的更多相关文章

  1. [Machine Learning]k-NN

    k-NN最近邻算法 基本思想: 对未知样本X,从训练样本集中获取与其最相近的k个样本,利用这k个样本的类别预测未知样本X的类别. 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大 ...

  2. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  4. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  5. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  6. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. 【Machine Learning】决策树案例:基于python的商品购买能力预测系统

    决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...

  8. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  9. [Machine Learning] 国外程序员整理的机器学习资源大全

    本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). 1. C++ 1.1 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C ...

  10. SOME USEFUL MACHINE LEARNING LIBRARIES.

    from: http://www.erogol.com/broad-view-machine-learning-libraries/ http://www.slideshare.net/Vincenz ...

随机推荐

  1. iis常见问题解决

    iis7以上版本部署4.0框架项目常见问题解决 配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (overrideModeDefault=&quo ...

  2. ava:Map借口及其子类HashMap三

    ava:Map借口及其子类HashMap三 HashMap常用子类(异步非安全线程,性能高: Hashtable:同步的安全线程,性能低) map(HashMap)中的key,value可以通过 Se ...

  3. 分享知识-快乐自己:FastDFS 图片服务器的搭建

    使用一台虚拟机来模拟,只有一个Tracker.一个Storage服务,配置nginx访问图片. 1):安装依赖包 yum -y install zlib zlib-devel pcre pcre-de ...

  4. 列存储压缩技巧,除公共除数或者同时减去最小数,字符串压缩的话,直接去重后用数字ID压缩

    Column-store compression At a high level, doc values are essentially a serialized column-store. As w ...

  5. Python-单元测试unittest

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作,概念见下: TestCase 也就是测试用例 Test ...

  6. BEC listen and translation exercise 35

    高中听力: At five o'clock, we have afternoon tea, but we don't have it in the kitchen. Father's Day is t ...

  7. 2013VS快捷键

    VS2013常用快捷键: 1.回到上一个光标位置/前进到下一个光标位置  1)回到上一个光标位置:使用组合键“Ctrl + -”: 2)前进到下一个光标位置:“Ctrl + Shift + - ”. ...

  8. python实现列队

    1 列队定义 队列是项的有序结合,其中添加新项的一端称为队尾,移除项的一端称为队首.当一个元素从队尾进入队列时,一直向队首移动,直到它成为下一个需要移除的元素为止. 最近添加的元素必须在队尾等待.集合 ...

  9. I.MX6 Android 永不休眠

    /************************************************************************* * I.MX6 Android 永不休眠 * 说明 ...

  10. ffmpeg处理RTMP流媒体的命令和发送流媒体的命令(UDP,RTP,RTMP)

    将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName     re限制输出速率, ...