1.k-近邻算法

# k近邻算法:classify0(用于分类的输入向量inX,输入的训练样本dataset,标签向量labels,选择最近邻居的数目k)
# first step:计算待分类向量和所有样本点的距离;
# second step:对该距离数据从小到大排序,确定前k个距离最小示例的标签;
# third step:返回发生频率最高的元素标签.
def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]  # dataSetSize = 训练样本行数diffMat = tile(inX, (dataSetSize,1)) - dataSet  # 将输入inX扩展成训练样本行数*3(和训练样本大小一样)sqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1) # axis = 1,对每一行求和(对列操作)distances = sqDistances**0.5sortedDistIndicies = distances.argsort()    # 对序列排序,并返回对应原序列索引classCout = {}  # 统计标签个数for i in range (k):voteIlabel = labels[sortedDistIndicies[i]]  # 索引为i的示例的标签classCout[voteIlabel] = classCout.get(voteIlabel,0) + 1 # 该标签个数+1sortedClaassCout = sorted(classCout.items(),    # 按照第2个域(即标签类别)降序排列key=operator.itemgetter(1), reverse=True)return sortedClaassCout[0][0]

Python语法

np.argsort()

np.argsort(x, axis)

对x进行升序排列,将排序后的序列对应原序列索引赋给x。axis=0,按列排序;axis=1,按行排序。

# 一维数组
>>> x = array([0.3, 0.5, 0.8, 0.4])
>>> y = x
>>> np.argsort(x)
array([0, 3, 1, 2], dtype=int64)
>>> np.argsort(-y)
array([2, 1, 3, 0], dtype=int64)
# 二维数组
>>> x = [[0, 3], [1, 2]]
>>> y = x
>>> np.argsort(x, axis = 0)   # 升序/按列排列
array([[0, 1],[1, 0]], dtype=int64)
>>> np.argsort(y, axis = 1)   # 升序/按行排列
array([[0, 1],[0, 1]], dtype=int64)

dict.get()

dict.get(key, default=None)

返回字典中指定key对应的值,如果值不在字典中则返回default。

>>> dict = {'Name': 'Zara', 'Age': 27}
>>> print ("Value : %s" %  dict.get('Age'))
Value : 27
>>> print ("Value : %s" %  dict.get('Sex', "Never"))
Value : Never

dict.items()

dict.items()

以列表返回可遍历的(键, 值) 对/字典。

>>> dict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}
>>> print "字典值 : %s" %  dict.items()
字典值 : [('Google', 'www.google.com'), ('taobao', 'www.taobao.com'), ('Runoob', 'www.runoob.com')]>>> for key,values in  dict.items():print (key,values)
Google www.google.com
taobao www.taobao.com
Runoob www.runoob.com

sorted()

sorted(iterable, key=None, reverse=False)

对可迭代对象iterable进行排序操作。key可以指定迭代对象中的某个元素进行排序。reverse=False,升序(默认);reverse=True,降序。

sorted()和sort()区别

# 1.sort()对已有list进行排序,会改变list的值,sorted()则返回一个新的list
>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> a=[5,2,3,1,4]
>>> a.sort()
>>> a
[1,2,3,4,5]# 2.sort()只能用于list,sorted()适用于所有可迭代对象
>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]

利用key进行特殊排序

# 1.利用key进行倒序排序
>>> example_list = [5, 0, 6, 1, 2, 7, 3, 4]
>>> result_list = sorted(example_list, key=lambda x: x*-1)   # x的相反数
>>> print(result_list)
[7, 6, 5, 4, 3, 2, 1, 0]# 2.利用key选择排序的域/维度
>>> import operator
>>> dict = {'Lena':18, 'John':20, 'Mark':15, 'Jackson':23}
>>> sorted(dict, key=operator.itemgetter(1),reverse=True)    # 按第二个域,即数字进行降序排列
[('Jackson', 23), ('John', 20), ('Lena', 18), ('Mark', 15)]

2.准备数据:从文本文件中解析数据

# 将文本记录转换为分类器可以接受的格式
# first step:获取文本记录行数
# second step:创建一个二维数组(行数*3)
# third step:将文本每一行末尾末尾元素换成\t
# PS:注释行,源程序直接用int转换标签,出现错误,这里用一个字典进行转换
def file2matrix(filename):fr = open(filename)arrayOLines = fr.readlines()numberOfLines = len(arrayOLines)returnMat = zeros((numberOfLines,3))classLabelVector = []index = 0labels = {'didntLike':1,'smallDoses':2,'largeDoses':3}  # 新增 这行代码可以放到for的开始,不需要每次都重新赋值for line in arrayOLines:line = line.strip() # 移除line末尾元素listFromLine = line.split('\t') returnMat[index,:] = listFromLine[0:3]# classLabelVector.append(int(listFromLine[-1])) #classLabelVector储存的应为intclassLabelVector.append(labels[listFromLine[-1]])  # 去掉了intindex +=1return returnMat,classLabelVector

Python语法

file.readlines()

file.readline(size)  # 不指定size,则默认读取首行;指定size,则读取指定size字节(包括\n字符)
file.readlines()    # 读取file所有行,以list形式返回

str.strip()

str.strip([chars])

移除字符串str开头和结尾的字符或字符串chars(默认为空格),无法删除字符串中间的字符。

>>> str = "*****this is **string** example....wow!!!*****"
>>> print (str.strip( '*' ))  # 指定字符串 *
this is **string** example....wow!!!>>> str = "123abcrunoob321"
>>> print (str.strip( '12' ))  # 字符序列为 12
3abcrunoob3

str.split()

str.split(char="", num=string.count(str))

用指定分隔符char对字符串进行切片,分割为num+1的子字符串,num默认为-1,即切割所有。

>>> str = "this is string example....wow!!!"
>>> print (str.split( ))       # 以空格为分隔符
['this', 'is', 'string', 'example....wow!!!']
>>> print (str.split('i',1))   # 以 i 为分隔符
['th', 's is string example....wow!!!']
>>> print (str.split('w'))     # 以 w 为分隔符
['this is string example....', 'o', '!!!']

list.append()

list.append(obj)

在list末尾添加新的对象。该方法无返回值,会直接改变list的值。

list.append()和list.extend()区别

>>> mylist = [10,20,30]
>>> mylist.extend([40,50,60])
>>> mylist
[10, 20, 30, 40, 50, 60]
>>> mylist.append([70,80,90])
>>> mylist
[10, 20, 30, 40, 50, 60, [70, 80, 90]]

append()向list尾部添加一个元素,而extend()只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。该例也说明一个list可包含不同类型。

3.准备数据:归一化数值

# 归一化数值:消除由于某一项数值过大带来的误差影响
# 将取值范围处理为0——1区间内的值
# newvalue = (oldvalue-min)/(max-min)
def autoNorm(dataSet):minVals = dataSet.min(0)    # 找出每列最小值,minVal为1*3矩阵maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet)) # normDataSet和dataSet为1000*3矩阵m = dataSet.shape[0]    # m=1000,即dataSet的行数normDataSet = dataSet - tile(minVals, (m,1))    #用tile,将minVal行数重复m次normDataSet = normDataSet/tile(ranges, (m,1))   #每个元素相除,不是矩阵除法return normDataSet, ranges, minVals

Python语法

np.tile()

tile(A, reps)

A和reps均为数组,将数组A重复reps次

>>> from numpy import *
>>> A = [1,2]
>>> tile(A,(3,2))  #将A的行重复3次,列重复两次
array([[1, 2, 1, 2],[1, 2, 1, 2],[1, 2, 1, 2]])

4.测试算法:针对约会网站的测试

# 分类器针对约会网站的测试代码
# first step:读取训练样本(file2matrix函数)并归一化(autoNorm函数)
# sencond step:计算测试数据的数量,即计算哪些是测试样本(0.1),哪些是训练样本(0.9)
# third step:将测试样本和训练样本输入到classify0函数
# forth step:计算错误率(错误样本数/总样本数)并输出
def datingClassTest():hoRatio = 0.1datingDataMat, datingLabels = file2matrix('datingTestSet.txt')normMat, ranges, minVals = autoNorm(datingDataMat)    # 调用定义的归一化函数m = normMat.shape[0]    # m = 1000(样本总行数)numTestVecs = int(m*hoRatio)    # 测试集数量占总量的0.1errorCount = 0.0for i in range(numTestVecs):classifierResult = classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m],3) #调用定义的kNN分类函数print ("the classifier came back with: %d, the real answer is: %d" %(classifierResult, datingLabels[i])) # %d:整数;%s:字符串if(classifierResult != datingLabels[i]):errorCount += 1.0print ("the total error rate is: %f" %(errorCount/float(numTestVecs)))  # %f:错误率为浮点数

5.使用算法:约会网站预测

# 约会网站预测函数(和测试代码kNN.datingClassTest()基本相同)
# first step:获取测试用户数据(1*3)
# second step:读取训练样本(file2matrix函数)并归一化(autoNorm函数)
# third step:将测试用户数据归一化,并将其和训练样本数据输入到classify0函数
def classifyPerson():resultList = ['not at all', 'in small doses', 'in large doses']percentTats = float(input("percentage of time spent playing video games?")) # 输入用户数据(py3.*用input, py2.*用raw_input)ffMiles = float(input("frequent flier miles earned per year?"))iceCream = float(input("liters of ice cream consumed per year?"))inArr = array([ffMiles, percentTats, iceCream])datingDataMat, datingLabels = file2matrix('datingTestSet.txt')normMat, ranges, minVals = autoNorm(datingDataMat)classifierResult = classify0((inArr-minVals)/ranges, datingDataMat, datingLabels, 3)print("You will probably like this person: ",resultList[classifierResult - 1])

Python语句

input()

input([prompt])  # prompt为提示信息

在 Python3.x 中 raw_input() 和 input() 进行了整合,去除了 raw_input( ),仅保留了input( )函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

>>>a = input("input:")
input:123                  # 输入整数
>>> type(a)
<class 'str'>              # 字符串
>>> a = input("input:")
input:runoob              # 正确,字符串表达式
>>> type(a)
<class 'str'>             # 字符串

6.示例:手写识别系统

准备数据

# 将手写数字图像转换为向量
def img2vector(filename):returnVect = zeros((1,1024))    # 32*32=1024,构建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]) #这里必须加int,lineStr[j]是字符串            return returnVect

测试算法

# 手写数字识别测试程序
# first step:获取trainingDigits目录中的文件内容,存入trainingFileList
# second step:构建m*1024矩阵,该矩阵每行储存一个图像(32*32)
# third step:从文件名中解析出分类数字,存入hwLabels
# forth step:相同的方法获取测试样本,将其送入classifier分类
def handwritingClassTest():hwLabels = []# trainingFileList = open('traningDigits')trainingFileList = listdir('trainingDigits')m = len(trainingFileList)trainingMat = zeros((m, 1024))for i in range(m):fileNameStr = trainingFileList[i]fileStr = fileNameStr.split('.')[0]     # 相当于剔除后缀,e.g. 0_13.txt,fileStr=0_13classNumStr = int(fileStr.split('_')[0])    # 获取数字类别,e.g. 0_13.txt,fileStr=0_13,classNumStr=0hwLabels.append(classNumStr)trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)# testFileList = open('testDigits')testFileList = listdir('testDigits')errorCount = 0.0mTest = len(testFileList)for i in range(mTest):fileNameStr = testFileList[i]# fileStr = fileNameStr.split('.')[0]     # classNumStr = int(fileStr.split('_')[0])    classNumStr = int(fileNameStr.split('_')[0])    # 可以合并成一步vectorUnderTest = img2vector('testDigits/%s' %fileNameStr)classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)print ("the classifier came back with: %d, the real answer is: %d" %(classifierResult, classNumStr))if(classifierResult != classNumStr):errorCount += 1.0print("\nthe total number of error is: %d" %errorCount)print("\nthe total error rate is: %f" %(errorCount/float(mTest)))

测试结果

>>> import kNN
>>> kNN.handwritingClassTest()
...
...
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9
the classifier came back with: 9, the real answer is: 9the total number of error is: 10the total error rate is: 0.010571

总结

k-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点: 精度高,对异常值不敏感,无数据输入假定。
缺点: 计算复杂度高,空间复杂度高。如在手写数字识别示例中,2000个训练样本,那么算法要为每个测试向量做2000次距离运算,每次距离运算又包括1024维度浮点运算,也就需要为测试向量准备2MB的存储空间。
适用数据范围: 数值型和标称型。数值型数据变量 可在无尽范围内取值,如概率,主要用于回归;标称型数据变量 则在有限范围内取值,如真/假,适用于分类。

《机器学习实战》——kNN相关推荐

  1. 机器学习实战-KNN算法-20

    机器学习实战-KNN算法-鸢尾花分类 # 导入算法包以及数据集 from sklearn import neighbors from sklearn import datasets from skle ...

  2. 机器学习实战——KNN及部分函数注解

    书籍:<机器学习实战>中文版 IDE:PyCharm Edu 4.02 环境:Adaconda3  python3.6 本系列主要是代码学习记录,其中设计的理论知识,不做过多解释.书中代码 ...

  3. 机器学习实战——KNN

    一.简介 参考:https://blog.csdn.net/c406495762/article/details/75172850 环境:win 10, notebook,python 3.6 原bl ...

  4. 机器学习实战——KNN算法预测电影类型

    预测电影类型 现有爱情片和动作片(不是爱情动作片,雾)的打斗场面和接吻场面的次数统计,然后给出一个电影打斗场面和接吻场面出现的次数,预测其类型. 那么如何预测呢?当然用KNN了. KNN算法的原理就是 ...

  5. knn的python代码_《机器学习实战》之一:knn(python代码)

    数据 标称型和数值型 算法 归一化处理:防止数值较大的特征对距离产生较大影响 计算欧式距离:测试样本与训练集 排序:选取前k个距离,统计频数(出现次数)最多的类别 def classify0(inX, ...

  6. 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

    k近邻算法(kNN) 本博客来源于CSDN:http://blog.csdn.net/niuwei22007/article/details/49703719 本博客源代码下载地址:CSDN免费下载. ...

  7. 《机器学习实战》chapter02 K-近邻算法(KNN)

    2.2 示例:使用K-近邻算法改进约会网站的配结果 收集数据:提供文本文件 准备数据:使用Python解析文本文件(文本转numpy矩阵.归一化数据等) 分析数据:使用Matplotlib画二维扩散图 ...

  8. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了     前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...

  9. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

  10. 机器学习实战(一)k-近邻kNN(k-Nearest Neighbor)

    目录 0. 前言 1. k-近邻算法kNN(k-Nearest Neighbor) 2. 实战案例 2.1. 简单案例 2.2. 约会网站案例 2.3. 手写识别案例 学习完机器学习实战的k-近邻算法 ...

最新文章

  1. 青龙依赖环境一键安装部署
  2. [转]我们为什么需要工作流
  3. 显示设备不属于微型计算机的外部设备,微型计算机常用外部设备试题解析
  4. 科研实习 | 北京大学前沿中心王鹤老师具身智能课题组招收科研实习生
  5. 写给大数据开发初学者的话
  6. TemplatePart用法说明
  7. SunPinyin: Linux下最好用的拼音输入法,MacOSX下也是不错的,还免费,可以不用买IMKQIM了...
  8. putty怎么远程控制linux应用,如何使用linux系统远程操作软件putty!
  9. 硬件基础知识----(20)KVM 深入理解
  10. css实现圆球旋像水波波动_手机拍屏幕烦人的“水波纹”小米10靠它给解决掉了...
  11. linq的字段自增长属性设置_云途晨报9月9日前,这5类ebay物品属性必须完成更新;Wish体积重计算方式即将更新...
  12. iocomp iPlot使用说明6 轴属性设置
  13. 通俗易懂的讲解贝叶斯原理(保证简单)
  14. 在网站中使用VideoJs视频播放器播放视频
  15. C++批量创建文件夹
  16. 系统与软件过程改进09年年会,CMMI vs 敏捷PK赛参赛感言
  17. JVM虚拟机与Android虚拟机
  18. 转帖(http://hi.baidu.com/johnehuang/blog/item/e1e96782a4b04e97f703a6dc.html)
  19. mailgun ——10000封每月的邮件推送接口
  20. 堆晶结构_火成堆晶成因的超镁铁质岩

热门文章

  1. TikTok直播带货:掌握4类促销神操作。轻松爆单1000倍销量?
  2. Httpie 工具入门使用
  3. java 对数和指数计算
  4. 安卓Android实现聊天滚动界面
  5. ‘Player‘ AnimationEvent ‘NewEvent‘ has no receiver! Are you missing a component?
  6. 级数收敛、cesaro可和以及Abel可和的关系
  7. MySQL中删除重复数据只保留一条
  8. 12v电量显示制作方法_制作12V电池电压表
  9. 问题,缺陷,任务管理系统 Cynthia
  10. rgb和rgba的区别关系