《机器学习实战》之一: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))
手写数字识别
代码+数据集放在https://github.com/vvlj/ml
直观理解https://cuijiahua.com/blog/2017/11/ml_1_knn.html
《机器学习实战》之一:knn(python代码)的更多相关文章
- 机器学习实战 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
机器学习实战——读书笔记 书籍奉上
随机推荐
- 搭建Jmeter + Grafana + InfluxDB性能测试监控环境
背景 Jmeter原生的实时监控每半分钟收集一次数据,只能在Linux控制台查看日志输出,界面看起来不直观,图表报告只能等压测结束后才能生成.如下图为jmeter在Linux下运行的实时日志: 那么如 ...
- hdu 1372 BFS
A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...
- Linux 下安装nodejs
linux 版本 uname -a Linux -29deepin-generic # SMP Fri Jul :: UTC x86_64 GNU/Linux Nodejs 版本:node-v10.1 ...
- Java(原码、反码、补码和计算机存储格式)
原码:将一个整数,转换成二进制,就是其原码.如单字节的5的原码为:0000 0101:-5的原码为1000 0101. 反码:正数的反码就是其原码:负数的反码是将原码中,除符号位以外,每一位取反.如单 ...
- hsdf -- 6.21 -- day6
差点忘写总结…… 这么快就到day6了啊 感觉前面写的总结都是苟屁,跟没有有什么区别…… 今天认真总结一下 最大的失误就是全程肝a题,最后还挂了…… 感觉今天方向偏了,由进行一次测试到仅仅是想要尽可能 ...
- java8_api_misc
属性文件处理 概念 加载并读取文件内容 修改文件内容 获取系统属性 该文件是一个文本文件,以properties作为其后缀,内容格式为 key1=value ...
- 剑指offer 12.代码的完整性 数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 本人渣渣代码: public double Power(double ba ...
- Spring Boot - AOP(面向切面)-切入点表达式
切入点指示符用来指示切入点表达式目的,在 Spring AOP 中目前只有执行方法这一个连接点,Spring AOP 支持的 AspectJ 切入点指示符,切入点表达式可以使用 &&. ...
- Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器
第一个版本发布内容如下: 开源组件(spring-cloud-alibaba开头): 服务发现(Service Discovery) 配置管理(Configuration Management) 高可 ...
- update20181214 - uGetHttpData.pas
function DecodePJItem(sText: string): TList<TDataItem>; var reg: TRegEx; mc: TMatchCollection; ...