[1] python 实现简单KNN
Posted mzhourr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[1] python 实现简单KNN相关的知识,希望对你有一定的参考价值。
KNN基本步骤:计算与已知数据的距离,选择k个最近距离的数据,看这k个数据的标签最多属于什么类,预测未知数据的分类
1、新建一个KNN.py模块
需要使用numpy
from numpy import * import operator
2. 向模块添加已知的数据和标签
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
3.对未知数据的分类
def classify0(inX, dataset,labels,k): # 计算输入数据和已有所有数据的距离 dataSetSize=dataset.shape[0] diffMat=tile(inX,(dataSetSize,1))-dataset sqDiffMat=diffMat**2 sqDistances=sqDiffMat.sum(axis=1) #没有axis参数表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加 distances=sqDistances**0.5 #排序 sortedDistIndex=distances.argsort() #argsort将数据从小到大排列,并返回其索引值 # 选择距离最小的k个点 classCount={} #字典类型 for i in range(k): votelabel=labels[sortedDistIndex[i]] classCount[votelabel]=classCount.get(votelabel,0)+1 sortedClasscount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClasscount[0][0]
4.测试一下这个模型
import KNN group,labels=KNN.createDataSet() newlabel=KNN.classify0([0,0],group,labels,3) print(newlabel)
结果是B
也可以测试其他数据;这是最简单的KNN例子,参照机器学习实战;
主要是为了自己理解和记忆(新手入门)
其中,关于python的一些用法,记录在此,方便查阅
- shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。它的输入参数可以使一个整数表示维度,也可以是一个矩阵。
输入一个数,返回空;可以快速读取一个数组的形状;可以只读取一维的长度;
shape(3) Out[4]: () e=eye(3) e Out[6]: array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) e.shape Out[7]: (3, 3) e.shape[0] Out[8]: 3
- tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组
-
a=[0,1,2] b=tile(a,2) b Out[12]: array([0, 1, 2, 0, 1, 2]) c=tile(a,(1,2)) c Out[14]: array([[0, 1, 2, 0, 1, 2]]) d=tile(a,(3,1)) d Out[16]: array([[0, 1, 2], [0, 1, 2], [0, 1, 2]])
- sum
-
sum(iterable[, start])
- iterable -- 可迭代对象,如列表。
- start -- 指定相加的参数,如果没有设置这个值,默认为0
- .sum
aa=array([[0,1,2],[3,4,5]]); aa.sum() Out[22]: 15 aa.sum(axis=0) Out[23]: array([3, 5, 7]) aa.sum(axis=1) Out[24]: array([ 3, 12])
默认所有数相加,axis=0,列相加;axis=1,行相加。
- argsort
argsort(a, axis=-1, kind=\'quicksort\', order=None)
具体实例可参见:https://blog.csdn.net/maoersong/article/details/21875705
a是需要排序的数组,返回的是索引值
distance=array([0.3,0.5,0.8,0.4]) index=distance.argsort() index Out[27]: array([0, 3, 1, 2], dtype=int64)
aa=array([[0,1,2],[3,4,5]]); x=aa.argsort(axis=0) x Out[30]: array([[0, 0, 0], [1, 1, 1]], dtype=int64) x=aa.argsort(axis=1) x Out[32]: array([[0, 1, 2], [0, 1, 2]], dtype=int64)
axis=0 按列;axis=1 按行;
- 字典类型
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
dict = {\'a\': 1, \'b\': 2, \'b\': \'3\'} dict[\'b\'] Out[34]: \'3\' dict Out[35]: {\'a\': 1, \'b\': \'3\'}
键一般是唯一的,如果重复会被后一个覆盖,但是值不是唯一的;
- sorted
详细讲解参见:http://www.cnblogs.com/woshitianma/p/3222989.html
sorted(iterable[,cmp,[,key[,reverse=True]]])
students = [(\'john\', \'A\', 15), (\'jane\', \'B\', 12), (\'dave\', \'B\', 10),] sorted(students, key=lambda student : student[2]) Out[42]: [(\'dave\', \'B\', 10), (\'jane\', \'B\', 12), (\'john\', \'A\', 15)] from operator import itemgetter, attrgetter sorted(students, key=itemgetter(2)) Out[44]: [(\'dave\', \'B\', 10), (\'jane\', \'B\', 12), (\'john\', \'A\', 15)] sorted(students, key=itemgetter(1,2)) Out[45]: [(\'john\', \'A\', 15), (\'dave\', \'B\', 10), (\'jane\', \'B\', 12)]
对字典排序,返回list,不再是字典
d = {\'data1\':3, \'data2\':1, \'data3\':2, \'data4\':4} sorted(d.items(), key=itemgetter(1), reverse=True) Out[47]: [(\'data4\', 4), (\'data1\', 3), (\'data3\', 2), (\'data2\', 1)] sorted(d.items(), key=itemgetter(1)) Out[48]: [(\'data2\', 1), (\'data3\', 2), (\'data1\', 3), (\'data4\', 4)]
- items
dict = {\'Google\': \'www.google.com\', \'Runoob\': \'www.runoob.com\', \'taobao\': \'www.taobao.com\'} dict.items() Out[39]: dict_items([(\'Google\', \'www.google.com\'), (\'Runoob\', \'www.runoob.com\'), (\'taobao\', \'www.taobao.com\')])
Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。
新版本不再使用iteritems
以上是关于[1] python 实现简单KNN的主要内容,如果未能解决你的问题,请参考以下文章