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

hykd hykd     2022-08-20     490

关键词:

  1 #encoding:utf-8
  2 from numpy import *
  3 import operator
  4 import matplotlib
  5 import matplotlib.pyplot as plt
  6 
  7 from os import listdir
  8 
  9 def makePhoto(returnMat,classLabelVector):     #创建散点图
 10     fig = plt.figure()
 11     ax = fig.add_subplot(111)         #例如参数为349时,参数349的意思是:将画布分割成3行4列,图像画在从左到右从上到下的第9块
 12     ax.scatter(returnMat[:,1],returnMat[:,2],15.0*array(classLabelVector),15.0*array(classLabelVector))    #前两个函数参数的意义是横坐标和纵坐标
 13     plt.show()
 14 
 15 def classify0(inX, dataSet, labels, k):    #k近邻算法  inX为分类向量   dataSet为训练数据集   labels为标签列表   k:选择距离最小的k个点
 16     dataSetSize = dataSet.shape[0]         #获得dataSet的第一维长度
 17     diffMat = tile(inX, (dataSetSize, 1)) - dataSet    #将向量inX重复1次,共dataSetSize行。然后减去dataSet
 18     sqDiffMat = diffMat ** 2           #diffMat矩阵的每个元素平方
 19     sqDistances = sqDiffMat.sum(axis=1)   #按行求和,即求每一行的和,得到一个list
 20     distances = sqDistances ** 0.5     #对sqDistances的每个元素开方
 21     sortedDistIndicies = distances.argsort()   #返回distances从小到大的索引
 22                                                #例如,x=np.array([3.2.1])  np.argsort(x)  得到的结果为array([1.2.0])
 23     classCount = {}         #python花括号代表代表dict字典数据类型,[]代表list,()代表元组,(55,)一个值的元组
 24     for i in range(k):
 25         voteIlabel = labels[sortedDistIndicies[i]]   #依次取出最小的元素
 26         classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1   #如果存在加1,不存在默认为0
 27     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)  #第一个参数为比较的list,第二个参数为比较的对象(这里指的是键值对的value),第三个参数是升序或降序(默认为false(升序排列))
 28     return sortedClassCount[0][0]   #取得次数最多的key
 29 
 30 
 31 def createDataSet():    #创建数据集
 32     group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
 33     labels = [A, A, B, B]
 34     return group, labels
 35 
 36 
 37 def file2matrix(filename):   #解析文本
 38     fr = open(filename)
 39     numberOfLines = len(fr.readlines())  #得到文本的行数
 40     returnMat = zeros((numberOfLines, 3))  #构造一个行数为文本行数,列数为3的0矩阵
 41     classLabelVector = []  #标签列表
 42     fr = open(filename)
 43     index = 0
 44     for line in fr.readlines():  #读取文件的每一行
 45         line = line.strip()      #删除符号,此处参数为空,表示删除空白符
 46         listFromLine = line.split(	)   #以	符号为分隔符
 47         returnMat[index, :] = listFromLine[0:3]   #将listFromLine的0到3赋值给returnMat的index行
 48         classLabelVector.append(int(listFromLine[-1]))   #将listFromLine的最后一个元素添加到classLabelVector
 49         index += 1    #下标加1
 50     return returnMat, classLabelVector
 51 
 52 
 53 def autoNorm(dataSet):          #归一化特征值
 54     minVals = dataSet.min(0)        #取每列的最小值赋值给minVals,是一个list
 55     maxVals = dataSet.max(0)         #取每列的最大值赋值给maxVals
 56     ranges = maxVals - minVals
 57     normDataSet = zeros(shape(dataSet))
 58     m = dataSet.shape[0]
 59     normDataSet = dataSet - tile(minVals, (m, 1))    #取到与最小值的差
 60     normDataSet = normDataSet / tile(ranges, (m, 1))  #除以范围
 61     return normDataSet, ranges, minVals
 62 
 63 
 64 def datingClassTest():
 65     hoRatio = 0.50   # 测试用例占用比例
 66     datingDataMat, datingLabels = file2matrix(datingTestSet2.txt)  # 读取数据
 67     normMat, ranges, minVals = autoNorm(datingDataMat)   #特征值归一化
 68     m = normMat.shape[0]
 69     numTestVecs = int(m * hoRatio)
 70     errorCount = 0.0
 71     for i in range(numTestVecs):
 72         classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)    #第numTestVecs到m是样本数据,前m个是测试数据
 73         print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])   #打印预测值和标签值
 74         if (classifierResult != datingLabels[i]): errorCount += 1.0
 75     print "the total error rate is: %f" % (errorCount / float(numTestVecs))
 76     print errorCount
 77 
 78 #输入某人的信息,便得出对对方喜欢程度的预测值
 79 def classifyPerson():
 80     resultList = [一点也不喜欢, 有点喜欢, 非常喜欢]
 81     percentTats = float(raw_input("玩视频游戏所耗时间百分比是:"))#输入
 82     ffMiles = float(raw_input("飞行里程数是:"))
 83     iceCream = float(raw_input("每周消费的冰淇淋公升数是:"))
 84     datingDataMat, datingLabels = file2matrix(datingTestSet2.txt) #读入样本文件,其实不算是样本,是一个标准文件
 85     normMat, ranges, minVals = autoNorm(datingDataMat)#归一化
 86     inArr = array([ffMiles, percentTats, iceCream])#组成测试向量
 87     classifierResult = classify0((inArr-minVals)/ranges, normMat, datingLabels,3)#进行分类
 88     print 你对这种人的看法可能是:, resultList[classifierResult - 1]#打印结果
 89 
 90 def img2vector(filename):    #将图片转化成向量
 91     returnVect = zeros((1, 1024))
 92     fr = open(filename)
 93     for i in range(32):
 94         lineStr = fr.readline()
 95         for j in range(32):
 96             returnVect[0, 32 * i + j] = int(lineStr[j])
 97     return returnVect
 98 
 99 
100 def handwritingClassTest():
101     hwLabels = []
102     trainingFileList = listdir(trainingDigits)  # 加载文件夹trainingDigits目录下文件列表
103     m = len(trainingFileList)
104     trainingMat = zeros((m, 1024))
105     for i in range(m):
106         fileNameStr = trainingFileList[i]
107         fileStr = fileNameStr.split(.)[0]
108         classNumStr = int(fileStr.split(_)[0])  #得到标签
109         hwLabels.append(classNumStr)    #加入标签列表
110         trainingMat[i, :] = img2vector(trainingDigits/%s % fileNameStr)  #解析文件得到向量
111     testFileList = listdir(testDigits)  # 测试数据
112     errorCount = 0.0
113     mTest = len(testFileList)
114     for i in range(mTest):
115         fileNameStr = testFileList[i]
116         fileStr = fileNameStr.split(.)[0]
117         classNumStr = int(fileStr.split(_)[0])
118         vectorUnderTest = img2vector(testDigits/%s % fileNameStr)
119         classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
120         print "分类器返回的结果: %d, 真实结果: %d" % (classifierResult, classNumStr)
121         if (classifierResult != classNumStr): errorCount += 1.0   #计算得到结果与标签比较
122     print "
错误总数为: %d" % errorCount
123     print "
错误率为: %f" % (errorCount / float(mTest))
124 
125 if __name__ == __main__:
126     # print("main")
127     # returnMat, classLabelVector = file2matrix(‘datingTestSet2.txt‘)
128     # #makePhoto(returnMat,classLabelVector)
129     # normDataSet, ranges, minVals = autoNorm(returnMat)
130     # print(normDataSet)
131     # print(ranges)
132     # print(minVals)
133     #classifyPerson()
134     # textVector = img2vector("testDigits/0_13.txt")
135     # print textVector[0,0:31]
136     handwritingClassTest()

 

《机器学习实战》读书笔记2:k-近邻(knn)算法

声明:文章是读书笔记,所以必然有大部分内容出自《机器学习实战》。外加个人的理解,另外修改了部分代码,并添加了注释1、什么是K-近邻算法?简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类。不恰当... 查看详情

机器学习实战笔记-k近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果案例分析:海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数、玩视频游戏所耗时间百分比、每周消费的冰淇淋公升数。我们需要将新数据的每个新数据的每个特... 查看详情

机器学习实战笔记-k近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类K近邻算法特点:优点:精度高、对异常值不敏感、无数据输入假定。缺点:计算复杂度高、空间复杂度高。适用数据范围:数值型和标称型。K近邻算法原理:存在一个样本... 查看详情

机器学习实战笔记-k近邻算法3(手写识别系统)

1准备数据:将图像转换为测试向量这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个。我们将把一个32*32的二进制图像矩阵转换为1x1024的向量,这样前两节使用的分类器就可以处理数字图像信息了。代码:defi... 查看详情

《机器学习实战》-k近邻算法(代码片段)

目录K-近邻算法k-近邻算法概述解析和导入数据使用Python导入数据实施kNN分类算法测试分类器使用k-近邻算法改进约会网站的配对效果收集数据准备数据:使用Python解析文本文件分析数据:使用Matplotlib画二维散点图准备数据:归... 查看详情

机器学习实战k-近邻算法

...tp://www.cnblogs.com/lighten/p/7593656.html 1.原理  本章介绍机器学习实战的第一个算法——k近邻算法(k NearestNeighbor),也称为kNN。说到机器学习,一般都认为是很复杂,很高深的内容,但实际上其学习门栏并不算高,具备基... 查看详情

机器学习实战☛k-近邻算法(k-nearestneighbor,knn)(代码片段)

机器学习实战☛k-近邻算法(K-NearestNeighbor,KNN)文章目录机器学习实战☛k-近邻算法(K-NearestNeighbor,KNN)k-近邻算法概述原理简介k-近邻算法一般流程伪代码与实现示例:使用kNN改进约会网站的配对效... 查看详情

机器学习实战精读--------k-近邻算法

对机器学习实战的课本和代码进行精读,帮助自己进步。#coding:utf-8from numpy import *import operator #运算符模块from os import listdir  #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字... 查看详情

机器学习实战之第二章k-近邻算法

第2章k-近邻算法KNN概述k-近邻(kNN,k-NearestNeighbor)算法主要是用来进行分类的.KNN场景电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?动作片:打斗次数更多爱情片:亲吻次数更多基于电影中的亲吻、... 查看详情

机器学习实战之k近邻算法

k近邻算法概述简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类。优点:精度高、对异常值不敏感、无数据输入假定。缺点:计算复杂度高、空间复杂度高。适用数据范围:数值型和标称型。它的工作原理是:存在一... 查看详情

机器学习实战k-近邻算法实施knn分类算法

2.预测数据分类时,出现‘dict’objecthasnoattribute‘iteritems‘如: 最常见的解决办法是更改环境变量顺序如 注意:哪个版本在上面,cmd中的python版本即是谁。如又如:  然后预测数据所在分类即可实现:  查看详情

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

看了这本书的第一个算法—k-近邻算法,这个算法总体构造思想是比较简单的,在ACM当中的话就对应了kd树这种结构。首先需要给定训练集,然后给出测试数据,求出训练集中与测试数据最相近的k个数据,根据这k个数据的属... 查看详情

机器学习实战task1(knn)k近邻算法的应用(代码片段)

...算法的简介k-近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。(2)k近邻算法的工作原理给定一个样本的集合,这里称为训... 查看详情

机器学习实战ch02:k-近邻算法

k-近邻算法算是一个非常暴力也非常好理解的算法(抽象来讲,就是和谁长得像就分为哪一类如何划分长得像还是不像的尺度?把特征值当做坐标,把个体当做线性空间中的离散点,取k个离目标最近的训练集点,进行labelvote,少... 查看详情

《机器学习实战》——k近邻算法

原理:(1)输入点A,输入已知分类的数据集data(2)求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点(3)K个点进行投票,票数最多的分类即为所求优点:简单,可用于非线性分类缺点:当样本不均衡时影响投票... 查看详情

机器学习2—k近邻算法学习笔记

    Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外print在Python新版本下是函数,print后面需加上一对括号,否则执行会报错。第二章代码修改如下。fromnumpyimport*imp 查看详情

机器学习实战第2章k-近邻算法(k-nearestneighbor,knn)

第2章k-近邻算法<scripttype="text/javascript"src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>KNN概述k-近邻(kNN,k-NearestNeighbor)算法主要是用来进行分类的.KNN场景电影可以按照题材分类,那么如何区分&nbs 查看详情

机器学习实战---k-近邻(代码片段)

一:简单实现K-近邻算法(一)导入数据importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspddefCreateDataSet():data=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels=np.array([‘A‘,‘A‘,‘B‘,‘B‘])returndata,labelsda 查看详情