数据
标称型和数值型
算法
归一化处理:防止数值较大的特征对距离产生较大影响
计算欧式距离:测试样本与训练集
排序:选取前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 ...