数据

  标称型和数值型

算法

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

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

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

  

最新文章

  1. 初识HTML
  2. WPF入门教程系列三——Application介绍(续)
  3. Apache Thrift 环境配置
  4. 转:ExpressBars中的停靠控件使用
  5. 存储过程分页 Ado.Net分页 EF分页 满足90%以上
  6. JDBC Connection
  7. 《算法导论》习题解答 Chapter 22.1-5(求平方图)
  8. qualcomm platform camera porting
  9. 2 _RESETFUL介绍
  10. Perfect Squares
  11. (spring-第14回【IoC基础篇】)国际化信息 (转)
  12. QTP10破解方法及mgn-mqt82.exe下载
  13. 【ORM框架】Spring Data JPA(一)-- 入门
  14. 今天捡起来python
  15. 如何为你的 Vue 项目添加配置 Stylelint
  16. ERP采购申请管理(三十九)
  17. JDBC事物的处理
  18. Web Components 规范学习
  19. python 爬爬爬 基本函数~
  20. ZOJ1648 Circuit Board 2017-04-18 20:31 34人阅读 评论(0) 收藏

热门文章

  1. 20164322韩玉婷 -----Exp2 后门原理和实践
  2. 在Django中使用ForeignKey()报错问题的解决
  3. selenium_Python3_邮箱登录:动态元素定位
  4. android开发解决Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'. > java.lang.RuntimeException: java.lang.RuntimeException: c.....
  5. docker nginx letsencrypt
  6. SpringMVC的HandlerMapping(处理器映射器)
  7. SourceInsight宏插件3(非常好用,强力推荐)
  8. KindEditor自动过滤首行缩进和全角空格的解决方法
  9. oracle死锁的处理办法
  10. python基础知识8---条件和循环