KNN也称K-近邻算法,简单来说,KNN采用测量不同特征值之间的距离的方法进行分类。

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

确定:时间复杂度、空间复杂度较高

适用数据范围:数值型和标称型

工作原理简介:存在一个样本数据集合,并且每个样本数据集中都存在标签。输入没有标签的数据集之后,将新数据集的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本中钱K个最相似的数据,这就是K-近邻中K的出处,通常K是不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,作为新数据集的分类标签。

示例1:使用KNN改进约会网站的配对效果

labels:不喜欢的人

     魅力一般的人

     极具魅力的人

Feature:每年获得的飞行常客里程数

    玩视频游戏所消耗的时间百分比

    每周消耗的冰淇淋公升数

示例代码如下:

import numpy as np
import operator
import matplotlib
import matplotlib.pyplot as plt #KNN 分类器
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #复制inX为(dataSetSize, 1)
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis = 1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() #按照value排序,并且返回索引
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key = lambda item: item[1] ,reverse = True) return sortedClassCount[0][0]

#将文件中数据转化为矩阵数据
def file2matrix(fileName):
fr = open(fileName)
arrayAllLines = fr.readlines()
numberOfLines = len(arrayAllLines)
returnMat = np.zeros((numberOfLines, 3))
classLabelVector = []
index = 0 for line in arrayAllLines:
line.strip() #默认删除此行开头和结尾的空格和换行
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1 return returnMat, classLabelVector

#归一化
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
row = dataSet.shape[0]
normDataSet = dataSet - np.tile(minVals, (row, 1))
normDataSet = normDataSet / np.tile(ranges, (row, 1))
return normDataSet, ranges, minVals

#随机选取10%的数据进行测试
def datingClassTest():
hoRatio = 0.10
pathName = "./datingTestSet2.txt"
datingDataMat, datingLabels = file2matrix(pathName)
normMat, ranges, minVals = autoNorm(datingDataMat)
row = normMat.shape[0]
numTestVecs = int(hoRatio * row)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i,:], normMat[numTestVecs:row,:], datingLabels[numTestVecs:row], 5)
print("The classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
if(classifierResult != datingLabels[i]):
errorCount += 1.0 print("The total error tate is : %f" % (errorCount / float(numTestVecs))) datingClassTest()

示例2:手写数字识别系统

import numpy as np
import operator
import matplotlib
import matplotlib.pyplot as plt
from os import listdir #KNN 分类器
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #复制inX为(dataSetSize, 1)
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis = 1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort() #按照value排序,并且返回索引
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key = lambda item: item[1] ,reverse = True) return sortedClassCount[0][0] #将文本文件转化为向量
def img2vector(fileName):
returnVect = np.zeros((1,32 * 32))
fr = open(fileName)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0,i * 32 + j] = int(lineStr[j]) return returnVect #手写数字测试错误率
def handwritingClassTest():
hwLabels = []
trainingFileList = listdir('trainingDigits')
m = len(trainingFileList)
trainingMat = np.zeros((m, 32 * 32))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNum = int(fileStr.split('_')[0])
hwLabels.append(classNum)
trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr) testFileList = listdir('testDigits')
m = len(testFileList)
errorCount = 0.0
for i in range(m):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
realClassNum = int(fileStr.split('_')[0])
testVect = img2vector('testDigits/%s' % fileNameStr)
testClassNum = classify0(testVect, trainingMat, hwLabels, 3)
print("The classifier came back with: %d, the real answer is: %d" % (testClassNum, realClassNum))
if(testClassNum != realClassNum):
errorCount += 1.0 print("The total error rate is: %f" % (errorCount / float(m))) handwritingClassTest()

数据集下载以及完整jupyter notebook 代码下载:

https://github.com/qwqwqw110/machineLearningInactionCode/tree/master/KNN

机器学习实战之KNN的更多相关文章

  1. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...

  2. 机器学习实战 之 KNN算法

    现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...

  3. 机器学习实战1-1 KNN电影分类遇到的问题

    为什么电脑排版效果和手机排版效果不一样~ 目前只学习了python的基础语法,有些东西理解的不透彻,希望能一边看<机器学习实战>,一边加深对python的理解,所以写的内容很浅显,也许还会 ...

  4. 《机器学习实战》KNN算法实现

    本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...

  5. 机器学习实战之kNN算法

    机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.1 ...

  6. 机器学习实战笔记——KNN约会网站

    ''' 机器学习实战——KNN约会网站优化 ''' import operator import numpy as np from numpy import * from matplotlib.fon ...

  7. 机器学习实战笔记——KNN

    机器学习实战——读书笔记 书籍奉上

  8. 基于Python的机器学习实战:KNN

    1.KNN原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应 ...

  9. 吴裕雄--天生自然python机器学习实战:K-NN算法约会网站好友喜好预测以及手写数字预测分类实验

    实验设备与软件环境 硬件环境:内存ddr3 4G及以上的x86架构主机一部 系统环境:windows 软件环境:Anaconda2(64位),python3.5,jupyter 内核版本:window ...

随机推荐

  1. django-channels的部署(supervisor+daphne+nginx)

    项目中需要一个聊天室的功能,所以需要websocket通信,选择了使用channels模块,主要记录下channels部署的配置和一些坑. 原项目是通过nginx+uwsgi部署的,这里我没做任何改动 ...

  2. Choose the WinForms UI Type 选择 WinForms UI 类型

    In this lesson, you will learn how to change the UI Type of the WinForms application. By default, th ...

  3. report for PA1

    说明:最近特别忙,都没有时间写blog,好多遇到的问题都没能记下来,下面是PA1的报告主要记录了nemu debuger一些功能的实现方式和实现中遇到的问题,代替一下blog (申明:This is ...

  4. [转]自定义UiPath Activity实践

    本文转自:https://segmentfault.com/a/1190000017440647 为了对UiPath Activity的实现方式一探究竟,自己尝试实践编写了一个简单的Activity, ...

  5. Github访问速度很慢的原因,以及解决方法

    1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数据时,不需要直接从源站获取,通过CDN对于数 ...

  6. LeetCode刷题191218

    好多天没有更新了,今天有空,刷一道. 算法第5题 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: ...

  7. web项目的初始搭建和intellij的tomcat的配置

    点击web application

  8. s3c2440裸机-异常中断(一. 异常、中断的原理与流程)

    1.异常中断概述 在arm架构的处理器中,cpu有7中工作模式,2中工作状态. 1.CPU模式(Mode): 7种Mode: 除了usr/sys,其他5种都是异常模式.我们知道中断属于异常的2中,中断 ...

  9. VSCode+C++环境搭建

    date: 2019-10-05 VSCode+C++环境搭建 其实并不完整,毕竟我也只是一个OIer,并不会很高深的东西.(众所周知,OIer主业是软件开发) 安装VSCode 下载安装包 这个很简 ...

  10. 2019-2020-1 20199305《Linux内核原理与分析》第七周作业

    进程的描述与创建 (一)进程的描述 (1)操作系统内核实现操作系统的三大管理功能(进程管理最为核心) 进程管理 内存管理 文件系统 (2)在Linux内中用一个数据结构struct task_stru ...