机器学习实战K-近邻算法
今天开始学习机器学习,第一章是K-近邻算法,有不对的地方请指正
大概总结一下近邻算法写分类器步骤:
1. 计算测试数据与已知数据的特征值的距离,离得越近越相似
2. 取距离最近的K个已知数据的所属分类
3. 最后统计K个值的分类分别出现的概率,返回最多的一个属性,即为测试数据的所属分类
4. 至于怎么把文本转换成numpy的类型,需要学习numpy模块的相关知识,附上
numpy学习连接 http://old.sebug.net/paper/books/scipydoc/numpy_intro.html
#-*- coding:utf-8 *-*-
from numpy import *
import operator #计算模块
import matplotlib
import matplotlib.pyplot as plt
import time
import random
from mpl_toolkits.mplot3d import Axes3D
from os import listdir
import time
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
#A,B分类
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX,(dataSetSize,1)) - dataSet #tile函数把inx复制datasetsize行1列
sqDiffMat = diffMat**2
#print "sqDiffMat : ",sqDiffMat
sqDistance = sqDiffMat.sum(axis = 1)
distance = sqDistance**0.5
#print "distance : ",distance
sortedDistIndicies = distance.argsort() #返回从小到大的元素的下标,比如[1 3 2 4].argsort()返回[0 2 1 3]
#print "****",sortedDistIndicies
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #统计各个现有值所属的特征向量
#print sortedDistIndicies[i],voteIlabel
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 #统计各个特征向量出现的次数
sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)
#operator.itemgetter()从小到大排序
#print "sortedClassCount : ",sortedClassCount
return sortedClassCount[0][0]
group,labels = createDataSet()
#print classify0([0,0], group, labels, 3)
# # a = [('b',2),('a',1),('c',0)]
# a=[('b',2),('a',2),('a',1),('c',0)]
# b = sorted(a,key = operator.itemgetter(0)) #优先根据第一个元素排序
# print b
# b = sorted(a,key = operator.itemgetter(1)) #优先根据第二个元素排序
# print b
# b = sorted(a,key = operator.itemgetter(1,0)) #优先根据第二个元素排序,当第二个元素相等的情况下根据第一个元素排序
# print b
#解析数据
def file2matrix(filename):
with open(filename) as f:
lines = f.readlines()
matrixNumber = len(lines)
print 'the all lines is :',matrixNumber
#matrix = zeros((matrixNumber,3),dtype = 'int') #生成空的n行3列的矩阵
matrix = zeros((matrixNumber,2))
vector = []
index = 0 #矩阵索引
for line in lines:
line = line.strip()
data = line.split("\t")
matrix[index:] = data[0:2] #把提取出来的复制到矩阵里面
vector.append(int((data[-1]))) #最后一个特征值作为特征向量
index+=1
return matrix,vector
#生成文本数据
def createdata(filename):
with open(filename,'w') as f:
for i in range(1000):
r1 = int(random.random()*1000)
r2 = 0
if(0<=r1<=200):
r2 = 1
if(200<r1<=400):
r2 = 2
if(400<r1<=600):
r2 = 3
if(600<r1<=800):
r2 = 4
if(800<r1<=1000):
r2 = 5
r1 = str(r1)
r2 = str(r2)
#r2 = str(int(random.random()*10))
r3 = str(int(random.random()*10))
f.writelines(r3+'\t'+r1+'\t'+r2+'\n')
#createdata(r'D:\test_packages\knntest.txt')
'''
datat,labels = file2matrix(r'D:\test_packages\knntest.txt')
print datat
# print datat[:,1] #纵向的第二列
# print datat[:][1] #横向的第二列
print labels
fig = plt.figure() #生成容器
plt.title('favorite table data')
ax = fig.add_subplot(1,1,1,projection='3d') #3D模型
ax.scatter(datat[:,0],datat[:,1],datat[:,2],array(labels),array(labels),array(labels)) #使用datat的第二列和第三列作为X轴和Y轴的值
ax.legend()
plt.show()
fig = plt.figure()
ax = fig.add_subplot(1,1,1) #把容器划分为1行1列,图像画在第一格,背景颜色为axisbg = ‘’
ax.scatter(datat[:,1],datat[:,2],array(labels),array(labels)) #使用datat的第二列和第三列作为X轴和Y轴的值
#ax.grid(True) #是否显示网格
# plt.show()
plt.show()
'''
#归一化,(old-min)/(max-min)
def autoNormal(dataSet):
maxVals = dataSet.max(0) #纵向找到每一个样本的最大特征值
minVals = dataSet.min(0)
ranges = maxVals - minVals #计算差值
normalValue = zeros(shape(dataSet))
m = dataSet.shape[0]
normalValue = dataSet - tile(minVals,(m,1)) #计算(old-min)
normalValue = normalValue/tile(ranges,(m,1))
return normalValue,ranges,minVals
#归一化特征值之后
datat,labels = file2matrix(r'D:\test_packages\knntest.txt')
normalValue,ranges,minVals = autoNormal(datat)
print normalValue
fig = plt.figure()
ax = fig.add_subplot(1,1,1) #把容器划分为1行1列,图像画在第一格,背景颜色为axisbg = ‘’
ax.scatter(normalValue[:,0],normalValue[:,1],array(labels),array(labels)) #使用datat的第二列和第三列作为X轴和Y轴的值
#ax.grid(True) #是否显示网格
# plt.show()
plt.show()
#约会网站测试函数
def datinggTest():
datat,labels = file2matrix(r'D:\test_packages\knntest.txt')
normal,ranges,minvals = autoNormal(datat)
testData = 0.5 #10%用来测试,90%用来训练
testNumber = normal.shape[0] #总行数
numberTestValues = int(testNumber*testData) #测试行数
error = 0.0
for i in range(numberTestValues):
labelValue = classify0(normal[i,:], normal[numberTestValues:testNumber,:], labels[numberTestValues:testNumber], 3)
if (labelValue != labels[i]):
error+=1.0
print "this time is error the error is %s, the right is %s"%(labelValue,labels[i])
else:
print "all right ,the number is %s, the right is %s"%(labelValue,labels[i])
error_result = ((error/float(numberTestValues)))
print "your error_result is %s"%(error_result)
print 'error is :',error
datinggTest()
#把二进制文件转化为np.array
def img2Vector(filename):
with open(filename) as f:
vector = zeros((1,1024))
for i in range(32):
line = f.readline()
for j in range(32):
vector[0,32*i+j] = line[j]
return vector
vector = img2Vector(r'D:\test_packages\trainingDigits\0_0.txt')
print vector[0,11:17]
#手写数字识别系统测试代码
def handwritingClassTest():
startTime = time.ctime()
handLabels = []
trainFile = listdir(r'D:\test_packages\trainingDigits')
m = len(trainFile)
trainMat = zeros((m,1024))
for i in range(m):
fileName = trainFile[i]
file = fileName.split('.')[0]
classNumber = file.split('_')[0]
handLabels.append(classNumber)
trainMat[i,:] = img2Vector(r'D:\test_packages\trainingDigits\%s'%fileName)
testFiles = listdir(r'D:\test_packages\testDigits')
nTest = len(testFiles)
error = 0.0
for i in range(nTest):
fileName = testFiles[i]
file = fileName.split('.')[0]
classNumber = file.split('_')[0]
testMat = img2Vector(r'D:\test_packages\testDigits\%s'%fileName)
testLabels = classify0(testMat, trainMat, handLabels, 3)
if (testLabels != classNumber):
error+=1.0
print 'error , error number is %s, the right number is %s'%(testLabels,classNumber)
else:
print 'right'
error = error/float(nTest)
stopTime = time.ctime()
print 'all right ,the error_result is %s'%(error)
print 'the process start at %s'%(startTime)
print 'the process stop at %s'%(stopTime)
handwritingClassTest()
机器学习实战K-近邻算法的更多相关文章
- 机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习之K近邻算法
K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 【机器学习】K近邻算法——多分类问题
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
随机推荐
- java TreeSet应用
这篇是紧接着上一篇而写的,具体的实现TreeSet中有序的第二中方法 首先新建一个类,此类就是用于集合中存放的对象 然后定义一个类,实现Comparator中的CompareTo()方法 最后一个测试 ...
- 使用nginx实现纯前端跨越
你是否厌倦了老是依赖后台去处理跨域,把握不了主动权 你是否想模仿某个app倒腾一个demo,却困于接口无法跨域 那么很幸运,接下来我将现实不依赖任何后台,随心所欲的想访问哪个域名就访问哪个! 下载ng ...
- 关于时间对象Date()
今天使用XCUI开发过程中发现另一个诡异的问题,就是年月日初始化之后默认时分秒的问题. 问题发生在重构交互日志页面的时候,原来的老页面是这样的: 进入了交互日志页面之后,默认会初始化时间为今天的凌晨到 ...
- SQL 软解析和硬解析详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt329 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个 ...
- POJ 2449 Dijstra + A* K短路
这题一开始的思路应该是直接从源点进行BFS搜索K短路. 但这样的复杂度在点数和K的值增大后将会变得很大. 而A*算法则构造一个h(x),在进行BFS时,每次都抛出最小的h(x)从而使汇点的出队速度加快 ...
- ES6块级作用域
块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...
- 防止fixed元素遮挡其他元素的方法
有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...
- 软工+C(2017第6期) 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- 作业2——英语学习APP的案例分析
英语学习APP的案例分析 很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的 ...
- 201521123087 《Java程序设计》第6周学习总结
1. 本周学习总结 2. 书面作业 clone方法1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? ...