#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近邻算法的更多相关文章

  1. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  2. 《机器学习实战》-k近邻算法

    目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python ...

  3. 机器学习实战笔记-2-kNN近邻算法

    # k-近邻算法(kNN) 本质是(提取样本集中特征最相似数据(最近邻)的k个分类标签). K-近邻算法的优缺点 例 优点:精度高,对异常值不敏感,无数据输入假定: 缺点:计算复杂度高,空间复杂度高: ...

  4. 《机器学习实战》——K近邻算法

    三要素:距离度量.k值选择.分类决策 原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最 ...

  5. 机器学习实战笔记-k-近邻算法

    机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...

  6. 机器学习实战python3 K近邻(KNN)算法实现

    台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...

  7. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  8. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  9. R语言学习笔记—K近邻算法

    K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...

随机推荐

  1. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  2. YYModel 源码解读(二)之YYClassInfo.h (1)

    NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END 为了兼容Swift 中的 ? 和 ! oc 在6.3引入了两个新的类型注释:__nullable和__non ...

  3. Oracle迁移:Linux->Windows

    源环境:RHEL6.4 + Oracle 11.2.0.4 目的环境:Windows 2003 需求:研发测试环境的Oracle数据库从Linux迁移到Windows,可以停机. 1.Windows安 ...

  4. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  5. 没有神话,聊聊decimal的“障眼法”

    0x00 前言 在上一篇文章<妥协与取舍,解构C#中的小数运算>的留言区域有很多朋友都不约而同的说道了C#中的decimal类型.事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是 ...

  6. 怎样把win7系统下的屏幕设置成护眼的非常柔和的豆沙绿色?

    经常面对电脑会导致眼睛过度疲劳,白色对眼睛的刺激是最大的,所以,最好不要用白色做电脑背景色 设置方法如下: 在桌面点右键选"个性化",接着点主窗口底部的"窗口颜色&quo ...

  7. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  8. 第四篇 Entity Framework Plus 之 Batch Operations

    用 Entity Framework  进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...

  9. The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory

    The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory 这是由于项目里面的一些 ...

  10. 【JS基础】DOM操作

    appendChild() //向节点添加最后一个子节点 createElement() //创建元素节点 createTextNode() //创建文本节点,字符串值