Python实战之KNN实现,python实战knn

作者: 网络编程  发布:2019-09-03

Python实战之KNN实现,python实战knn

Python实战之KNN实现

  用Python来实现K近邻分类算法(KNN)已经是一个老生常谈的问题,网上也已经有诸多资料,不过这里我还是决定记录一下自己的学习心得。

  1、配置numpy库

  numpy库是Python用于矩阵运算的第三方库,大多数数学运算都会依赖这个库来进行,关于numpy库的配置参见:Python配置第三方库Numpy和matplotlib的曲折之路,配置完成后将numpy库整体导入到当前工程中。

  2、准备训练样本

  这里简单的构造四个点并配以对应标签作为KNN的训练样本:

# ====================创建训练样本====================
def createdataset():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'B', 'C', 'D']
    return group, labels

  这里有一个小细节,就是通过array()函数老构造并初始化numpy的矩阵对象时,要保证只有一个参数,因此在代码中需要将参数用中括号括起来,像下面这种调用方式是不合法的:

group = array([1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1])

  3、创建分类函数

  K近邻算法在分类时一般是根据欧氏距离进行分类的,因此需要将输入的数据与训练数据在各个维度上相减再平方求和,再开方,如下:

# ====================欧氏距离分类====================
def classify(Inx, Dataset, labels, k):
    DataSetSize = Dataset.shape[0]  # 获取数据的行数,shape[1]位列数
    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset
    SqDiffMat = diffmat**2
    SqDistances = SqDiffMat.sum(axis=1)
    Distance = SqDistances**0.5
    SortedDistanceIndicies = Distance.argsort()
    ClassCount = {}

  这里tile()函数是numpy的矩阵扩展函数,比如说这个例子中训练样本有四个二维坐标点,对于输入样本(一个二维坐标点),需要将其先扩展为一个4行1列的矩阵,然后在进行矩阵减法,在平法求和,再开平方算距离。计算完距离之后,调用矩阵对象的排序成员函数argsort()对距离进行升序排序。在这里介绍一个Pycharm查看源码生命的小技巧:加入在编写这段程序的时候我们并不确定argsort()是否为array对象的成员函数,我们选中这个函数然后 右键 -> Go to -> Declaration,这样就会跳转到argsort()函数的声明代码片中,通过查看代码的从属关系能够确认array类中确实包含这个成员函数,调用没有问题:

图片 1

  对距离排序之后,接下来就根据前K个最小距离值所对应的标签来判断当前样本属于哪一类:

    for i in range(k):
        VoteiLabel = labels[SortedDistanceIndicies[i]]
        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1
    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)

Python实战之KNN实现

 

  用Python来实现K近邻分类算法(KNN)已经是一个老生常谈的问题,网上也已经有诸多资料,不过这里我还是决定记录一下自己的学习心得。

  1、配置numpy库

  numpy库是Python用于矩阵运算的第三方库,大多数数学运算都会依赖这个库来进行,关于numpy库的配置参见:Python配置第三方库Numpy和matplotlib的曲折之路,配置完成后将numpy库整体导入到当前工程中。

  2、准备训练样本

  这里简单的构造四个点并配以对应标签作为KNN的训练样本:

# ====================创建训练样本====================
def createdataset():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'B', 'C', 'D']
    return group, labels

  这里有一个小细节,就是通过array()函数老构造并初始化numpy的矩阵对象时,要保证只有一个参数,因此在代码中需要将参数用中括号括起来,像下面这种调用方式是不合法的:

group = array([1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1])

  3、创建分类函数

  K近邻算法在分类时一般是根据欧氏距离进行分类的,因此需要将输入的数据与训练数据在各个维度上相减再平方求和,再开方,如下:

# ====================欧氏距离分类====================
def classify(Inx, Dataset, labels, k):
    DataSetSize = Dataset.shape[0]  # 获取数据的行数,shape[1]位列数
    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset
    SqDiffMat = diffmat**2
    SqDistances = SqDiffMat.sum(axis=1)
    Distance = SqDistances**0.5
    SortedDistanceIndicies = Distance.argsort()
    ClassCount = {}

  这里tile()函数是numpy的矩阵扩展函数,比如说这个例子中训练样本有四个二维坐标点,对于输入样本(一个二维坐标点),需要将其先扩展为一个4行1列的矩阵,然后在进行矩阵减法,在平法求和,再开平方算距离。计算完距离之后,调用矩阵对象的排序成员函数argsort()对距离进行升序排序。在这里介绍一个Pycharm查看源码生命的小技巧:加入在编写这段程序的时候我们并不确定argsort()是否为array对象的成员函数,我们选中这个函数然后 右键 -> Go to -> Declaration,这样就会跳转到argsort()函数的声明代码片中,通过查看代码的从属关系能够确认array类中确实包含这个成员函数,调用没有问题:

图片 2

  对距离排序之后,接下来就根据前K个最小距离值所对应的标签来判断当前样本属于哪一类:

    for i in range(k):
        VoteiLabel = labels[SortedDistanceIndicies[i]]
        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1
    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)

  这里有一个小问题就是在Python2中获取字典元素使用的是dict.iteritems()成员函数,而在Python3中改为dict.items()函数。“key

operator.itemgetter(1)”的意思是指定函数针对字典中第二维元素进行排序,注意这里需要在之前导入符号库operator。这里是通过记录前K个距离最下值中每类标签出现的次数来判决测试样本的归属。

  4、测试

  这里给出完整的KNN测试代码:

# coding: utf-8
from numpy import *
import operator


# ====================创建训练样本====================
def createdataset():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'B', 'C', 'D']
    return group, labels

# ====================欧氏距离分类====================
def classify(Inx, Dataset, labels, k):
    DataSetSize = Dataset.shape[0]  # 获取数据的行数,shape[1]位列数
    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset
    SqDiffMat = diffmat**2
    SqDistances = SqDiffMat.sum(axis=1)
    Distance = SqDistances**0.5
    SortedDistanceIndicies = Distance.argsort()
    ClassCount = {}
    for i in range(k):
        VoteiLabel = labels[SortedDistanceIndicies[i]]
        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1
    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)
    return SortedClassCount[0][0]

Groups, Labels = createdataset()
Result = classify([0, 0], Groups, Labels, 1)
print(Result)

  运行代码,程序答应结果“C”。这里需要提一点的就是对于单训练样本(每类只有一个训练样本)的分类问题,KNN的K值应该设定为1。

用Python来实现K近邻分类算法(KNN)已经是一个老生常谈的问题,网上也已经有诸多资料,不过这里我还是决定记录一下...

  这里有一个小问题就是在Python2中获取字典元素使用的是dict.iteritems()成员函数,而在Python3中改为dict.items()函数。“key

operator.itemgetter(1)”的意思是指定函数针对字典中第二维元素进行排序,注意这里需要在之前导入符号库operator。这里是通过记录前K个距离最下值中每类标签出现的次数来判决测试样本的归属。

  4、测试

  这里给出完整的KNN测试代码:

# coding: utf-8
from numpy import *
import operator


# ====================创建训练样本====================
def createdataset():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'B', 'C', 'D']
    return group, labels

# ====================欧氏距离分类====================
def classify(Inx, Dataset, labels, k):
    DataSetSize = Dataset.shape[0]  # 获取数据的行数,shape[1]位列数
    diffmat = tile(Inx, (DataSetSize, 1)) - Dataset
    SqDiffMat = diffmat**2
    SqDistances = SqDiffMat.sum(axis=1)
    Distance = SqDistances**0.5
    SortedDistanceIndicies = Distance.argsort()
    ClassCount = {}
    for i in range(k):
        VoteiLabel = labels[SortedDistanceIndicies[i]]
        ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1
    SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True)
    return SortedClassCount[0][0]

Groups, Labels = createdataset()
Result = classify([0, 0], Groups, Labels, 1)
print(Result)

  运行代码,程序答应结果“C”。这里需要提一点的就是对于单训练样本(每类只有一个训练样本)的分类问题,KNN的K值应该设定为1。

QQ群290551701 聚集很多互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

Python实战之KNN实现 用Python来实现K近邻分类算法(KNN)已经是一个老生常谈的问题,网上也已经有诸多资料...

本文由王中王开奖结果发布于网络编程,转载请注明出处:Python实战之KNN实现,python实战knn

关键词:

上一篇:没有了
下一篇:没有了