数据

  标称型和数值型

算法

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

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

  排序:选取前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. 简单kmp算法(poj3461)

    题目简述: 给你两个字符串p和s,求出p在s中出现的次数. 思路简述: 在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了.此题 ...

  2. 关于JS的一些案例,setInterval,动态图片

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  3. AJAX实现登陆

    先添加点击事件 <input type="button" id="submitt" value="立即登录" /> 展示信息 & ...

  4. Vue2.5基础

    1.1 创建第一个Vue实例 官方网站:https://cn.vuejs.org 学习 --> 安装 刚开始学习Vue,使用最简单的安装方式,直接用<script>引入 我们下载开发 ...

  5. Java高级特性 第8节 网络编程技术

    一.网络概述 1.网络的概念和分类 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设 ...

  6. eclipse+gradle

    一.gradle 下载与安装 下载地址:http://services.gradle.org/distributions/ 下载后,放到:D:\gradle-4.6 在系统环境变量path,中加:D: ...

  7. [蓝桥杯]PREV-15.历届试题_格子刷油漆

    题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MOD ...

  8. sed命令的基本使用方法

    sed命令 stream editor,用程序的方式编辑文本.基本上是玩正则模式匹配. 用s命令替换 $ sed "s/my/Hao Chen's/g" pets.txt 单引号去 ...

  9. 多任务fork、multiprocessing、进程池、进程间通信-Queue

    并发:一个处理器同时处理多个任务. 并行:多个处理器或者是多核的处理器同时处理多个不同的任务. fork创建子进程 import os import time #fork出一个子进程,子进程也从这一行 ...

  10. redis4.0.13主从、哨兵、集群3种模式的 Server端搭建、启动、验证

    本文使用的是redis-4.0.13.tar.gz版本. 两个centos7系统虚拟机:192.168.10.140.192.168.10.150 redis各版本下载地址:http://downlo ...