《机器学习实战》——k-近邻算法Python实现问题记录(转载)
py2.7 : 《机器学习实战》 k-近邻算法 11.19 更新完毕
《机器学习实战》第二章k-近邻算法,自己实现时遇到的问题,以及解决方法。做个记录。
1.写一个kNN.py保存了之后,需要重新导入这个kNN模块。报错:no module named kNN.
解决方法:1.将.py文件放到 site_packages 目录下
2.在调用文件中添加sys.path.append("模块文件目录");
import sys
sys.path.append('c:\xxxx\b.py') # 这个例子针对 windows 用户来说的
2.上面的问题解决之后,import kNN。报错:only 2 non-keyword arguments accepted。
问题所在:貌似是粗心少写了两个中括号
本来是array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]),结果少写了最外面的两个中括号-_-||
3.继续写k-近邻算法函数,保存到kNN.py之后,输入命令:kNN.classify0([0,0],group,labels,3)
报错:module' object has no attribute 'classify0'
解决方法:重启Python IDLE即可。
把代码也贴在这里吧,如果保存到电脑里,过一段时间就忘了在哪了。还是放在这里保险点.
kNN.py:
- from numpy import *
- import operator
- 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 classify0(inX,dataSet,labels,k):
- dataSetSize = dataSet.shape[0]
- diffMat = tile(inX,(dataSetSize,1)) - dataSet
- sqDiffMat = diffMat**2
- sqDistances = sqDiffMat.sum(axis = 1)
- distances = sqDistances**0.5
- sortedDistIndicies = distances.argsort()
- classCount = {}
- for i in range(k):
- voteIlabel = labels[sortedDistIndicies[i]]
- classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
- sortedClassCount = sorted(classCount.iteritems(),
- key=operator.itemgetter(1),reverse=True)
- return sortedClassCount[0][0]
然后打开Python Shell:
结果还不错。
机器学习实战k-邻近算法(kNN)简单实施代码解读(转载)
一.概念
k-邻近算法是最简单的机器学习算法之一。
k-邻近算法采用测量不同特征值之间的距离(具体说是欧氏距离)的方法进行分类。
输入待分类的数据后,计算输入特征与样本集数据对应特征的距离,选择样本集中与输入特征距离最小的前k个样本,统计这k个样本数据中出现次数最多的类别作为新数据的分类。
二.kNN的简单实施代码及注释
from numpy import *
import operator
def creatDataSet():
dataSet = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return dataSet,labels
def classify0(inX,dataSet,labels,k):
#求出样本集的行数,也就是labels标签的数目
dataSetSize = dataSet.shape[0]
#构造输入值和样本集的差值矩阵
diffMat = tile(inX,(dataSetSize,1)) - dataSet
#计算欧式距离
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#求距离从小到大排序的序号
sortedDistIndicies = distances.argsort()
#对距离最小的k个点统计对应的样本标签
classCount = {}
for i in range(k):
#取第i+1邻近的样本对应的类别标签
voteIlabel = labels[sortedDistIndicies[i]]
#以标签为key,标签出现的次数为value将统计到的标签及出现次数写进字典
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#对字典按value从大到小排序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回排序后字典中最大value对应的key
return sortedClassCount[0][0]
三.详细解读
这里创建的是一个名为kNN.py的模块。
首先导入了两个模块,一个是科学计算包numpy,另一个是运算符模块,书中有提到。
接着是一个创建数据集的无参函数creatDataSet(),一共4个样本,每个样本有2个特征和1个分类标签。特征集以4*2的数组形式表示,类别标签集以列表的形式表示。
接下来是一个有4个参数的分类函数classify0(inX,dataSet,labels,k):
inX表示待分类的输入特征向量,
dataSet为样本集的特征,
labels为样本集对应每一个样本的分类标签,
k为选择最近距离的样本的数目。
其中dataSet和labels由creatDataSet()函数返回。
★dataSetSize = dataSet.shape[0]
求出样本集的行数,即样本个数,也是分类标签labels列表里元素的个数。
shape用于返回一个矩阵或数组的大小,返回的是一个元组,即(行数,列数)。如下:
>>> import kNN
>>> dataSet,labels=kNN.creatDataSet()
>>> dataSet.shape
(4, 2)
>>> dataSet
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>> dataSet.shape
(4, 2)
>>> dataSet.shape[0]
4
>>> dataSet.shape[1]
2
>>> type(dataSet.shape)
<class 'tuple'>
故这里,
shape[0]即得到shape元组的第一个元素,dataSet的行数;
shape[1]即得到shape元组的第二个元素,dataSet的列数;
当有n个特征时,欧式距离
由于这里只有两个特征,故简化为
★diffMat = tile(inX,(dataSetSize,1)) - dataSet
用于构造输入特征值和样本集的差值矩阵,即每一行有两个元素,[(A0−Bi0),(A1−Bi1)],即输入样本的特征和第i个样本对应特征的差。
因为dataSet有多个样本,但inX只有一个,矩阵相减要求维数相同,故使用tile()函数,这里是将inX变为dataSetSize*1维的矩阵,每一行都是inX。
关于numpy库中tile()函数的用法,可参考
http://jingyan.baidu.com/article/219f4bf7da4d8dde442d389e.html
★
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
用于计算欧氏距离,先将差值矩阵的每一个元素平方,再按行求和,最后开方。
关于sum()函数,表示普通求和,sum(axis=1)表示每一行向量相加,sum(axis=0)表示每一列向量相加,如下:
>>> dataSet
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>> dataSet.sum()
4.1999999999999993
>>> dataSet.sum(axis=1)
array([ 2.1, 2. , 0. , 0.1])
>>> dataSet.sum(axis=0)
array([ 2. , 2.2])
★sortedDistIndicies = distances.argsort()
将输入特征与每个样本的欧式距离从小到大排序,返回的是样本在原欧式距离集中的序号。
接着初始化字典,用for循环处理最邻近的前k个样本,统计各类别出现的次数。
★classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
以第i+1邻近的样本的类别标签为key,该类别标签出现的次数为value将统计到的类别标签及出现次数写进字典,将该类别出现的次数加1。
关于字典的get()方法,因为voteIlabel是key,get(voteIlabel,0)表示字典按key查找,如果存在这个key,则返回这个key的value;如果当前没有这个key,则返回0。如下:
>>> dic1 = {'color':'red','size':18,3:'good'}
>>> dic1
{'color': 'red', 3: 'good', 'size': 18}
>>> dic1.get('color')
'red'
>>> dic1.get(3)
'good'
>>> dic1.get('size',0)
18
>>> dic1.get(4,0)
0
第一次统计到一个类别标签时,由于字典中无对应的key,就返回0,表示当前没有这个类别,之后加1;
不是第一次统计到这个类别标签时,则返回这个标签之前出现的次数,并在此基础上加1。
★sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
表示按字典的value进行从大到小排序。
第一个参数指定要排序的列表或者iterable,如果一个对象是iterable的,表示它可以被遍历;
《机器学习实战》中这一块的第一个参数使用的是classCount.iteritems(),用python3.0以后的版本会出现
错误:AttributeError: ‘dict’ object has no attribute ‘iteritems’
python3.0不再支持dict.iteritems(),好像不能使用iteritems,改成用items()程序就顺利通过了
具体可参考官方更新文档
第二个参数是一个函数,operator.itemgetter(1)表示按字典的第二项即value排序,而不是按key排序;
第三个参数为True表示从大到小排序。
关于Python中的sorted()函数以及operator.itemgetter()函数,可参考
★return sortedClassCount[0][0]
最后返回排序后字典中最大的value对应的key,即对新数据分类的类别。
四.运行结果
因为上述代码为一个模块,故首先要F5 run module,然后在command window中导入该模块,再调用creatDataSet()创建样本集,此时可以查看一下样本是否创建成功,之后就可以调用classify0对新的输入进行分类了。
>>> import kNN
>>> dataSet,labels=kNN.creatDataSet()
>>> dataSet
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>> labels
['A', 'A', 'B', 'B']
>>> kNN.classify0([0,0],dataSet,labels,3)
'B'
《机器学习实战》——k-近邻算法Python实现问题记录(转载)的更多相关文章
- 机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- k近邻算法python实现 -- 《机器学习实战》
''' Created on Nov 06, 2017 kNN: k Nearest Neighbors Input: inX: vector to compare to existing datas ...
- 机器学习之K近邻算法
K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 【机器学习】K近邻算法——多分类问题
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
随机推荐
- luogu P1122 最大子树和
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- POJ 3680 Intervals(费用流+负权优化)
[题目链接] http://poj.org/problem?id=3680 [题目大意] 有N个带权重的区间,现在要从中选取一些区间, 要求任意点都不被超过K个区间所覆盖,请最大化总的区间权重. [题 ...
- Map泛型集合-显示企鹅信息
package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...
- 代理模式(Proxy)--动态代理(JDK)
在是上一篇博客中实现了静态代理. 在上篇的结尾提到了一个问题: 思考:如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢? 这篇博客就来解决这个问题: 解决这类问题需要用到动态代理技术,实 ...
- linux-网络监控命令-netstat初级
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- A Beginner’s Guide to the OUTPUT Clause in SQL Server
原文 A Beginner’s Guide to the OUTPUT Clause in SQL Server T-SQL supports the OUTPUT clause after the ...
- 在Ubuntu Server 中安装图形用户界面
使用ubuntu server安装lamp主机非常的方便,只要在安装系统的步骤中选择就是了 .但是很多时候我需要在图形界面下管理主机更加方便.今天的教程就是教大家安装图形界面. 首先你需要确定你的源文 ...
- 使用 SVG 来实现波浪 (wave) 动画效果
如下图所示的波浪动画效果,实现方法有很多,比如CSS或者是js等方法都可以实现.不过,要是使用SVG来实现的,我觉得比其它两种方法都要简单.这篇文章就来讲讲使用SVG来实现类似这样的波浪动画效果是多么 ...
- jquery的attr和prop区别之实例
对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. html文件 <tr> <th>& ...
- Swift入门(一)——基本的语法
近期開始学习swift.把学习的过程和总结整理成一个系列.方便日后回想总结. 基本的语法 基础语法 swift中每一行结束后不须要加分号.多个语句在同一行内须要用分好隔开 //表示凝视.或者用/* - ...