机器学习实战笔记--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算法适 ...
随机推荐
- C#设计模式:单件(例)模式 -- 类也玩计划生育
这里写的代码,相当于<Head First 设计模式>的读书笔记,原书是java的,自己在学习的过程中将其翻译为C#: (一)剖析经典的单件模式实现 单件模式 -- 确保一个类只有一个实例 ...
- nginx源码分析之hash的实现
nginx实现了自己的hash数据结构,正如数据结构中讲述的那样,nginx用开放链表法解决冲突,不过不同的是一旦一个hash表被初始化后就不会被修改,即插入和删除,只进行查询操作,所以nginx通过 ...
- 一行代码引入 ViewPager 无限循环 + 页码显示
(出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...
- <精通JavaScript>---阅读笔记01
下面是阅读精通JavaScript书做的相关笔记. JS中的函数重载 函数重载必须依赖两件事情:判断传入参数数量的能力和判断传入参数类型的能力,在js中每个函数都带有一个仅在这个函数范围内作用的变量, ...
- SSH中Action的单例与多例
Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...
- Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
转自ti-wiki 这份wiki,我曾经就收藏过,但是没有加以重视,以至于绕了一大圈的ccs开发环境的配置,现在正式收藏于自己的博客中...总结良多啊 Connecting to DSP on C6 ...
- php注释规范
注释在写代码的过程中非常重要,好的注释能让你的代码读起来更轻松,在写代码的时候一定要注意注释的规范.(李昌辉) php里面常见的几种注释方式: 1.文件头的注释,介绍文件名,功能以及作者版本号等信息 ...
- Spring 4 + Quartz 2.2.1 Scheduler Integration Example
In this post we will see how to schedule Jobs using Quartz Scheduler with Spring. Spring provides co ...
- 交易系统使用storm,在消息高可靠情况下,如何避免消息重复
概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理.这个时候仅仅开启storm的ack机制并不能解决上述问题.那么该如何设计出一个好的方案 ...
- CSS3写折纸
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...