欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[1] python 实现简单KNN

程序员文章站 2022-05-04 10:15:35
KNN基本步骤:计算与已知数据的距离,选择k个最近距离的数据,看这k个数据的标签最多属于什么类,预测未知数据的分类 1、新建一个KNN.py模块 需要使用numpy 2. 向模块添加已知的数据和标签 3.对未知数据的分类 4.测试一下这个模型 结果是B 也可以测试其他数据;这是最简单的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