机器学习实战之KNN
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的更多相关文章
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...
- 机器学习实战 之 KNN算法
现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...
- 机器学习实战1-1 KNN电影分类遇到的问题
为什么电脑排版效果和手机排版效果不一样~ 目前只学习了python的基础语法,有些东西理解的不透彻,希望能一边看<机器学习实战>,一边加深对python的理解,所以写的内容很浅显,也许还会 ...
- 《机器学习实战》KNN算法实现
本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...
- 机器学习实战之kNN算法
机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.1 ...
- 机器学习实战笔记——KNN约会网站
''' 机器学习实战——KNN约会网站优化 ''' import operator import numpy as np from numpy import * from matplotlib.fon ...
- 机器学习实战笔记——KNN
机器学习实战——读书笔记 书籍奉上
- 基于Python的机器学习实战:KNN
1.KNN原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应 ...
- 吴裕雄--天生自然python机器学习实战:K-NN算法约会网站好友喜好预测以及手写数字预测分类实验
实验设备与软件环境 硬件环境:内存ddr3 4G及以上的x86架构主机一部 系统环境:windows 软件环境:Anaconda2(64位),python3.5,jupyter 内核版本:window ...
随机推荐
- Oracle - exp实战
一.概述 exp/imp是oracle中的一个逻辑导出和导入工具,假想一个场景,当我们使用exp命令在对用户进行导出的时候,如果该用户中的某些表的数据有修改,或表结构进行了修改,或者表被删除,那么我们 ...
- asp.net core使用serilog将日志推送到腾讯云日志服务
为什么是serilog? Serilog是 .NET 中最著名的结构化日志类库. 基于日志事件log events,而不是日志消息log message. 你可以将日志事件格式化为控制台的可读文本或者 ...
- Python, import, module
When the interpreter reads a python script file, it does two things: (1) set some special variable. ...
- java 超详细面经整理(持续更新)2019.12.19
目录 Java SE 请你解释HashMap中为什么重写equals还要重写hashcode? 请你介绍一下map的分类和常见的情况 请你讲讲Java里面的final关键字是怎么用的? 请你谈谈关于S ...
- Unity容器<1>
参考地址: https://docs.microsoft.com/en-us/previous-versions/msp-n-p/dn170416(v=pandp.10) 总览 Unity是一个轻量级 ...
- maven 解决jar包冲突及简单使用
maven 解决jar包冲突 1.jar包冲突原因 maven中使用坐标导入jar包时会把与之相关的依赖jar包导入(导入spring-context的jar时就会把spring的整个主体导入) ,而 ...
- Spring Boot Mybatis 最基本使用mysql存储过程
首先声明:只是用最简单的方法大致了解如何用存储过程开发,如果需要查看存储过程创建语法的自行百度搜索 一.首先创建最基本的数据库 CREATE TABLE `t_user` ( `id` varchar ...
- SSM(SpringMVC+Spring+MyBatis)三大框架使用Maven快速搭建整合(实现数据库数据到页面进行展示)
本文介绍使用SpringMVC+Spring+MyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程. 技术选型:SpringMVC+Spring+M ...
- 开发一个这样的 APP 要多长时间?
作者:蒋国刚 www.cnblogs.com/guogangj/p/4676836.html 这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正 ...
- echarts堆叠图计算总数和各部分
app.title = '堆叠条形图'; option = { tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type ...