python之KNN算法的简单实现

时间:2021-02-03 21:24:49

KNN算法又称k近邻分类(k-nearest neighbor classification)算法。它是一种有监督学习,它是根据不同特征值之间的距离来进行分类的一种简单的机器学习方法。

算法介绍网上很多,我也是参考网上的描述,下面有一个python实现的简单knn算法

大体描述:
事先有样本数据,每个数据都有标签,然后拿一个未知样本,让程序判断它属于什么标签类别。

基本思想就是:
根据未知样本的分布,计算它到各个已知样本的距离,取距离未知样本为K的所有已知样本点并且对样本的标签进行统计排序,如果在这个K个范围标签数量最多的为A类型,那么就认为这个未知样本的分类为A

具体算法如下(参考的网上的,自己添加了注释):

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# @Time : 17/11/15 下午11:44
# @Author : lijie
# @File : myknn01.py

import operator
import numpy


##创建模拟样本和类别标签
def createDataSet():
sample = ([[175, 50], [160, 70], [170, 90], [165, 60], [165, 50], [180, 100], [180, 65]])
labels = ["s", "f", "f", "s", "s", "f", "s"]
return numpy.array(sample), labels


##knn
def samplePross(inX, dataSet, labels, k):
# 获取行数这里总共7行
# 打印出7
dataSetSize = dataSet.shape[0]

# 将需要分类的数据纵向增加7行和样本数据做减法
# [[5 20]
# [20 0]
# [10 -20]
# [15 10]
# [15 20]
# [0 -30]
# [0 5]]
diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet

# 对上面的矩阵内部的所有数做平方运算
# [[25 400]
# [400 0]
# [100 400]
# [225 100]
# [225 400]
# [0 900]
# [0 25]]
sqDiffMat = diffMat ** 2

# 对上一行代码返回的矩阵做横向相加
# [425 400 500 325 625 900 25]
sqDistances = sqDiffMat.sum(axis=1)

# 对上面的一位矩阵所有元素做开平方根
# [20.61552813 20 22.36067977 18.02775638 25 30 5]
distances = sqDistances ** 0.5

# 对距离进行参数排序从小到大的下标
# [6 3 1 0 2 4 5]
sortedDistIndicies = distances.argsort()

classCount = {}
for i in range(k):

#取出来最近的k个值
voteIlabel = labels[sortedDistIndicies[i]]

#当字典classCount有标签就取出标签加1 没有就为0 然后再放回
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

#对上面已经计算完成的classCount的value排序(key=operator.itemgetter(1)表示取map的value)
# classCount.iteritems()为sorted函数参数需要的迭代器,
#默认从小到大 reverse=True 即从大到小
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

#返回出现次数最多的一个label
return sortedClassCount[0][0]


# 分类测试
sample, labels = createDataSet()
print samplePross([180, 70], sample, labels, 3)