机器学习实战笔记--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算法适 ...
随机推荐
- VS2013:Unit Test 单元测试入门
一.打开VS ,找到工具栏的“工具->扩展和更新”,添加图片内容 二.新建控制台应用程序: CalculatorDemo 三.新建类:Operation.cs,并添加方法 namespace C ...
- SQL Server 统计信息更新时采样百分比对数据预估准确性的影响
为什么要写统计信息 最近看到园子里有人写统计信息,楼主也来凑热闹. 话说经常做数据库的,尤其是做开发的或者优化的,统计信息造成的性能问题应该说是司空见惯. 当然解决办法也并非一成不变,“一招鲜吃遍天” ...
- 连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法
本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况: 连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持 ...
- PHP之封装一些常用的工具类函数
分享一些PHP中常用的工具里函数: <?php /** * Created by PhpStorm. * User: Steven * Date: 2016/8/12 * Time: 14:21 ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格
通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...
- Node学习笔记(二):事件驱动
接触Node,提得最多的可能就是回调,异步非阻塞处理,思前想后,JavaScript从前端语言过渡到服务器端,最大的劣势可能就是线程,当然这方面的不足现在也被慢慢弥补起来了(很多第三方的npm包可供下 ...
- 【MVVM DEV】DataColumn中的TextBox与ComboBox的并存
一.前言 在WPF编程中,有时候我们使用DataGrid会需要在一个DataColumn中既有TextBox,也要有ComboBox或者TextBlock等其他数据显示样式. 这个时候我们 ...
- FastSocket学习笔记~再说客户端与服务端的组成
废话多说 很久之前,我写过几篇FastSocket的文章,基本属于使用的方法,而缺乏对概念的总结讲解,而本讲就是弥补一下上几讲的不足,将核心的模块再说说,再谈谈,再聊聊! 首先FastSocket由C ...
- Xshell显示中文乱码问题
[文件]–>[打开]–>在打开的session中选择连接的那个,点击[属性] -> [终端], 编码选择为:Unicode(UTF-8),然后重新连接服务器即可.也可以在Xshell ...