数据

  标称型和数值型

算法

  归一化处理:防止数值较大的特征对距离产生较大影响

  计算欧式距离:测试样本与训练集

  排序:选取前k个距离,统计频数(出现次数)最多的类别

 

 def classify0(inX, dataSet, labels, k):
''' :param inX: 测试样本(arr)
:param dataSet: 训练数据集(arr)
:param labels: 类别(list)
:param k:(int)
:return: 类别
'''
#计算距离
dataSetSize = dataSet.shape[0] # 样本数量
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #tile(inX{数组},(dataSetSize{倍数},1{竖向})):将数组(inX)竖向(1)复制dataSetSize倍
sqDiffMat = diffMat ** 2 #先求平方
sqDistances = sqDiffMat.sum(axis=1) #再求平方和
distances = sqDistances ** 0.5 #开根号,欧式距离
sortedDistIndicies = distances.argsort() #距离从小到大排序的索引
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #用索引得到相应的类别
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
return max(classCount, key=lambda k: classCount[k]) # 返回频数最大的类别

kNN

ps:

  需要先  from numpy import *

  训练集(dataSet)可先归一化处理

  arr值numpy的数组(array)类型

例子:

约会网站的配对

header:每年获得的飞行常客里程数  玩视频游戏所耗时间百分比  每周消费的冰激凌数  评价(类别)

from numpy import *
import re #从文件导入数据
def file2array(filename):
'''
:param filename: 文件名
:return: 数据集(arr)、类别(list)
'''
label={
'didntLike':0,
'smallDoses':1,
'largeDoses':2
}
with open(filename) as fr:
lines =fr.readlines()
tempLine =re.split('\\s+',lines[0].strip()) #'\\s+'表示tab或多个空格 #strip()除去换行符
returnArr = zeros((len(lines),len(tempLine)-1)) #初始化数组(存放数据集)
classLabelVector = [] #存放类别
for index,line in enumerate(lines):
listFromLine = re.split('\\s+',line.strip()) #空格或tab都行
returnArr[index,:] = listFromLine[0:-1]
classLabelVector.append(label[listFromLine[-1]])
return returnArr,classLabelVector #数据归一化
def Norm(dataSet):
minVals = dataSet.min(0) #0:列(特征)的最小值;1:行(样本)的最小值
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(dataSet.shape)
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet /= tile(ranges, (m,1)) #element wise divide
return normDataSet, ranges, minVals #约会网站配对例子
def datingClassTest():
hoRatio = 0.80 #80%作为测试集,20%为训练集
datingDataMat,datingLabels = file2array('..\data\Ch02\datingTestSet.txt') #加载数据
normMat, ranges, minVals = Norm(datingDataMat) #数据归一化
m = normMat.shape[0] #数据集大小(样本的数目)
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
print("预测类别: %d, 真实类别: %d" % (classifierResult, datingLabels[i]))
if (classifierResult != datingLabels[i]): errorCount += 1.0 #统计预测错误的次数
print ("平均错误率是: %f" % (errorCount/float(numTestVecs)))
print("总测试数目:",numTestVecs,"总错误数目:",errorCount) #kNN分类器
def classify0(inX, dataSet, labels, k):
''' :param inX: 测试样本(arr)
:param dataSet: 训练数据集(arr)
:param labels: 类别(list)
:param k:(int)
:return: 类别
'''
#计算距离
dataSetSize = dataSet.shape[0] # 样本数量
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #tile(inX{数组},(dataSetSize{倍数},1{竖向})):将数组(inX)竖向(1)复制dataSetSize倍
sqDiffMat = diffMat ** 2 #先求平方
sqDistances = sqDiffMat.sum(axis=1) #再求平方和
distances = sqDistances ** 0.5 #开根号,欧式距离
sortedDistIndicies = distances.argsort() #距离从小到大排序的索引
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #用索引得到相应的类别
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
return max(classCount, key=lambda k: classCount[k]) # 返回频数最大的类别 if __name__ =='__main__':
datingClassTest()

手写数字图象识别

数据:转成txt格式的32*32图象

 from numpy import *
from os import listdir def loadData(dirname):
listData =listdir(dirname)
#把32*32文本文件读为1*1024
def file2arr(filename):
with open(filename) as f:
vec =f.read()
return list(vec.replace('\n',''))
sizeData =len(listData) #文件的数量
cLabel=zeros(sizeData,dtype='int16') #文件类别
arrTrain =zeros((sizeData,1024),dtype='int16') #训练样本数组
for i,j in enumerate(listData):
cLabel[i] =int(j[0]) #每个文件对应的类别
arrTrain[i,:] =file2arr(dirname + '\\' +j)
return cLabel,arrTrain if __name__ =='__main__':
from knn import classify0
fTrain = r'..\data\Ch02\digits\trainingDigits'
fTest = r'..\data\Ch02\digits\testDigits'
cLabel,arrTrain =loadData(fTrain)
cLabelTest,arrTest =loadData(fTest)
err=0
for j,i in enumerate(arrTest):
label =classify0(i,arrTrain,cLabel,3)
if cLabelTest[j] !=label:err+=1
print('错误率:',err/len(cLabelTest)) #sklearn库knn对比
from sklearn.neighbors import KNeighborsClassifier as knn
model =knn(n_neighbors=3,n_jobs=4,algorithm='auto')
model.fit(arrTrain,cLabel)
cLabelPredict =model.predict(arrTest)
print('错误率',sum(cLabelPredict!=cLabelTest)/len(cLabelTest))

手写数字识别

代码+数据集放在https://github.com/vvlj/ml

直观理解https://cuijiahua.com/blog/2017/11/ml_1_knn.html

  

《机器学习实战》之一:knn(python代码)的更多相关文章

  1. 机器学习实战 logistic回归 python代码

    # -*- coding: utf-8 -*- """ Created on Sun Aug 06 15:57:18 2017 @author: mdz "&q ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. shell脚本-1

    http://www.runoob.com/w3cnote/shell-scripting.html filename = "/home/........."错误!不能有空格 -- ...

  2. SqlSugar ORM 的学习

    http://www.codeisbug.com/Doc/8/1163 https://www.cnblogs.com/sunkaixuan/p/6082664.html

  3. 认识Ajax

    1.简介 AJAX 相当于异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网 ...

  4. hdu 4506 快速幂

    小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班里唯一的女生又拿一道数学题来请教小明,小明当然很高兴 ...

  5. 简单尝试利用维控LeviStudioU的一栈缓冲区溢出漏洞

    这是别人给我发的,让我分析一下,看能否写出exp.只怪自己水平不够,最后没能写出exp,以下为自己的分析思路 环境为win10 pro x64 英文版(10.0.16299) 默认安全配置 一.漏洞分 ...

  6. 3.GUI Skin和自定义风格的组件 --《UNITY 3D 游戏开发》笔记

    自定义皮肤还是很受女孩子欢迎的吧,这样操作一下界面是不是就可以变得美美哒了~ 先pick一下测试代码: public class GUISkinScript : MonoBehaviour { //自 ...

  7. js入门 关于js属性及其数据类型(详解)

    1. js的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ECMAScript制定了js的数据类型. 数据类型有哪些? 1. 字符串   String 2. 数字 ...

  8. java 大数运算[转]

    用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...

  9. 关于 lua table表存储函数且运用

    --table 是lua的一种数据结构用来帮助我们创建不同的数据类型.如:数组和字典--lua table 使用关联型数组,你可以用任意类型的值来做数组的索引,但这个值不能是nil--lua tabl ...

  10. log4j根据包名 日志输出到不同文件中 , service层无法输出日志问题

    1. service 层因为要配置事务,使用了代理 <aop:config proxy-target-calss=''true"> <aop:pointcut id=&qu ...