1.KNN原理:

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中最相似数据(最近邻)的分类标签。一般来说,只选择样本数据集中前 $k$ 个最相似的数据,这就是KNN算法 $k$ 的出处, 通常 $k$ 是不大于20的整数。最后,选择 $k$ 个最相似数据中出现次数最多的分类,作为新数据的分类。

2.实验准备:

  • Python
  • scikit-learn(一个基于python的机器学习库)

3.实验代码:

代码有两个版本,一个是自己编写的简单的KNN算法实现,一个是基于scikit-learn库中KNN算法实现的,数据均采用scikit-learn中的手写体数据集。

版本1(自己编写):

# -*- coding: utf-8 -*-
"""
This script is an exercise on KNN. Created on Tue Nov 03 21:21:39 2015 @author: 90Zeng
""" import numpy as np
from sklearn import datasets
import operator #-----------------function classify--------------------------------------
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[ 0 ]
# 计算输入的向量inX与所有样本的距离
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis = 1)
distances = sqDistances ** 0.5
# 对距离大小进行排序
sortedDistIndices = distances.argsort()
classCount = {}
# 选择距离最小的 K 个点
for i in range(k):
voteLabel = labels[ sortedDistIndices[i] ]
classCount[ voteLabel ] = classCount.get(voteLabel, 0) + 1
# 按照类别的数量多少进行排序
sortedClassCount = sorted(classCount.iteritems(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0] # 返回类别数最多的类别名称
#-------------------end of function classify-------------------------------- def handwritingClassTest():
# 导入数据
digits = datasets.load_digits()
totalNum = len(digits.data)
# 选出90%样本作为训练样本,其余10%测试
trainNum = int(0.8 * totalNum)
trainX = digits.data[0 : trainNum]
trainY = digits.target[0 : trainNum] testX = digits.data[trainNum:]
testY = digits.target[trainNum:] errorCount = 0
testExampleNum = len( testX )
for i in range( testExampleNum ):
# 测试样本在测试集中真实的类别
trueLabel = testY[i]
classifierResult = classify0( testX[ i, : ], trainX, trainY, 5 )
print "\nThe classifier came back with: %d, the real answer is: %d"\
% ( classifierResult, trueLabel )
if trueLabel != classifierResult:
errorCount += 1
else:
pass
print "\nThe total number of errors is: %d" % errorCount
print "\nthe total error rate is: %f" % (
errorCount / float( testExampleNum)
) if __name__ == '__main__':
print "start..."
handwritingClassTest()

运行结果:

版本2(使用库函数):

# -*- coding: utf-8 -*-
"""
This script is an exercise on KNN. Created on Tue Nov 06 21:26:39 2015 @author: ZengJiulin
"""
print(__doc__) import numpy as np
from sklearn import neighbors, datasets digits = datasets.load_digits()
totalNum = len(digits.data)
# 选出90%样本作为训练样本,其余10%测试
trainNum = int(0.8 * totalNum)
trainX = digits.data[0 : trainNum]
trainY = digits.target[0 : trainNum] testX = digits.data[trainNum:]
testY = digits.target[trainNum:] n_neighbors = 10 clf = neighbors.KNeighborsClassifier(n_neighbors, weights='uniform')
clf.fit(trainX, trainY)
Z = clf.predict(testX) print "\nthe total error rate is: %f" % ( 1 - np.sum(Z==testY) / float(len(testX)) )

运行结果:

4.总结

KNN的优点:精度高、对异常值不敏感,无数据输入假定

缺点:计算复杂度高(要计算待分类样本与所有已知类别样本的距离),空间复杂度高(存储所有样本点和目标样本的距离)

基于Python的机器学习实战:KNN的更多相关文章

  1. 基于Python的机器学习实战:Apriori

    目录: 1.关联分析 2. Apriori 原理 3. 使用 Apriori 算法来发现频繁集 4.从频繁集中挖掘关联规则 5. 总结 1.关联分析  返回目录 关联分析是一种在大规模数据集中寻找有趣 ...

  2. 基于Python的机器学习实战:AadBoost

    目录: 1. Boosting方法的简介 2. AdaBoost算法 3.基于单层决策树构建弱分类器 4.完整的AdaBoost的算法实现 5.总结 1. Boosting方法的简介 返回目录 Boo ...

  3. 【python与机器学习实战】感知机和支持向量机学习笔记(一)

    对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...

  4. 机器学习实战kNN之手写识别

    kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...

  5. K近邻 Python实现 机器学习实战(Machine Learning in Action)

    算法原理 K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴.其实K近邻并没有显式的学习过程,它的学习过程就是测试过程.K近邻思想很简单:先给你一个训练数据集D,包括 ...

  6. 《机器学习实战-KNN》—如何在cmd命令提示符下运行numpy和matplotlib

    问题背景:好吧,文章标题是瞎取得.平常用cmd运行python代码问题不大,我在学习<机器学习实战>这本书时,发现cmd无法运行import numpy as np以及import mat ...

  7. 朴素贝叶斯算法的python实现 -- 机器学习实战

    import numpy as np import re #词表到向量的转换函数 def loadDataSet(): postingList = [['my', 'dog', 'has', 'fle ...

  8. 基于python的机器学习开发环境安装(最简单的初步开发环境)

    一.安装Python 1.下载安装python3.6 https://www.python.org/getit/ 2.配置环境变量(2个) 略...... 二.安装Python算法库 安装顺序:Num ...

  9. 机器学习实战-KNN

    KNN算法很简单,大致的工作原理是:给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签.简称kNN.通常k是不大于 ...

随机推荐

  1. 在 Linux 上安装配置 BitTorrent Sync [转]

    背景介绍:目前我们线上的前端服务器数量比较多,超过200多台,每次发布新应用的时候,都是将软件包放在一台专门的Push服务器上,再由所有的前端服务器通过rsync自动同步.但随着前端服务器的数量越来越 ...

  2. emwin之在WM_INIT_DIALOG分支下使用带触发功能的函数的程序框架

    @2018-08-29 [小记] 为避免在窗口创建时由于使用了带触发功能的函数导致执行一些在初始化过程中不允许的操作,特整理一个流程架构 --① 定义一个初始化完成的标志 unsigned ; --② ...

  3. 【AGC010D】Decrementing

    Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...

  4. C++类间相互引用

    两个类相互包含引用的问题 不管是下文中提到的例子,还是任何情况,使得class A的头文件需要include class B的头文件,class B的也要引用A的头文件,这种状况下,貌似会出现有一个类 ...

  5. Windows 10中设置自动登录

    步骤 使用WinKey+R打开运行,输入netplwiz. 在打开的用户账户对话框-用户选项卡-取消勾选要使用本计算机,用户必须输入用户名和密码(E). 点击应用按钮,在弹出的自动登录对话框中输入相关 ...

  6. StringTokenizer 的性能看来真的不用担心

    一直以来,分析HTTP的Header使用的都是StringTokenizer,但是看过jdk中关于StringTokenizer的介绍: StringTokenizer 是出于兼容性的原因而被保留的遗 ...

  7. 基于 Django 2.0.4 的 djcelery 配置

    Django Celery 配置实践 所需环境 python 3.5.2 rabbitmq 安装所需的包 pip install -r requirements.txt QuickStart 创建Dj ...

  8. C#网络编程之编码解码

    这里是代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  9. Hive记录-配置远程连接(JAVA/beeline)

    1.修改配置hive-site.xml    hadoop core-site.xml限制---参考Hive记录-部署Hive环境 2.启动hadoop #sh /usr/app/hadoop/sbi ...

  10. go for range

    func main() { var str = "hellow worda" for _, val := range str { fmt.Printf("%q" ...