knn的python代码_《机器学习实战》之一:knn(python代码)

数据

标称型和数值型

算法

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

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

排序:选取前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))

手写数字识别

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

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

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

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

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

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

机器学习实战 之 KNN算法

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

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

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

机器学习实战之kNN算法

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

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

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

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

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

机器学习实战笔记——KNN

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

随机推荐

线上mysql内存持续增长直至内存溢出被killed分析(已解决)

来新公司前,领导就说了,线上生产环境Mysql库经常会发生日间内存爆掉被killed的情况,结果来到这第一天,第一件事就是要根据线上服务器配置优化配置,同时必须找出现在mysql内存持续增加爆掉的原因 ...

[转]phonegap 2.9 IOS Xcode 搭建环境

phonegap 2.9 IOS Xcode 搭建环境   一:下载phoneGap2.9和安装Xcode5(目前最新版) 选择2.9是因为3.0以上坑爹版本编译神马的要在有网络情况. 二: 下载ph ...

CC2530红外学习球学码函数(P1.2接红外一体接收头,使用定时器tim1的复用功能2)

P1.2GPIO配置: void cap_gpio_init(){ P1SEL |= 0x04; P1DIR &= ~0x04; PERCFG |= 0x40; P2SEL |= 0x20; ...

关于dfs+剪枝第一篇:hdu1010

最近进入了dfs关于剪枝方面的学习,遇到的第一道题就是hdu的1010.一道很基础的剪枝..可我不幸地wa了很多次(待会再解释wa的原因吧QAQ),首先我们来看一下题目. Problem Descri ...

利用 :before :after伪类实现鼠标悬浮动画效果

1.最近在逛网站的时候,想找一下喜欢的鼠标悬浮效果,避免广告的嫌疑,直接放图了: 2.在实现的时候,如果在直接使用鼠标hover ,transform,进行过渡,不能达到想要的效果,因为同时只能触发一 ...

【Win 10 应用开发】MIDI 音乐合成——更改乐器音色

在开始今天的吹 BB 博文之前,说点题外话. 首先,上次老周给大伙伴们介绍完发送 MIDI 音符,本来说好的接着说一下如何更改乐器音色,为啥这么久都没更新呢.特特来解释一下,最近老周接了一个 ASP. ...

bzoj 5290: [Hnoi2018]道路

Description Solution PJDP毁青春 注意到性质:到根的道路不超过 \(40\) 条 所以我们只关系一个点上面的道路的情况就行了 设 \(f[x][i][j]\) 表示一个点 \( ...

spiflash

1.SPI Flash (即SPI Nor Flash)是Nor Flash的一种:2.NOR Flash根据数据传输的位数可以分为并行(Parallel)NOR Flash和串行(SPI)NOR F ...

mongoDB 命令整理

库操作 创建数据库 use [database] 查看数据库 show dbs 删除 db.dropDatabase() 备份 mongodump -h[host] ip -d[databasenam ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值