机器学习实战笔记--k近邻算法
#encoding:utf-8
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt from os import listdir def makePhoto(returnMat,classLabelVector): #创建散点图
fig = plt.figure()
ax = fig.add_subplot(111) #例如参数为349时,参数349的意思是:将画布分割成3行4列,图像画在从左到右从上到下的第9块
ax.scatter(returnMat[:,1],returnMat[:,2],15.0*array(classLabelVector),15.0*array(classLabelVector)) #前两个函数参数的意义是横坐标和纵坐标
plt.show() def classify0(inX, dataSet, labels, k): #k近邻算法 inX为分类向量 dataSet为训练数据集 labels为标签列表 k:选择距离最小的k个点
dataSetSize = dataSet.shape[0] #获得dataSet的第一维长度
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #将向量inX重复1次,共dataSetSize行。然后减去dataSet
sqDiffMat = diffMat ** 2 #diffMat矩阵的每个元素平方
sqDistances = sqDiffMat.sum(axis=1) #按行求和,即求每一行的和,得到一个list
distances = sqDistances ** 0.5 #对sqDistances的每个元素开方
sortedDistIndicies = distances.argsort() #返回distances从小到大的索引
#例如,x=np.array([3.2.1]) np.argsort(x) 得到的结果为array([1.2.0])
classCount = {} #python花括号代表代表dict字典数据类型,[]代表list,()代表元组,(55,)一个值的元组
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #依次取出最小的元素
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #如果存在加1,不存在默认为0
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #第一个参数为比较的list,第二个参数为比较的对象(这里指的是键值对的value),第三个参数是升序或降序(默认为false(升序排列))
return sortedClassCount[0][0] #取得次数最多的key 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 def file2matrix(filename): #解析文本
fr = open(filename)
numberOfLines = len(fr.readlines()) #得到文本的行数
returnMat = zeros((numberOfLines, 3)) #构造一个行数为文本行数,列数为3的0矩阵
classLabelVector = [] #标签列表
fr = open(filename)
index = 0
for line in fr.readlines(): #读取文件的每一行
line = line.strip() #删除符号,此处参数为空,表示删除空白符
listFromLine = line.split('\t') #以\t符号为分隔符
returnMat[index, :] = listFromLine[0:3] #将listFromLine的0到3赋值给returnMat的index行
classLabelVector.append(int(listFromLine[-1])) #将listFromLine的最后一个元素添加到classLabelVector
index += 1 #下标加1
return returnMat, classLabelVector def autoNorm(dataSet): #归一化特征值
minVals = dataSet.min(0) #取每列的最小值赋值给minVals,是一个list
maxVals = dataSet.max(0) #取每列的最大值赋值给maxVals
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m, 1)) #取到与最小值的差
normDataSet = normDataSet / tile(ranges, (m, 1)) #除以范围
return normDataSet, ranges, minVals def datingClassTest():
hoRatio = 0.50 # 测试用例占用比例
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') # 读取数据
normMat, ranges, minVals = autoNorm(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) #第numTestVecs到m是样本数据,前m个是测试数据
print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) #打印预测值和标签值
if (classifierResult != datingLabels[i]): errorCount += 1.0
print "the total error rate is: %f" % (errorCount / float(numTestVecs))
print errorCount #输入某人的信息,便得出对对方喜欢程度的预测值
def classifyPerson():
resultList = ['一点也不喜欢', '有点喜欢', '非常喜欢']
percentTats = float(raw_input("玩视频游戏所耗时间百分比是:"))#输入
ffMiles = float(raw_input("飞行里程数是:"))
iceCream = float(raw_input("每周消费的冰淇淋公升数是:"))
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') #读入样本文件,其实不算是样本,是一个标准文件
normMat, ranges, minVals = autoNorm(datingDataMat)#归一化
inArr = array([ffMiles, percentTats, iceCream])#组成测试向量
classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels,3)#进行分类
print '你对这种人的看法可能是:', resultList[classifierResult - 1]#打印结果 def img2vector(filename): #将图片转化成向量
returnVect = zeros((1, 1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect def handwritingClassTest():
hwLabels = []
trainingFileList = listdir('trainingDigits') # 加载文件夹trainingDigits目录下文件列表
m = len(trainingFileList)
trainingMat = zeros((m, 1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0]) #得到标签
hwLabels.append(classNumStr) #加入标签列表
trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr) #解析文件得到向量
testFileList = listdir('testDigits') # 测试数据
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
print "分类器返回的结果: %d, 真实结果: %d" % (classifierResult, classNumStr)
if (classifierResult != classNumStr): errorCount += 1.0 #计算得到结果与标签比较
print "\n错误总数为: %d" % errorCount
print "\n错误率为: %f" % (errorCount / float(mTest)) if __name__ == '__main__':
# print("main")
# returnMat, classLabelVector = file2matrix('datingTestSet2.txt')
# #makePhoto(returnMat,classLabelVector)
# normDataSet, ranges, minVals = autoNorm(returnMat)
# print(normDataSet)
# print(ranges)
# print(minVals)
#classifyPerson()
# textVector = img2vector("testDigits/0_13.txt")
# print textVector[0,0:31]
handwritingClassTest()
机器学习实战笔记--k近邻算法的更多相关文章
- 02机器学习实战之K近邻算法
第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...
- 《机器学习实战》-k近邻算法
目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python ...
- 机器学习实战笔记-2-kNN近邻算法
# k-近邻算法(kNN) 本质是(提取样本集中特征最相似数据(最近邻)的k个分类标签). K-近邻算法的优缺点 例 优点:精度高,对异常值不敏感,无数据输入假定: 缺点:计算复杂度高,空间复杂度高: ...
- 《机器学习实战》——K近邻算法
三要素:距离度量.k值选择.分类决策 原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最 ...
- 机器学习实战笔记-k-近邻算法
机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...
- 机器学习实战python3 K近邻(KNN)算法实现
台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习随笔01 - k近邻算法
算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...
- R语言学习笔记—K近邻算法
K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...
随机推荐
- TokuDB存储引擎
TokuDB是Tokutek公司开发的基于ft-index(Fractal Tree Index)键值对的存储引擎. 它使用索引加快查询速度,具有高扩展性,并支持hot scheme modifica ...
- 【原创】记一次Project插件开发
一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
- winform程序一启动抛出异常--调用目标发生异常
在本机测试没有问题,可一到别的电脑上就抛出异常,这是最麻烦的事,一时间还找不出什么原因,本机上还无法重现. 现在好了,终于找到一个完美解决的办法,在Program.cs类中加入如下代码 static ...
- fastjson-alibaba
fastjson使用 package com.alibaba.json.demo; import org.junit.Assert; import com.alibaba.fastjson.JSON; ...
- 02 button的练习
private void button1_Click(object sender, EventArgs e) { MessageBox.Show("我也喜欢你!"); //if ( ...
- enote笔记法使用范例(1)——自己总结的一些编写代码的常识 (a)
章节. 编程习惯 why 函数(<<为了>>便于提升软件开发效率和维护效率) 开发角度: 1)隐藏实现细节,这也是API质量最重要的品质2)复用:通过使用函数来代码复用 ...
- Java基础知识笔记(五:多线程的同步问题)
编写多线程程序往往是为了提高资源的利用率,或者提高程序的运行效率,或者更好地监控程序的运行过程等.多线程同步处理的目的是为了让多个线程协调地并发工作.对多线程进行同步处理可以通过同步方法和同步语句块实 ...
- axis2生成客户端代码
通过aix2生成客户端代码需要准备相应的包,然后执行命令,步骤如下: 一.所需包准备 下载axis2-1.6.2-bin.zip,解压从lib包中取出 jaxrpc.jar wsdl4j-1.6.2. ...
- iOS 升级HTTPS通过ATS你所要知道的
由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...